Zabezpieczanie ruchu między zasobnikami przy użyciu zasad sieciowych w usłudze Azure Kubernetes Service (AKS)

W przypadku uruchamiania nowoczesnych aplikacji opartych na mikrousługach na platformie Kubernetes często chcesz kontrolować, które składniki mogą komunikować się ze sobą. Zasada najmniejszych uprawnień powinna być stosowana do sposobu, w jaki ruch może przepływać między zasobnikami w klastrze Azure Kubernetes Service (AKS). Załóżmy, że prawdopodobnie chcesz zablokować ruch bezpośrednio do aplikacji zaplecza. Funkcja zasady sieci w usłudze Kubernetes umożliwia definiowanie reguł ruchu przychodzącego i wychodzącego między zasobnikami w klastrze.

W tym artykule pokazano, jak zainstalować aparat zasad sieciowych i utworzyć zasady sieciowe Kubernetes w celu kontrolowania przepływu ruchu między zasobnikami w usłudze AKS. Zasady sieciowe mogą być używane w przypadku węzłów i zasobników opartych na systemie Linux lub Windows w usłudze AKS.

Zanim rozpoczniesz

Potrzebujesz interfejsu wiersza polecenia platformy Azure w wersji 2.0.61 lub nowszej, zainstalowanej i skonfigurowanej. Uruchom polecenie az --version, aby dowiedzieć się, jaka wersja jest używana. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

Omówienie zasad sieciowych

Wszystkie zasobniki w klastrze usługi AKS mogą domyślnie wysyłać i odbierać ruch bez ograniczeń. Aby zwiększyć bezpieczeństwo, można zdefiniować reguły kontrolujące przepływ ruchu. Aplikacje zaplecza są często widoczne tylko dla wymaganych usług frontonu, na przykład. Lub składniki bazy danych są dostępne tylko dla warstw aplikacji, które się z nimi łączą.

Zasady sieciowe to specyfikacja platformy Kubernetes, która definiuje zasady dostępu do komunikacji między zasobnikami. Korzystając z zasad sieciowych, należy zdefiniować uporządkowany zestaw reguł do wysyłania i odbierania ruchu oraz stosować je do kolekcji zasobników pasujących do co najmniej jednego selektora etykiet.

Te reguły zasad sieciowych są definiowane jako manifesty YAML. Zasady sieci można uwzględnić w ramach szerszego manifestu, który tworzy również wdrożenie lub usługę.

Opcje zasad sieciowych w usłudze AKS

Platforma Azure oferuje dwa sposoby implementowania zasad sieciowych. Podczas tworzenia klastra usługi AKS należy wybrać opcję Zasady sieciowe. Po utworzeniu klastra opcji zasad nie można już zmienić:

  • Własna implementacja platformy Azure o nazwie Azure Network Policy Manager.
  • Calico Network Policies, sieć open source i rozwiązanie zabezpieczeń sieci założone przez Tigera.

Usługa Azure Network Policy Manager dla systemu Linux używa tabel IPTable systemu Linux i usługi Azure Network Policy Manager dla systemu Windows, używa zasad ACLPolicie usługi sieci hosta (HNS), aby wymusić określone zasady. Zasady są tłumaczone na zestawy dozwolonych i niedozwolonych par adresów IP. Pary te są następnie programowane jako reguły filtra IPTable/HNS ACLPolicy.

Różnice między usługą Azure Network Policy Manager i zasadami sieci Calico oraz ich możliwościami

Możliwość Azure Network Policy Manager Zasady sieci Calico
Obsługiwane platformy Linux, Windows Server 2022 Linux, Windows Server 2019 i 2022
Obsługiwane opcje sieci Azure CNI Azure CNI (Linux, Windows Server 2019 i 2022) i kubenet (Linux)
Zgodność ze specyfikacją platformy Kubernetes Obsługiwane wszystkie typy zasad Obsługiwane wszystkie typy zasad
Dodatkowe funkcje Brak Rozszerzony model zasad składający się z globalnych zasad sieciowych, globalnego zestawu sieci i punktu końcowego hosta. Aby uzyskać więcej informacji na temat zarządzania tymi rozszerzonymi funkcjami za pomocą interfejsu calicoctl wiersza polecenia, zobacz informacje o użytkownikach calicoctl.
Pomoc techniczna Obsługiwane przez zespół ds. pomoc techniczna platformy Azure i inżynierów Wsparcie społeczności Calico. Aby uzyskać więcej informacji na temat dodatkowej płatnej pomocy technicznej, zobacz Opcje pomocy technicznej programu Project Calico.
Rejestrowanie Dzienniki dostępne za pomocą polecenia kubectl log -n kube-system <network-policy-pod> Aby uzyskać więcej informacji, zobacz Dzienniki składników Calico

