Dela via


Skydda trafik mellan poddar med hjälp av nätverksprinciper i AKS

När du kör moderna mikrotjänstbaserade program i Kubernetes vill du ofta styra vilka komponenter som kan kommunicera med varandra. Principen om minsta behörighet bör tillämpas på hur trafik kan flöda mellan poddar i ett AkS-kluster (Azure Kubernetes Service). Anta att du vill blockera trafik direkt till serverdelsprogram. Med nätverksprincipfunktionen i Kubernetes kan du definiera regler för inkommande och utgående trafik mellan poddar i ett kluster.

Den här artikeln visar hur du installerar nätverksprincipmotorn och skapar Kubernetes-nätverksprinciper för att styra trafikflödet mellan poddar i AKS. Nätverksprinciper kan användas för Linux-baserade eller Windows-baserade noder och poddar i AKS.

Översikt över nätverksprincip

Alla poddar i ett AKS-kluster kan som standard skicka och ta emot trafik utan begränsningar. För att förbättra säkerheten kan du definiera regler som styr trafikflödet. Serverdelsprogram exponeras ofta bara för nödvändiga frontend-tjänster, till exempel. Eller så är databaskomponenter endast tillgängliga för de programnivåer som ansluter till dem.

Nätverksprincip är en Kubernetes-specifikation som definierar åtkomstprinciper för kommunikation mellan poddar. När du använder nätverksprinciper definierar du en ordnad uppsättning regler för att skicka och ta emot trafik. Du tillämpar reglerna på en samling poddar som matchar en eller flera etikettväljare.

Nätverksprincipreglerna definieras som YAML-manifest. Nätverksprinciper kan ingå som en del av ett bredare manifest som också skapar en distribution eller tjänst.

Alternativ för nätverksprinciper i AKS

Azure tillhandahåller tre nätverksprincipmotorer för att framtvinga nätverksprinciper:

  • Cilium för AKS-kluster som använder Azure CNI som drivs av Cilium.
  • Azure Network Policy Manager.
  • Calico, en nätverks- och nätverkssäkerhetslösning med öppen källkod som grundades av Tigera.

Cilium är vår rekommenderade nätverksprincipmotor. Cilium tillämpar nätverksprincip på trafiken med Linux Berkeley Packet Filter (BPF), vilket i allmänhet är effektivare än "IPTables". Mer information finns i dokumentationen om Azure CNI Powered by Cilium.
För att framtvinga de angivna principerna använder Azure Network Policy Manager för Linux Linux IPTables. Azure Network Policy Manager för Windows använder ACLPolicies (Host Network Service) (HNS). Principer översätts till uppsättningar med tillåtna och otillåtna IP-adresspar. Dessa par programmeras sedan som IPTable eller HNS ACLPolicy filtrerar regler.

Skillnader mellan nätverksprincipmotorer: Cilium, Azure NPM och Calico

Kapacitet Azure Network Policy Manager Kalikå Cilium
Plattformar som stöds Linux, Windows Server 2022 (förhandsversion). Linux, Windows Server 2019 och 2022. Linux.
Nätverksalternativ som stöds Azure Container Networking Interface (CNI). Azure CNI (Linux, Windows Server 2019 och 2022) och kubenet (Linux). Azure CNI.
Kompatibilitet med Kubernetes-specifikation Alla principtyper som stöds Alla principtyper stöds. Alla principtyper stöds.
Andra funktioner Inga. Utökad principmodell som består av global nätverksprincip, global nätverksuppsättning och värdslutpunkt. Mer information om hur du använder calicoctl CLI för att hantera dessa utökade funktioner finns i calicoctl-användarreferens. Inga.
Support Stöds av Azures support- och teknikteam. Stöds av Azures support- och teknikteam. Stöds av Azures support- och teknikteam.

Begränsningar i Azure Network Policy Manager

Kommentar

Med Azure NPM för Linux tillåter vi inte skalning utöver 250 noder och 20 000 poddar. Om du försöker skala utanför dessa gränser kan det uppstå OOM-fel (Out of Memory). För bättre skalbarhet och IPv6-stöd, och om följande begränsningar är viktiga, rekommenderar vi att du använder eller uppgraderar till Azure CNI Powered by Cilium för att använda Cilium som nätverksprincipmotor.

