Kontrolowanie ruchu wychodzącego przy użyciu Azure Firewall w usłudze Azure Kubernetes Service (AKS)

Ten artykuł zawiera wskazówki dotyczące używania reguł sieci wychodzącej i nazw FQDN dla klastrów usługi AKS do kontrolowania ruchu wychodzącego przy użyciu Azure Firewall w usłudze AKS. Aby uprościć tę konfigurację, Azure Firewall udostępnia Azure Kubernetes Service (AzureKubernetesService) nazwę FQDN, która ogranicza ruch wychodzący z klastra usługi AKS. Ten artykuł zawiera również przykład konfigurowania publicznego ruchu przychodzącego za pośrednictwem zapory.

Uwaga

Tag nazwy FQDN zawiera wszystkie nazwy FQDN wymienione w regułach sieci wychodzącej i nazwy FQDN dla klastrów usługi AKS i są automatycznie aktualizowane.

W przypadku scenariuszy produkcyjnych zalecamy posiadanie co najmniej 20 adresów IP frontonu na Azure Firewall, aby uniknąć problemów z wyczerpaniem portów SNAT.

Poniższe informacje zawierają przykładową architekturę wdrożenia:

Zablokowana topologia

  • Publiczny ruch przychodzący jest zmuszony do przepływu przez filtry zapory
    • Węzły agenta usługi AKS są izolowane w dedykowanej podsieci
    • Azure Firewall jest wdrażana we własnej podsieci
    • Reguła DNAT tłumaczy publiczny adres IP zapory na adres IP frontonu modułu równoważenia obciążenia
  • Żądania wychodzące rozpoczynają się od węzłów agenta do wewnętrznego adresu IP Azure Firewall przy użyciu trasy zdefiniowanej przez użytkownika (UDR)
    • Żądania z węzłów agenta usługi AKS są zgodne z trasę zdefiniowaną przez użytkownika, która została umieszczona w podsieci, w której wdrożono klaster usługi AKS
    • Azure Firewall wychodzące z sieci wirtualnej z frontonu publicznego adresu IP
    • Dostęp do publicznego Internetu lub innych usług platformy Azure przepływa do i z adresu IP frontonu zapory
    • Dostęp do płaszczyzny sterowania usługi AKS może być chroniony przez autoryzowane zakresy adresów IP serwera interfejsu API, w tym publiczny adres IP frontonu zapory
  • Ruch wewnętrzny

Ustawianie konfiguracji przy użyciu zmiennych środowiskowych

Zdefiniuj zestaw zmiennych środowiskowych, które mają być używane podczas tworzenia zasobów.

PREFIX="aks-egress"
RG="${PREFIX}-rg"
LOC="eastus"
PLUGIN=azure
AKSNAME="${PREFIX}"
VNET_NAME="${PREFIX}-vnet"
AKSSUBNET_NAME="aks-subnet"
# DO NOT CHANGE FWSUBNET_NAME - This is currently a requirement for Azure Firewall.
FWSUBNET_NAME="AzureFirewallSubnet"
FWNAME="${PREFIX}-fw"
FWPUBLICIP_NAME="${PREFIX}-fwpublicip"
FWIPCONFIG_NAME="${PREFIX}-fwconfig"
FWROUTE_TABLE_NAME="${PREFIX}-fwrt"
FWROUTE_NAME="${PREFIX}-fwrn"
FWROUTE_NAME_INTERNET="${PREFIX}-fwinternet"

Tworzenie sieci wirtualnej z wieloma podsieciami

Aprowizuj sieć wirtualną z dwiema oddzielnymi podsieciami: jedną dla klastra i jedną dla zapory. Opcjonalnie możesz utworzyć go dla ruchu przychodzącego usługi wewnętrznej.

