Zabezpieczanie ruchu między zasobnikami przy użyciu zasad sieciowych w usłudze 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 najniższych uprawnień powinna być stosowana do sposobu przepływu ruchu między zasobnikami w klastrze usługi Azure Kubernetes Service (AKS). Załóżmy, że chcesz zablokować ruch bezpośrednio do aplikacji zaplecza. Funkcja zasad sieciowych na platformie Kubernetes umożliwia definiowanie reguł dla ruchu przychodzącego i wychodzącego między zasobnikami w klastrze.
W tym artykule pokazano, jak zainstalować aparat zasad sieciowych i utworzyć zasady sieci Kubernetes w celu kontrolowania przepływu ruchu między zasobnikami w usłudze AKS. Zasady sieci mogą być używane dla węzłów i zasobników opartych na systemie Linux lub Windows w usłudze AKS.
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. W przypadku korzystania z zasad sieciowych należy zdefiniować uporządkowany zestaw reguł do wysyłania i odbierania ruchu. Reguły są stosowane do kolekcji zasobników pasujących do co najmniej jednego selektora etykiet.
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 udostępnia trzy aparaty zasad sieciowych do wymuszania zasad sieciowych:
- Cilium dla klastrów usługi AKS korzystających z usługi Azure CNI obsługiwanej przez cilium.
- Menedżer usługi Azure Network Policy Manager.
- Calico, sieć typu open source i rozwiązanie zabezpieczeń sieci założone przez Tigera.
Cilium to nasz zalecany aparat zasad sieciowych. Cilium wymusza zasady sieciowe ruchu przy użyciu filtru pakietów w Berkeley (BPF), który jest ogólnie bardziej wydajny niż "IPTables". Zobacz więcej szczegółów w dokumentacji usługi Azure CNI obsługiwanej przez cilium.
Aby wymusić określone zasady, program Azure Network Policy Manager dla systemu Linux używa tabel IPTable systemu Linux. Menedżer zasad sieciowych platformy Azure dla systemu Windows używa zasad ACL usługi sieci hosta (HNS). Zasady są tłumaczone na zestawy dozwolonych i niedozwolonych par adresów IP. Te pary są następnie programowane jako IPTable
HNS ACLPolicy
lub reguły filtrowania.
Różnice między aparatami zasad sieciowych: Cilium, Azure NPM i Calico
Możliwość | Menedżer zasad sieciowych platformy Azure | Perkal | Cilium |
---|---|---|---|
Obsługiwane platformy | Linux, Windows Server 2022 (wersja zapoznawcza). | Linux, Windows Server 2019 i 2022. | Linux. |
Obsługiwane opcje sieciowe | Azure Container Networking Interface (CNI). | Azure CNI (Linux, Windows Server 2019 i 2022) i kubenet (Linux). | Azure CNI. |
Zgodność ze specyfikacją platformy Kubernetes | Obsługiwane wszystkie typy zasad | Obsługiwane są wszystkie typy zasad. | Obsługiwane są wszystkie typy zasad. |
Inne 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 funkcjami rozszerzonymi przy użyciu interfejsu calicoctl wiersza polecenia, zobacz informacje o użytkownikach calicoctl. |
Brak. |
Pomoc techniczna | Obsługiwane przez zespół pomocy technicznej i inżynierów platformy Azure. | Obsługiwane przez zespół pomocy technicznej i inżynierów platformy Azure. | Obsługiwane przez zespół pomocy technicznej i inżynierów platformy Azure. |
Ograniczenia usługi Azure Network Policy Manager
Uwaga
W przypadku usługi Azure NPM dla systemu Linux nie zezwalamy na skalowanie ponad 250 węzłów i 20 000 zasobników. Jeśli próbujesz skalować poza te limity, mogą wystąpić błędy Braku pamięci (OOM ). Aby uzyskać lepszą skalowalność i obsługę protokołu IPv6, a jeśli istnieją następujące ograniczenia, zalecamy użycie lub uaktualnienie do usługi Azure CNI obsługiwanej przez cilium w celu używania modelu Cilium jako aparatu zasad sieciowych.
Usługa Azure NPM nie obsługuje protokołu IPv6. W przeciwnym razie w pełni obsługuje specyfikacje zasad sieciowych w systemie Linux.
W systemie Windows usługa Azure NPM nie obsługuje następujących funkcji specyfikacji zasad sieciowych:
- Nazwane porty.
- Stream Control Transmission Protocol (SCTP).
- Negatywna etykieta dopasowania lub selektory przestrzeni nazw. Na przykład wszystkie etykiety z wyjątkiem
debug=true
. except
bloki routingu międzydomenowego (CIDR, classless interdomain routing) (CIDR z wyjątkami).
Uwaga
W przypadku utworzenia nieobsługiwanych zasad sieciowych zasobnik usługi Azure Network Policy Manager rejestruje błąd.
Edytowanie/usuwanie zasad sieciowych
W niektórych rzadkich przypadkach istnieje szansa na trafienie stanu wyścigu, co może spowodować tymczasowe, nieoczekiwane połączenie dla nowych połączeń z zasobnikami na dowolnych węzłach, których dotyczy problem podczas edytowania lub usuwania zasad sieciowych "wystarczająco duży". Uderzenie w ten stan wyścigu nigdy nie ma wpływu na aktywne połączenia.
Jeśli ten stan wyścigu wystąpi w węźle, zasobnik azure NPM w tym węźle wchodzi w stan, w którym nie może zaktualizować reguł zabezpieczeń, co może prowadzić do nieoczekiwanej łączności dla nowych połączeń z zasobnikami/z zasobników na węźle, którego dotyczy problem. Aby rozwiązać ten problem, zasobnik usługi Azure NPM automatycznie uruchamia się ponownie ok. 15 sekund po wprowadzeniu tego stanu. Podczas ponownego uruchamiania usługi Azure NPM w węźle, na który ma to wpływ, usuwa wszystkie reguły zabezpieczeń, a następnie ponownie tworzy reguły zabezpieczeń dla wszystkich zasad sieciowych. Podczas ponownego stosowania wszystkich reguł zabezpieczeń istnieje prawdopodobieństwo tymczasowej, nieoczekiwanej łączności dla nowych połączeń do/z zasobników w węźle, na który ma to wpływ.
Aby ograniczyć prawdopodobieństwo osiągnięcia tego stanu wyścigu, można zmniejszyć rozmiar zasad sieciowych. Ten problem najprawdopodobniej występuje w przypadku zasad sieciowych z kilkoma ipBlock
sekcjami. Zasady sieciowe z czterema lub mniejszymi ipBlock
sekcjami są mniej prawdopodobne, aby napotkać problem.
Zanim rozpoczniesz
Potrzebny jest interfejs wiersza polecenia platformy Azure w wersji 2.0.61 lub nowszej, zainstalowany i skonfigurowany. 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.
Tworzenie klastra usługi AKS i włączanie zasad sieciowych
Aby wyświetlić zasady sieciowe w działaniu, należy utworzyć klaster usługi AKS, który obsługuje zasady sieciowe, a następnie pracować nad dodawaniem zasad.
Aby użyć usługi Azure Network Policy Manager, należy użyć wtyczki azure CNI. Calico może być używany z wtyczką azure CNI lub wtyczką CNI Kubenet.
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 menedżera usługi Azure Network Policy Manager.
Uwaga
Calico można używać z parametrami --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 menedżerem usługi Azure Network Policy Manager — tylko system Linux
W tej sekcji utworzysz klaster z pulami węzłów systemu Linux i włączonym menedżerem usługi Azure Network Policy Manager.
Aby rozpocząć, zastąp 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 parametrów network-plugin
i network-policy
.
Aby utworzyć klaster, użyj następującego polecenia:
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--network-plugin azure \
--network-policy azure \
--generate-ssh-keys
Tworzenie klastra usługi AKS z włączonym menedżerem usługi Azure Network Policy — Windows Server 2022 (wersja zapoznawcza)
W tej sekcji utworzysz klaster z pulami węzłów systemu Windows i włączonym menedżerem usługi Azure Network Policy Manager.
Uwaga
Menedżer zasad sieci platformy Azure z węzłami systemu Windows jest dostępny 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 na zasadzie samoobsługi. Wersje zapoznawcze są udostępniane w wersji "as is" 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ą dla klientów. 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ć aks-preview
rozszerzenie, uruchom następujące polecenie:
az extension add --name aks-preview
Aby zaktualizować do najnowszej wersji wydanego rozszerzenia, uruchom następujące polecenie:
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"
Gdy stan będzie odzwierciedlał wartość Zarejestrowano, odśwież rejestrację Microsoft.ContainerService
dostawcy zasobów przy użyciu polecenia az provider register :
az provider register --namespace Microsoft.ContainerService
Tworzenie klastra AKS
Teraz zastąp 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 podanie nazwy użytkownika. Ustaw go na $WINDOWS_USERNAME
wartość . 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
Aby utworzyć klaster, użyj następującego polecenia:
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 \
--generate-ssh-keys
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ć. Oto 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 z włączoną obsługą calico
Utwórz klaster usługi AKS i określ --network-plugin azure
wartości , i --network-policy calico
. Określanie --network-policy calico
włącza calico zarówno w pulach węzłów systemu Linux, jak i Windows.
Jeśli planujesz dodanie pul węzłów systemu Windows do klastra, uwzględnij 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 azure CNI. Węzły systemu Windows w klastrach usługi AKS z włączonym calico mają również domyślnie włączony pływający adres IP.
W przypadku klastrów z tylko pulami węzłów systemu Linux z uruchomionym rozwiązaniem Kubernetes 1.20 z wcześniejszymi wersjami calico automatycznie uaktualnia się 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 podanie nazwy użytkownika. Ustaw go na $WINDOWS_USERNAME
wartość . 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 \
--generate-ssh-keys
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
Instalowanie programu Azure Network Policy Manager lub Calico w istniejącym klastrze
Instalowanie programu Azure Network Policy Manager lub Calico w istniejących klastrach usługi AKS jest również obsługiwane.
Ostrzeżenie
Proces uaktualniania wyzwala ponowne obrazy każdej puli węzłów jednocześnie. Uaktualnienie każdej puli węzłów oddzielnie nie jest obsługiwane. Wszelkie zakłócenia w sieci klastra są podobne do uaktualnienia obrazu węzła lub uaktualnienia wersji platformy Kubernetes, w których każdy węzeł w puli węzłów jest ponownie obrazowany.
Przykładowe polecenie umożliwiające zainstalowanie menedżera usługi Azure Network Policy Manager:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy azure
Przykładowe polecenie instalacji Calico:
Ostrzeżenie
To ostrzeżenie dotyczy uaktualniania klastrów Kubenet z włączoną funkcją Calico do nakładki CNI platformy Azure z włączoną funkcją Calico.
- W klastrach Kubenet z włączonym calico calico jest używany zarówno jako aparat zasad CNI, jak i sieci.
- W klastrach CNI platformy Azure calico jest używane tylko w przypadku wymuszania zasad sieciowych, a nie jako CNI. Może to spowodować krótkie opóźnienie między uruchomieniem zasobnika a tym, kiedy calico zezwala na ruch wychodzący z zasobnika.
Zaleca się stosowanie cilium zamiast Calico, aby uniknąć tego problemu. Dowiedz się więcej o cilium w witrynie Azure CNI Powered by Cilium
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy calico
Uaktualnianie istniejącego klastra z zainstalowanym rozwiązaniem Azure NPM lub Calico do usługi Azure CNI obsługiwanej przez cilium
Aby uaktualnić istniejący klaster z zainstalowanym aparatem zasad sieciowych na platformie Azure CNI obsługiwanym przez cilium, zobacz Uaktualnianie istniejącego klastra do usługi Azure CNI obsługiwanej przez cilium
Weryfikowanie konfiguracji zasad sieciowych
Gdy klaster jest gotowy, skonfiguruj połączenie kubectl
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, należy utworzyć przykładową aplikację i ustawić reguły ruchu.
Najpierw utwórz przestrzeń nazw o nazwie demo
, aby uruchomić przykładowe zasobniki:
kubectl create namespace demo
Teraz utwórz dwa zasobniki w klastrze o nazwie client
i server
.
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 server
. Ten zasobnik 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 client
. Następujące polecenie uruchamia powłokę Bash na zasobniku client
:
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 uruchom następujące polecenie, aby zweryfikować łączność z serwerem. Zastąp server-ip
element przy użyciu adresu IP znalezionego w danych wyjściowych z uruchomienia poprzedniego polecenia. Jeśli połączenie zakończy się pomyślnie, nie ma żadnych danych wyjściowych.
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
Testowanie łączności z zasadami sieciowymi
Aby dodać zasady sieciowe, utwórz plik o nazwie demo-policy.yaml
i wklej następujący manifest YAML:
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, uruchamiając następujące /agnhost
polecenie:
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
Łączność z ruchem jest blokowana, ponieważ serwer jest oznaczony etykietą , ale klient nie jest oznaczony etykietą app=server
. Powyższe polecenie connect daje następujące dane wyjściowe:
TIMEOUT
Uruchom następujące polecenie, aby oznaczyć etykietę client
i zweryfikować łączność z serwerem. Dane wyjściowe nie powinny zwracać niczego.
kubectl label pod client -n demo app=client
Odinstalowywanie programu Azure Network Policy Manager lub Calico
Wymagania:
- Interfejs wiersza polecenia platformy Azure w wersji 2.63 lub nowszej
Uwaga
- Proces odinstalowywania nie powoduje usunięcia niestandardowych definicji zasobów (CRD) i zasobów niestandardowych (CRS) używanych przez Calico. Wszystkie te identyfikatory CRD i CRs mają nazwy kończące się ciągiem "projectcalico.org" lub "tigera.io". Te identyfikatory CRD i skojarzone odwołania CRS można usunąć ręcznie po pomyślnym odinstalowaniu Calico (usunięcie identyfikatorów CRD przed usunięciem calico przerywa działanie klastra).
- Uaktualnienie nie spowoduje usunięcia żadnych zasobów NetworkPolicy w klastrze, ale po odinstalowaniu tych zasad nie będą już wymuszane.
Ostrzeżenie
Proces uaktualniania wyzwala ponowne obrazy każdej puli węzłów jednocześnie. Uaktualnienie każdej puli węzłów oddzielnie nie jest obsługiwane. Wszelkie zakłócenia w sieci klastra są podobne do uaktualnienia obrazu węzła lub uaktualnienia wersji platformy Kubernetes, w których każdy węzeł w puli węzłów jest ponownie obrazowany.
Aby usunąć menedżera usługi Azure Network Policy Manager lub Calico z klastra, uruchom następujące polecenie:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy none
Czyszczenie zasobów
W tym artykule utworzono 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 platformy Kubernetes.
Azure Kubernetes Service