Ograniczenia

Usługa Azure Network Policy Manager nie obsługuje protokołu IPv6. W przeciwnym razie usługa Azure Network Policy Manager w pełni obsługuje specyfikację zasad sieciowych w systemie Linux.

  • W systemie Windows usługa Azure Network Policy Manager nie obsługuje następujących elementów:
    • nazwane porty
    • Protokół SCTP
    • negatywna etykieta dopasowania lub selektory przestrzeni nazw (np. wszystkie etykiety z wyjątkiem "debug=true")
    • Bloki CIDR "z wyjątkiem" (CIDR z wyjątkami)

Uwaga

  • Dzienniki zasobników usługi Azure Network Policy Manager rejestrują błąd w przypadku utworzenia nieobsługiwanych zasad.

Skalowanie

W usłudze Azure Network Policy Manager dla systemu Linux nie zalecamy skalowania poza 250 węzłami i 20 20 tys. zasobników. Jeśli próbujesz skalować poza te limity, może wystąpić awaria braku pamięci (OOM). Aby zwiększyć limit pamięci, skontaktuj się z nami w witrynie aks-can-github.

Tworzenie klastra usługi AKS i włączanie zasad sieciowych

Aby wyświetlić zasady sieciowe w działaniu, utwórzmy klaster usługi AKS, który obsługuje zasady sieciowe, a następnie pracujmy nad dodawaniem zasad.

Ważne

Funkcję zasad sieciowych można włączyć tylko po utworzeniu klastra. Nie można włączyć zasad sieciowych w istniejącym klastrze usługi AKS.

Aby użyć usługi Azure Network Policy Manager, należy użyć wtyczki usługi Azure CNI. Zasady sieci Calico mogą być używane z tą samą wtyczką usługi Azure CNI lub wtyczką Kubenet CNI.

Poniższy przykładowy skrypt:

  • Tworzy klaster usługi AKS z tożsamością przypisaną przez system i włącza zasady sieciowe przy użyciu usługi Azure Network Policy Manager. Aby zamiast tego użyć narzędzia Calico jako opcji Zasady sieciowe, użyj parametru --network-policy calico . Uwaga: Calico może być używany z elementem --network-plugin azure lub --network-plugin kubenet.

Zamiast używać tożsamości przypisanej przez system, można również użyć tożsamości przypisanej przez użytkownika. Aby uzyskać więcej informacji, zobacz Używanie tożsamości zarządzanych.

Tworzenie klastra usługi AKS z włączonym programem Azure Network Policy Manager — tylko system Linux

W tej sekcji będziemy pracować nad tworzeniem klastra z pulami węzłów systemu Linux i włączoną usługą Azure Network Policy Manager.

Aby rozpocząć, należy zastąpić wartości zmiennych $RESOURCE_GROUP_NAME i $CLUSTER_NAME .

$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$LOCATION=canadaeast

Utwórz klaster usługi AKS i określ azure dla elementu network-plugin i network-policy.

Użyj następującego polecenia, aby utworzyć klaster:

az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --network-plugin azure \
    --network-policy azure

Tworzenie klastra usługi AKS z włączoną usługą Azure Network Policy Manager — Windows Server 2022 (wersja zapoznawcza)

W tej sekcji będziemy pracować nad tworzeniem klastra z pulami węzłów systemu Windows i włączoną usługą Azure Network Policy Manager.

Uwaga

Usługa Azure Network Policy Manager z węzłami systemu Windows jest dostępna tylko w systemie Windows Server 2022.