Pusta topologia sieci

  1. Utwórz grupę zasobów przy użyciu az group create polecenia .

    az group create --name $RG --location $LOC
    
  2. Utwórz sieć wirtualną z dwiema podsieciami do hostowania klastra usługi AKS i Azure Firewall przy użyciu az network vnet create poleceń i az network vnet subnet create .

    # Dedicated virtual network with AKS subnet
    az network vnet create \
        --resource-group $RG \
        --name $VNET_NAME \
        --location $LOC \
        --address-prefixes 10.42.0.0/16 \
        --subnet-name $AKSSUBNET_NAME \
        --subnet-prefix 10.42.1.0/24
    
    # Dedicated subnet for Azure Firewall (Firewall name can't be changed)
    az network vnet subnet create \
        --resource-group $RG \
        --vnet-name $VNET_NAME \
        --name $FWSUBNET_NAME \
        --address-prefix 10.42.2.0/24
    

Tworzenie i konfigurowanie Azure Firewall przy użyciu trasy zdefiniowanej przez użytkownika

Należy skonfigurować reguły ruchu przychodzącego i wychodzącego Azure Firewall. Głównym celem zapory jest umożliwienie organizacjom konfigurowania szczegółowych reguł ruchu przychodzącego i wychodzącego do i z klastra usługi AKS.

Ważne

Jeśli klaster lub aplikacja tworzy dużą liczbę połączeń wychodzących kierowanych do tego samego lub małego podzbioru miejsc docelowych, może być konieczne użycie większej liczby adresów IP frontonu zapory, aby uniknąć maksymalnego limitu portów na adres IP frontonu.

Aby uzyskać więcej informacji na temat tworzenia Azure Firewall z wieloma adresami IP, zobacz Tworzenie Azure Firewall z wieloma publicznymi adresami IP przy użyciu Bicep.

Zapora i trasa zdefiniowana przez użytkownika

  1. Utwórz zasób publicznego adresu IP standardowej jednostki SKU przy użyciu az network public-ip create polecenia . Ten zasób będzie używany jako adres frontonu Azure Firewall.

    az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
    
  2. Zarejestruj rozszerzenie interfejsu wiersza polecenia Azure Firewall w wersji zapoznawczej, aby utworzyć Azure Firewall przy użyciu az extension add polecenia .

    az extension add --name azure-firewall
    
  3. Utwórz Azure Firewall i włącz serwer proxy DNS przy użyciu az network firewall create polecenia i ustawienie wartości --enable-dns-proxy .true

    az network firewall create -g $RG -n $FWNAME -l $LOC --enable-dns-proxy true
    

Skonfigurowanie publicznego adresu IP Azure Firewall może potrwać kilka minut. Po uzyskaniu gotowości adres IP utworzony wcześniej można przypisać do frontonu zapory.

Uwaga

Aby korzystać z nazwy FQDN w regułach sieciowych, musimy włączyć serwer proxy DNS. Po włączeniu serwera proxy DNS zapora nasłuchuje na porcie 53 i przekazuje żądania DNS do serwera DNS określonego powyżej. Dzięki temu zapora może automatycznie tłumaczyć nazwę FQDN.

  1. Utwórz konfigurację adresu IP Azure Firewall przy użyciu az network firewall ip-config create polecenia .

    az network firewall ip-config create -g $RG -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
    
  2. Po pomyślnym zakończeniu poprzedniego polecenia zapisz adres IP frontonu zapory na potrzeby konfiguracji później.

    FWPUBLIC_IP=$(az network public-ip show -g $RG -n $FWPUBLICIP_NAME --query "ipAddress" -o tsv)
    FWPRIVATE_IP=$(az network firewall show -g $RG -n $FWNAME --query "ipConfigurations[0].privateIpAddress" -o tsv)
    

Uwaga

Jeśli używasz bezpiecznego dostępu do serwera interfejsu API usługi AKS z autoryzowanymi zakresami adresów IP, musisz dodać publiczny adres IP zapory do autoryzowanego zakresu adresów IP.