Azure NPM stöder inte IPv6. Annars har den fullt stöd för nätverksprincipspecifikationerna i Linux.

I Windows stöder Inte Azure NPM följande funktioner i nätverksprincipspecifikationerna:

  • Namngivna portar.
  • Stream Control Transmission Protocol (SCTP).
  • Negativa matchningsetiketter eller namnområdesväljare. Till exempel alla etiketter utom debug=true.
  • except CIDR-block (classless interdomain routing) (CIDR med undantag).

Kommentar

Azure Network Policy Manager-poddloggar registrerar ett fel om en nätverksprincip som inte stöds skapas.

Redigera/ta bort nätverksprinciper

I vissa sällsynta fall finns det en risk att det uppstår ett konkurrenstillstånd som kan leda till tillfällig, oväntad anslutning för nya anslutningar till/från poddar på eventuella berörda noder när du redigerar eller tar bort en "tillräckligt stor" nätverksprincip. Att nå det här tävlingstillståndet påverkar aldrig aktiva anslutningar.

Om det här konkurrensvillkoret inträffar för en nod går Azure NPM-podden på noden in i ett tillstånd där den inte kan uppdatera säkerhetsreglerna, vilket kan leda till oväntad anslutning för nya anslutningar till/från poddar på den berörda noden. För att åtgärda problemet startar Azure NPM-podden automatiskt om ~15 sekunder efter att det här tillståndet har angetts. Medan Azure NPM startas om på den berörda noden tas alla säkerhetsregler bort och säkerhetsreglerna för alla nätverksprinciper återskapas. Alla säkerhetsregler tillämpas på nytt, men det finns en risk för tillfällig, oväntad anslutning för nya anslutningar till/från poddar på den berörda noden.

Om du vill begränsa risken för att träffa det här konkurrenstillståndet kan du minska storleken på nätverksprincipen. Det här problemet inträffar troligen för en nätverksprincip med flera ipBlock avsnitt. Det är mindre troligt att en nätverksprincip med fyra eller färre ipBlock avsnitt stöter på problemet.

Innan du börjar

Du behöver Azure CLI version 2.0.61 eller senare installerad och konfigurerad. Kör az --version för att hitta versionen. Om du behöver installera eller uppgradera kan du läsa Installera Azure CLI.

Skapa ett AKS-kluster och aktivera nätverksprincip

Om du vill se nätverksprinciper i praktiken skapar du ett AKS-kluster som stöder nätverksprinciper och sedan arbetar med att lägga till principer.

Om du vill använda Azure Network Policy Manager måste du använda Azure CNI-plugin-programmet. Calico kan användas med antingen Azure CNI-plugin-program eller med Kubenet CNI-plugin-programmet.

Följande exempelskript skapar ett AKS-kluster med systemtilldelad identitet och aktiverar nätverksprincip med hjälp av Azure Network Policy Manager.

Kommentar

Calico kan användas med antingen parametrarna --network-plugin azure eller --network-plugin kubenet .

I stället för att använda en systemtilldelad identitet kan du också använda en användartilldelad identitet. Mer information finns i Använda hanterade identiteter.

Skapa ett AKS-kluster med Azure Network Policy Manager aktiverat – endast Linux

I det här avsnittet skapar du ett kluster med Linux-nodpooler och Azure Network Policy Manager aktiverat.

Börja med att ersätta värdena för variablerna $RESOURCE_GROUP_NAME och $CLUSTER_NAME .

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

Skapa AKS-klustret och ange azure för network-plugin och network-policy.

Använd följande kommando för att skapa ett kluster:

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

Skapa ett AKS-kluster med Azure Network Policy Manager aktiverat – Windows Server 2022 (förhandsversion)

I det här avsnittet skapar du ett kluster med Windows-nodpooler och Azure Network Policy Manager aktiverat.

Kommentar

Azure Network Policy Manager med Windows-noder är endast tillgängligt på Windows Server 2022.

Installera Azure CLI-tillägget aks-preview

Viktigt!