Instalowanie rozszerzenia interfejsu wiersza polecenia platformy Azure w wersji zapoznawczej usługi aks

Ważne

Funkcje usługi AKS w wersji zapoznawczej są dostępne w oparciu o samoobsługę. Wersje zapoznawcze są udostępniane "jak jest" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną klienta w oparciu o najlepsze rozwiązania. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

Aby zainstalować rozszerzenie aks-preview, uruchom następujące polecenie:

az extension add --name aks-preview

Uruchom następujące polecenie, aby zaktualizować do najnowszej wersji wydanego rozszerzenia:

az extension update --name aks-preview

Rejestrowanie flagi funkcji "WindowsNetworkPolicyPreview"

Zarejestruj flagę WindowsNetworkPolicyPreview funkcji przy użyciu polecenia az feature register , jak pokazano w poniższym przykładzie:

az feature register --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"

Wyświetlenie stanu Zarejestrowane trwa kilka minut. Sprawdź stan rejestracji przy użyciu polecenia az feature show :

az feature show --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"

Po odzwierciedleniu stanu Zarejestrowane odśwież rejestrację dostawcy zasobów Microsoft.ContainerService przy użyciu polecenia az provider register :

az provider register --namespace Microsoft.ContainerService

Tworzenie klastra AKS

Teraz należy zastąpić wartości zmiennych $RESOURCE_GROUP_NAME, $CLUSTER_NAME i $WINDOWS_USERNAME .

$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$WINDOWS_USERNAME=myWindowsUserName
$LOCATION=canadaeast

Utwórz nazwę użytkownika do użycia jako poświadczenia administratora dla kontenerów systemu Windows Server w klastrze. Następujące polecenie wyświetla monit o nazwę użytkownika. Ustaw ją na $WINDOWS_USERNAME(pamiętaj, że polecenia w tym artykule są wprowadzane w powłoce powłoki BASH).

echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME

Użyj następującego polecenia, aby utworzyć klaster:

az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --windows-admin-username $WINDOWS_USERNAME \
    --network-plugin azure \
    --network-policy azure

Utworzenie klastra trwa kilka minut. Domyślnie klaster jest tworzony tylko z pulą węzłów systemu Linux. Jeśli chcesz użyć pul węzłów systemu Windows, możesz je dodać. Na przykład:

az aks nodepool add \
    --resource-group $RESOURCE_GROUP_NAME \
    --cluster-name $CLUSTER_NAME \
    --os-type Windows \
    --name npwin \
    --node-count 1

Tworzenie klastra usługi AKS dla zasad sieci Calico

Utwórz klaster usługi AKS i określ azure dla wtyczki sieciowej oraz calico dla zasad sieciowych. Użycie calico jako zasady sieci włącza sieć Calico zarówno w pulach węzłów systemu Linux, jak i Windows.

Jeśli planujesz dodawanie pul węzłów systemu Windows do klastra, dołącz windows-admin-username parametry i windows-admin-password spełniające wymagania dotyczące hasła systemu Windows Server.

Ważne

Obecnie korzystanie z zasad sieci Calico z węzłami systemu Windows jest dostępne w nowych klastrach przy użyciu platformy Kubernetes w wersji 1.20 lub nowszej z systemem Calico 3.17.2 i wymaga korzystania z sieci usługi Azure CNI. Węzły systemu Windows w klastrach usługi AKS z włączoną funkcją Calico mają również domyślnie włączoną funkcję Zwrot serwera bezpośredniego (DSR ).

W przypadku klastrów z tylko pulami węzłów systemu Linux z systemem Kubernetes 1.20 z wcześniejszymi wersjami calico zostanie automatycznie uaktualniona do wersji 3.17.2.

Utwórz nazwę użytkownika do użycia jako poświadczenia administratora dla kontenerów systemu Windows Server w klastrze. Następujące polecenie wyświetla monit o nazwę użytkownika. Ustaw ją na $WINDOWS_USERNAME(pamiętaj, że polecenia w tym artykule są wprowadzane w powłoce powłoki BASH).

echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --windows-admin-username $WINDOWS_USERNAME \
    --network-plugin azure \
    --network-policy calico