Tworzenie trasy zdefiniowanej przez użytkownika z przeskokiem do Azure Firewall

Platforma Azure automatycznie kieruje ruchem między podsieciami platformy Azure, sieciami wirtualnymi i sieciami lokalnymi. Jeśli chcesz zmienić domyślny routing platformy Azure, możesz utworzyć tabelę tras.

  1. Utwórz pustą tabelę tras, która ma być skojarzona z daną podsiecią az network route-table create za pomocą polecenia . Tabela tras zdefiniuje następny przeskok jako utworzony powyżej Azure Firewall. Każda podsieć może mieć skojarzoną ze sobą żadną lub jedną tabelę tras.

    az network route-table create -g $RG -l $LOC --name $FWROUTE_TABLE_NAME
    
  2. Utwórz trasy w tabeli tras dla podsieci przy użyciu az network route-table route create polecenia .

    az network route-table route create -g $RG --name $FWROUTE_NAME --route-table-name $FWROUTE_TABLE_NAME --address-prefix 0.0.0.0/0 --next-hop-type VirtualAppliance --next-hop-ip-address $FWPRIVATE_IP
    
    az network route-table route create -g $RG --name $FWROUTE_NAME_INTERNET --route-table-name $FWROUTE_TABLE_NAME --address-prefix $FWPUBLIC_IP/32 --next-hop-type Internet
    

Aby uzyskać informacje na temat zastępowania domyślnych tras systemowych platformy Azure lub dodawania dodatkowych tras do tabeli tras podsieci, zobacz dokumentację tabeli tras sieci wirtualnej.

Dodawanie reguł zapory

Uwaga

W przypadku aplikacji spoza przestrzeni nazw kube-system lub gatekeeper-system, które muszą komunikować się z serwerem interfejsu API, wymagana jest dodatkowa reguła sieci umożliwiająca komunikację TCP z portem 443 dla adresu IP serwera interfejsu API oprócz dodawania reguły aplikacji dla tagu fqdn-tag AzureKubernetesService .

W tej sekcji opisano trzy reguły sieci i regułę aplikacji, których można użyć do skonfigurowania zapory. Może być konieczne dostosowanie tych reguł na podstawie wdrożenia.

  • Pierwsza reguła sieci umożliwia dostęp do portu 9000 za pośrednictwem protokołu TCP.
  • Druga reguła sieci umożliwia dostęp do portu 1194 i 123 za pośrednictwem protokołu UDP. Jeśli wdrażasz na platformie Azure (Chiny) 21Vianet, zapoznaj się z regułami sieci wymaganymi przez platformę Azure (Chiny 21Vianet). Obie te reguły zezwalają tylko na ruch kierowany do trasy CIDR w regionie świadczenia usługi Azure w tym artykule, czyli Wschodnie stany USA.
  • Trzecia reguła sieci otwiera port 123 do ntp.ubuntu.com nazwy FQDN za pośrednictwem protokołu UDP. Dodanie nazwy FQDN jako reguły sieci jest jedną z określonych funkcji Azure Firewall, dlatego należy dostosować ją podczas korzystania z własnych opcji.
  • Reguła aplikacji obejmuje wszystkie potrzebne nazwy FQDN dostępne za pośrednictwem portu TCP 443 i portu 80.
  1. Utwórz reguły sieci przy az network firewall network-rule create użyciu polecenia .

    az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'apiudp' --protocols 'UDP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 1194 --action allow --priority 100
    
    az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'apitcp' --protocols 'TCP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 9000
    
    az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'time' --protocols 'UDP' --source-addresses '*' --destination-fqdns 'ntp.ubuntu.com' --destination-ports 123
    
  2. Utwórz regułę aplikacji przy użyciu az network firewall application-rule create polecenia .

    az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'fqdn' --source-addresses '*' --protocols 'http=80' 'https=443' --fqdn-tags "AzureKubernetesService" --action allow --priority 100
    