AKS-förhandsversionsfunktioner är tillgängliga via självbetjäning och anmäl dig. Förhandsversioner tillhandahålls "som är" och "som tillgängliga", och de undantas från serviceavtalen och den begränsade garantin. AKS-förhandsversioner omfattas delvis av kundsupport på bästa sätt. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:

Kör följande kommando för att installera aks-preview tillägget:

az extension add --name aks-preview

Om du vill uppdatera till den senaste versionen av tillägget som släppts kör du följande kommando:

az extension update --name aks-preview

Registrera funktionsflaggan WindowsNetworkPolicyPreview

Registrera funktionsflaggan WindowsNetworkPolicyPreview med kommandot az feature register , som du ser i följande exempel:

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

Det tar några minuter för statusen att visa Registrerad. Kontrollera registreringsstatusen med kommandot az feature show :

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

När statusen visar Registrerad uppdaterar du registreringen av Microsoft.ContainerService resursprovidern med kommandot az provider register :

az provider register --namespace Microsoft.ContainerService

Skapa AKS-klustret

Nu ersätter du värdena för variablerna $RESOURCE_GROUP_NAME, $CLUSTER_NAMEoch $WINDOWS_USERNAME .

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

Skapa ett användarnamn som ska användas som administratörsautentiseringsuppgifter för dina Windows Server-containrar i klustret. Följande kommando uppmanar dig att ange ett användarnamn. Ställ in den på $WINDOWS_USERNAME. Kom ihåg att kommandona i den här artikeln anges i ett Bash-gränssnitt.

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

Använd följande kommando för att skapa ett kluster:

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

Det tar några minuter att skapa klustret. Som standard skapas klustret med endast en Linux-nodpool. Om du vill använda Windows-nodpooler kan du lägga till en. Här är ett exempel:

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

Skapa ett AKS-kluster med Calico aktiverat

Skapa AKS-klustret och ange --network-plugin azure, och --network-policy calico. Om du anger --network-policy calico aktiveras Calico i både Linux- och Windows-nodpooler.

Om du planerar att lägga till Windows-nodpooler i klustret inkluderar du parametrarna windows-admin-username och windows-admin-password som uppfyller lösenordskraven för Windows Server.

Viktigt!

För närvarande är det tillgängligt att använda Calico-nätverksprinciper med Windows-noder i nya kluster med hjälp av Kubernetes version 1.20 eller senare med Calico 3.17.2 och kräver att du använder Azure CNI-nätverk. Windows-noder i AKS-kluster med Calico aktiverat har också flytande IP aktiverat som standard.

För kluster med endast Linux-nodpooler som kör Kubernetes 1.20 med tidigare versioner av Calico uppgraderas Calico-versionen automatiskt till 3.17.2.

Skapa ett användarnamn som ska användas som administratörsautentiseringsuppgifter för dina Windows Server-containrar i klustret. Följande kommando uppmanar dig att ange ett användarnamn. Ställ in den på $WINDOWS_USERNAME. Kom ihåg att kommandona i den här artikeln anges i ett Bash-gränssnitt.

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

Det tar några minuter att skapa klustret. Som standard skapas klustret med endast en Linux-nodpool. Om du vill använda Windows-nodpooler kan du lägga till en. Till exempel:

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

Installera Azure Network Policy Manager eller Calico i ett befintligt kluster

Installation av Azure Network Policy Manager eller Calico på befintliga AKS-kluster stöds också.

Varning

Uppgraderingsprocessen utlöser att varje nodpool avbildas på nytt samtidigt. Det går inte att uppgradera varje nodpool separat. Eventuella avbrott i klusternätverk liknar en uppgradering av nodavbildningen eller uppgradering av Kubernetes-versionen där varje nod i en nodpool avbildas på nytt.

Exempelkommando för att installera Azure Network Policy Manager:

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy azure

Exempelkommando för att installera Calico:

Varning

Den här varningen gäller uppgradering av Kubenet-kluster med Calico aktiverat till Azure CNI Overlay med Calico aktiverat.

  • I Kubenet-kluster med Calico aktiverat används Calico som både en CNI- och nätverksprincipmotor.
  • I Azure CNI-kluster används Calico endast för nätverksprincipframtvingande, inte som CNI. Detta kan orsaka en kort fördröjning mellan när podden startar och när Calico tillåter utgående trafik från podden.