Utworzenie klastra trwa kilka minut. Domyślnie klaster jest tworzony tylko z pulą węzłów systemu Linux. Jeśli chcesz użyć pul węzłów systemu Windows, możesz je dodać. Na przykład:

az aks nodepool add \
    --resource-group $RESOURCE_GROUP_NAME \
    --cluster-name $CLUSTER_NAME \
    --os-type Windows \
    --name npwin \
    --node-count 1

Weryfikowanie konfiguracji zasad sieciowych

Gdy klaster jest gotowy, skonfiguruj kubectl połączenie z klastrem Kubernetes przy użyciu polecenia az aks get-credentials . To polecenie pobiera poświadczenia i konfiguruje interfejs wiersza polecenia platformy Kubernetes do ich używania:

az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME

Aby rozpocząć weryfikację zasad sieciowych, utworzymy przykładową aplikację i ustawimy reguły ruchu.

Najpierw utwórzmy przestrzeń nazw o nazwie demo , aby uruchomić przykładowe zasobniki:

kubectl create namespace demo

Teraz utworzymy dwa zasobniki w klastrze o nazwie klient i serwer.

Uwaga

Jeśli chcesz zaplanować klienta lub serwer w określonym węźle, dodaj następujący bit przed argumentem --command w poleceniu kubectl run tworzenia zasobnika:

--overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "linux|windows"}}}'

Utwórz zasobnik serwera . Ten zasobnik będzie służył na porcie TCP 80:

kubectl run server -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --labels="app=server" --port=80 --command -- /agnhost serve-hostname --tcp --http=false --port "80"

Utwórz zasobnik klienta . Poniższe polecenie spowoduje uruchomienie powłoki bash na zasobniku klienta:

kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --command -- bash

Teraz w osobnym oknie uruchom następujące polecenie, aby uzyskać adres IP serwera:

kubectl get pod --output=wide -n demo

Dane wyjściowe powinny wyglądać następująco:

NAME     READY   STATUS    RESTARTS   AGE   IP            NODE             NOMINATED NODE   READINESS GATES
server   1/1     Running   0          30s   10.224.0.72   akswin22000001   <none>           <none>

Testowanie łączności bez zasad sieciowych

W powłoce klienta zweryfikuj łączność z serwerem, wykonując następujące polecenie. Zastąp ciąg server-ip przez adres IP znaleziony w danych wyjściowych, wykonując poprzednie polecenie. Jeśli połączenie zakończy się pomyślnie, nie będzie żadnych danych wyjściowych:

/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp

Testowanie łączności z zasadami sieciowymi

Utwórz plik o nazwie demo-policy.yaml i wklej następujący manifest YAML, aby dodać zasady sieciowe:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: demo-policy
  namespace: demo
spec:
  podSelector:
    matchLabels:
      app: server
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: client
    ports:
    - port: 80
      protocol: TCP

Określ nazwę manifestu YAML i zastosuj go przy użyciu narzędzia kubectl apply:

kubectl apply –f demo-policy.yaml

Teraz w powłoce klienta sprawdź łączność z serwerem, wykonując następujące /agnhost polecenie:

/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp

Łączność z ruchem zostanie zablokowana, ponieważ serwer jest oznaczony etykietą app=server, ale klient nie jest oznaczony etykietą. Powyższe polecenie connect zwróci następujące dane wyjściowe:

TIMEOUT

Uruchom następujące polecenie, aby oznaczyć klienta i zweryfikować łączność z serwerem (dane wyjściowe nie powinny zwracać nic).

kubectl label pod client -n demo app=client

Czyszczenie zasobów

W tym artykule utworzyliśmy przestrzeń nazw i dwa zasobniki i zastosowano zasady sieciowe. Aby wyczyścić te zasoby, użyj polecenia kubectl delete i określ nazwę zasobu:

kubectl delete namespace demo

Następne kroki

Aby uzyskać więcej informacji na temat zasobów sieciowych, zobacz Pojęcia dotyczące sieci dla aplikacji w usłudze Azure Kubernetes Service (AKS).

Aby dowiedzieć się więcej na temat zasad, zobacz Zasady sieci kubernetes.