Aby dowiedzieć się więcej na temat Azure Firewall, zobacz dokumentację Azure Firewall.

Kojarzenie tabeli tras z usługą AKS

Aby skojarzyć klaster z zaporą, dedykowana podsieć dla podsieci klastra musi odwoływać się do tabeli tras utworzonej powyżej. az network vnet subnet update Użyj polecenia , aby skojarzyć tabelę tras z usługą AKS.

az network vnet subnet update -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --route-table $FWROUTE_TABLE_NAME

Wdrażanie klastra usługi AKS z typem wychodzącym trasy zdefiniowanej przez użytkownika w istniejącej sieci

Teraz możesz wdrożyć klaster usługi AKS w istniejącej sieci wirtualnej. Użyjesz typu ruchu wychodzącegouserDefinedRouting, co gwarantuje, że cały ruch wychodzący jest wymuszany przez zaporę i nie będą istnieć żadne inne ścieżki ruchu wychodzącego. Można również użyć typu ruchu wychodzącego.loadBalancer

aks-deploy

Docelowa podsieć do wdrożenia jest definiowana za pomocą zmiennej środowiskowej $SUBNETID. Ustaw wartość identyfikatora podsieci przy użyciu następującego polecenia:

SUBNETID=$(az network vnet subnet show -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --query id -o tsv)

Zdefiniujesz typ ruchu wychodzącego, aby użyć trasy zdefiniowanej przez użytkownika, która już istnieje w podsieci. Ta konfiguracja umożliwi usłudze AKS pominięcie konfiguracji i aprowizowania adresów IP dla modułu równoważenia obciążenia.

Porada

Do wdrożenia klastra można dodać dodatkowe funkcje, takie jak klastry prywatne.

Możesz dodać funkcję AKS dla autoryzowanych zakresów adresów IP serwera interfejsu API , aby ograniczyć dostęp serwera interfejsu API tylko do publicznego punktu końcowego zapory. Funkcja autoryzowanych zakresów adresów IP jest oznaczona na diagramie jako opcjonalna. Po włączeniu funkcji autoryzowanego zakresu adresów IP w celu ograniczenia dostępu do serwera interfejsu API narzędzia deweloperskie muszą używać serwera przesiadkowego z sieci wirtualnej zapory lub dodać wszystkie punkty końcowe deweloperów do autoryzowanego zakresu adresów IP.

Tworzenie klastra usługi AKS z tożsamościami przypisanymi przez system

Uwaga

Usługa AKS utworzy tożsamość kubelet przypisaną przez system w grupie zasobów węzła, jeśli nie określisz własnej tożsamości zarządzanej kubelet.

W przypadku routingu zdefiniowanego przez użytkownika tożsamość przypisana przez system obsługuje tylko wtyczkę sieci CNI.

Utwórz klaster usługi AKS przy użyciu przypisanej przez system tożsamości zarządzanej z wtyczką sieci CNI az aks create za pomocą polecenia .

az aks create -g $RG -n $AKSNAME -l $LOC \
  --node-count 3 \
  --network-plugin azure \
  --outbound-type userDefinedRouting \
  --vnet-subnet-id $SUBNETID \
  --api-server-authorized-ip-ranges $FWPUBLIC_IP

Tworzenie tożsamości przypisanych przez użytkownika