Vi rekommenderar att du använder Cilium i stället för Calico för att undvika det här problemet. Läs mer om Cilium på Azure CNI Powered by Cilium

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy calico

Uppgradera ett befintligt kluster som har Azure NPM eller Calico installerat till Azure CNI som drivs av Cilium

Information om hur du uppgraderar ett befintligt kluster som har en nätverksprincipmotor installerad på Azure CNI Powered by Cilium finns i Uppgradera ett befintligt kluster till Azure CNI som drivs av Cilium

Verifiera konfigurationen av nätverksprinciper

När klustret är klart konfigurerar du kubectl för att ansluta till kubernetes-klustret med kommandot az aks get-credentials . Det här kommandot laddar ned autentiseringsuppgifter och konfigurerar Kubernetes CLI för att använda dem:

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

Om du vill börja verifiera nätverksprincipen skapar du ett exempelprogram och anger trafikregler.

Skapa först ett namnområde med namnet demo för att köra exempelpoddar:

kubectl create namespace demo

Skapa nu två poddar i klustret med namnet client och server.

Kommentar

Om du vill schemalägga klienten eller servern på en viss nod lägger du till följande bit före --command argumentet i kubectl-körningskommandot för att skapa poddar:

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

Skapa en server podd. Den här podden körs på TCP-port 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"

Skapa en client podd. Följande kommando kör Bash på client podden:

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

Kör nu följande kommando i ett separat fönster för att hämta serverns IP-adress:

kubectl get pod --output=wide -n demo

Utdata bör se ut så här:

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

Testa anslutningen utan nätverksprincip

Kör följande kommando i klientens gränssnitt för att verifiera anslutningen till servern. Ersätt server-ip med hjälp av IP-adressen som hittades i utdata från att köra föregående kommando. Om anslutningen lyckas finns det inga utdata.

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

Testa anslutningen med nätverksprincip

Om du vill lägga till nätverksprinciper skapar du en fil med namnet demo-policy.yaml och klistrar in följande YAML-manifest:

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

Ange namnet på YAML-manifestet och tillämpa det med hjälp av kubectl apply:

kubectl apply –f demo-policy.yaml

I klientens gränssnitt kontrollerar du nu anslutningen till servern genom att köra följande /agnhost kommando:

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

Anslutningen till trafiken blockeras eftersom servern är märkt med app=server, men klienten är inte märkt. Föregående anslutningskommando ger följande utdata:

TIMEOUT

Kör följande kommando för att märka client och verifiera anslutningen till servern. Utdata bör inte returnera något.

kubectl label pod client -n demo app=client

Avinstallera Azure Network Policy Manager eller Calico

Krav:

  • Azure CLI version 2.63 eller senare

Kommentar

  • Avinstallationsprocessen tar inte bort anpassade resursdefinitioner (CRD) och anpassade resurser (CR) som används av Calico. Dessa CRD och CRs har alla namn som slutar med antingen "projectcalico.org" eller "tigera.io". Dessa CRD:ar och associerade cd-skivor kan tas bort manuellt när Calico har avinstallerats (ta bort CRD:erna innan calico tar bort klustret).
  • Uppgraderingen tar inte bort några NetworkPolicy-resurser i klustret, men efter avinstallationen tillämpas inte längre dessa principer.

Varning

Uppgraderingsprocessen utlöser att varje nodpool avbildas på nytt samtidigt. Det går inte att uppgradera varje nodpool separat. Eventuella avbrott i klusternätverk liknar en uppgradering av nodavbildningen eller uppgradering av Kubernetes-versionen där varje nod i en nodpool avbildas på nytt.

Kör följande kommando för att ta bort Azure Network Policy Manager eller Calico från ett kluster:

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy none

Rensa resurser

I den här artikeln har du skapat ett namnområde och två poddar och tillämpat en nätverksprincip. Om du vill rensa dessa resurser använder du kommandot kubectl delete och anger resursnamnet:

kubectl delete namespace demo

Nästa steg

Mer information om nätverksresurser finns i Nätverksbegrepp för program i Azure Kubernetes Service (AKS).

Mer information om principer finns i Kubernetes-nätverksprinciper.