Jeśli nie masz tożsamości przypisanych przez użytkownika, wykonaj kroki opisane w tej sekcji. Jeśli masz już tożsamości przypisane przez użytkownika, przejdź do sekcji Tworzenie klastra usługi AKS z tożsamościami przypisanymi przez użytkownika.

  1. Utwórz tożsamość zarządzaną płaszczyzny sterowania przy użyciu az identity create polecenia .

    az identity create --name myIdentity --resource-group myResourceGroup
    

    Dane wyjściowe powinny przypominać następujące przykładowe dane wyjściowe:

     {                                  
       "clientId": "<client-id>",
        "clientSecretUrl": "<clientSecretUrl>",
        "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity", 
       "location": "westus2",
      "name": "myIdentity",
       "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
       "tags": {},
       "tenantId": "<tenant-id>",
        "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
     }
    
  2. Utwórz tożsamość zarządzaną kubelet przy az identity create użyciu polecenia .

    az identity create --name myKubeletIdentity --resource-group myResourceGroup
    

    Dane wyjściowe powinny przypominać następujące przykładowe dane wyjściowe:

    {
      "clientId": "<client-id>",
     "clientSecretUrl": "<clientSecretUrl>",
     "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity", 
      "location": "westus2",
      "name": "myKubeletIdentity",
     "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
     "tenantId": "<tenant-id>",
     "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

Uwaga

Jeśli tworzysz własną sieć wirtualną i tabelę tras, w której zasoby znajdują się poza grupą zasobów węzła procesu roboczego, interfejs wiersza polecenia automatycznie doda przypisanie roli. Jeśli używasz szablonu usługi ARM lub innego klienta, musisz użyć identyfikatora głównego tożsamości zarządzanej klastra do wykonania przypisania roli.

Tworzenie klastra usługi AKS przy użyciu tożsamości przypisanych przez użytkownika

Utwórz klaster usługi AKS z istniejącymi tożsamościami w podsieci za pomocą az aks create polecenia i podaj identyfikator zasobu tożsamości płaszczyzny sterowania kubelet tożsamości zarządzanej.

az aks create -g $RG -n $AKSNAME -l $LOC \
  --node-count 3 \
  --network-plugin kubenet \
  --outbound-type userDefinedRouting \
  --vnet-subnet-id $SUBNETID \
  --api-server-authorized-ip-ranges $FWPUBLIC_IP
  --enable-managed-identity \
  --assign-identity <identity-resource-id> \
  --assign-kubelet-identity <kubelet-identity-resource-id>

Włączanie dostępu dewelopera do serwera interfejsu API

Jeśli w poprzednim kroku użyto autoryzowanych zakresów adresów IP dla klastra, należy dodać adresy IP narzędzi deweloperskich do listy zatwierdzonych zakresów adresów IP klastra usługi AKS, aby uzyskać dostęp do serwera interfejsu API. Możesz również skonfigurować skrzynkę przesiadkową z wymaganymi narzędziami wewnątrz oddzielnej podsieci w sieci wirtualnej zapory.

  1. Pobierz swój adres IP przy użyciu następującego polecenia:

    CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
    
  2. Dodaj adres IP do zatwierdzonych zakresów przy użyciu az aks update polecenia .

    az aks update -g $RG -n $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
    
  3. Skonfiguruj kubectl , aby nawiązać połączenie z klastrem az aks get-credentials usługi AKS przy użyciu polecenia .

    az aks get-credentials -g $RG -n $AKSNAME
    

Wdrażanie usługi publicznej

Teraz możesz rozpocząć udostępnianie usług i wdrażanie aplikacji w tym klastrze. W tym przykładzie udostępnimy usługę publiczną, ale możesz również udostępnić usługę wewnętrzną przy użyciu wewnętrznego modułu równoważenia obciążenia.

DnaT usługi publicznej

  1. Skopiuj następujący kod YAML i zapisz go jako plik o nazwie example.yaml.

    # voting-storage-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: voting-storage
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: voting-storage
      template:
        metadata:
          labels:
            app: voting-storage
        spec:
          containers:
          - name: voting-storage
            image: mcr.microsoft.com/aks/samples/voting/storage:2.0
            args: ["--ignore-db-dir=lost+found"]
            resources:
              requests:
                cpu: 100m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            ports:
            - containerPort: 3306
              name: mysql
            volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: voting-storage-secret
                  key: MYSQL_ROOT_PASSWORD
            - name: MYSQL_USER
              valueFrom:
                secretKeyRef:
                  name: voting-storage-secret
                  key: MYSQL_USER
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: voting-storage-secret
                  key: MYSQL_PASSWORD
            - name: MYSQL_DATABASE
              valueFrom:
                secretKeyRef:
                  name: voting-storage-secret
                  key: MYSQL_DATABASE
          volumes:
          - name: mysql-persistent-storage
            persistentVolumeClaim:
              claimName: mysql-pv-claim
    ---
    # voting-storage-secret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: voting-storage-secret
    type: Opaque
    data:
      MYSQL_USER: ZGJ1c2Vy
      MYSQL_PASSWORD: UGFzc3dvcmQxMg==
      MYSQL_DATABASE: YXp1cmV2b3Rl
     MYSQL_ROOT_PASSWORD: UGFzc3dvcmQxMg==
    ---
    # voting-storage-pv-claim.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-pv-claim
    spec:
      accessModes:
      - ReadWriteOnce
    resources:
        requests:
          storage: 1Gi
    ---
    # voting-storage-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: voting-storage
      labels: 
        app: voting-storage
    spec:
      ports:
      - port: 3306
        name: mysql
      selector:
        app: voting-storage
    ---
    # voting-app-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: voting-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: voting-app
      template:
        metadata:
          labels:
            app: voting-app
        spec:
          containers:
          - name: voting-app
            image: mcr.microsoft.com/aks/samples/voting/app:2.0
            imagePullPolicy: Always
            ports:
           - containerPort: 8080
             name: http
            env:
            - name: MYSQL_HOST
              value: "voting-storage"
            - name: MYSQL_USER
              valueFrom:
                secretKeyRef:
                  name: voting-storage-secret
                  key: MYSQL_USER
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: voting-storage-secret
                  key: MYSQL_PASSWORD
            - name: MYSQL_DATABASE
              valueFrom:
                secretKeyRef:
                  name: voting-storage-secret
                  key: MYSQL_DATABASE
            - name: ANALYTICS_HOST
              value: "voting-analytics"
    ---
    # voting-app-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: voting-app
      labels: 
        app: voting-app
    spec:
      type: LoadBalancer
      ports:
      - port: 80
        targetPort: 8080
        name: http
      selector:
        app: voting-app
    ---
    # voting-analytics-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: voting-analytics
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: voting-analytics
          version: "2.0"
      template:
        metadata:
          labels:
            app: voting-analytics
            version: "2.0"
        spec:
          containers:
          - name: voting-analytics
            image: mcr.microsoft.com/aks/samples/voting/analytics:2.0
            imagePullPolicy: Always
            ports:
            - containerPort: 8080
              name: http
            env:
            - name: MYSQL_HOST
              value: "voting-storage"
            - name: MYSQL_USER
              valueFrom:
                secretKeyRef:
                  name: voting-storage-secret
                  key: MYSQL_USER
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: voting-storage-secret
                  key: MYSQL_PASSWORD
            - name: MYSQL_DATABASE
              valueFrom:
                secretKeyRef:
                  name: voting-storage-secret
                  key: MYSQL_DATABASE
    ---
    # voting-analytics-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
    name: voting-analytics
      labels: 
        app: voting-analytics
    spec:
      ports:
      - port: 8080
        name: http
      selector:
        app: voting-analytics
    
  2. Wdróż usługę kubectl apply przy użyciu polecenia .

    kubectl apply -f example.yaml
    

Dodawanie reguły DNAT do Azure Firewall

Ważne

Jeśli używasz Azure Firewall do ograniczania ruchu wychodzącego i tworzenia trasy zdefiniowanej przez użytkownika w celu wymuszenia całego ruchu wychodzącego, upewnij się, że utworzono odpowiednią regułę DNAT w Azure Firewall, aby poprawnie zezwalać na ruch przychodzący. Użycie Azure Firewall z trasą zdefiniowaną przez użytkownika powoduje przerwanie konfiguracji ruchu przychodzącego z powodu routingu asymetrycznego. Problem występuje, jeśli podsieć usługi AKS ma trasę domyślną, która przechodzi do prywatnego adresu IP zapory, ale używasz publicznego modułu równoważenia obciążenia — ruchu przychodzącego lub usługi Kubernetes typu loadBalancer. W takim przypadku przychodzący ruch modułu równoważenia obciążenia jest odbierany za pośrednictwem publicznego adresu IP, ale ścieżka powrotna przechodzi przez prywatny adres IP zapory. Ponieważ zapora jest stanowa, odrzuca zwracany pakiet, ponieważ zapora nie jest świadoma ustalonej sesji. Aby dowiedzieć się, jak zintegrować Azure Firewall z przychodzącym lub modułem równoważenia obciążenia usługi, zobacz Integrowanie Azure Firewall z usługą Azure usługa Load Balancer w warstwie Standardowa.

Aby skonfigurować łączność przychodzącą, należy napisać regułę DNAT do Azure Firewall. Aby przetestować łączność z klastrem, reguła jest zdefiniowana dla publicznego adresu IP frontonu zapory w celu kierowania do wewnętrznego adresu IP uwidocznionego przez usługę wewnętrzną. Adres docelowy można dostosować. Przetłumaczony adres musi być adresem IP wewnętrznego modułu równoważenia obciążenia. Przetłumaczony port musi być uwidoczniony port dla usługi Kubernetes. Należy również określić wewnętrzny adres IP przypisany do modułu równoważenia obciążenia utworzonego przez usługę Kubernetes.

  1. Pobierz wewnętrzny adres IP przypisany do modułu kubectl get services równoważenia obciążenia przy użyciu polecenia .

    kubectl get services
    

    Adres IP zostanie wyświetlony w kolumnie EXTERNAL-IP , jak pokazano w poniższych przykładowych danych wyjściowych:

    NAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    kubernetes         ClusterIP      10.41.0.1       <none>        443/TCP        10h
    voting-analytics   ClusterIP      10.41.88.129    <none>        8080/TCP       9m
    voting-app         LoadBalancer   10.41.185.82    20.39.18.6    80:32718/TCP   9m
    voting-storage     ClusterIP      10.41.221.201   <none>        3306/TCP       9m
    
  2. Pobierz adres IP usługi przy użyciu kubectl get svc voting-app polecenia .

     SERVICE_IP=$(kubectl get svc voting-app -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
    
  3. Dodaj regułę translatora adresów sieciowych az network firewall nat-rule create przy użyciu polecenia .

    az network firewall nat-rule create --collection-name exampleset --destination-addresses $FWPUBLIC_IP --destination-ports 80 --firewall-name $FWNAME --name inboundrule --protocols Any --resource-group $RG --source-addresses '*' --translated-port 80 --action Dnat --priority 100 --translated-address $SERVICE_IP
    

Weryfikowanie łączności

Przejdź do adresu IP frontonu Azure Firewall w przeglądarce, aby zweryfikować łączność.

Powinna zostać wyświetlona aplikacja do głosowania w usłudze AKS. W tym przykładzie publiczny adres IP zapory to 52.253.228.132.

Zrzut ekranu przedstawia aplikację A K S Voting z przyciskami kotów, psów i resetowania oraz sum.

Czyszczenie zasobów

Aby wyczyścić zasoby platformy Azure, usuń grupę zasobów usługi AKS przy użyciu az group delete polecenia .

az group delete -g $RG

Następne kroki

W tym artykule przedstawiono sposób zabezpieczania ruchu wychodzącego przy użyciu Azure Firewall. W razie potrzeby możesz uogólnić powyższe kroki, aby przekazać ruch do preferowanego rozwiązania wychodzącego zgodnie z dokumentacją Typ userDefinedRoute ruchu wychodzącego.