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.
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.
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.
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. |
Anteckning
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).
Anteckning
Azure Network Policy Manager-poddloggar registrerar ett fel om en nätverksprincip som inte stöds skapas.
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.
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.
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.
Anteckning
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.
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.
Anteckning
Azure Network Policy Manager med Windows-noder är endast tillgängligt på Windows Server 2022.
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
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
Nu ersätter du värdena för variablerna $RESOURCE_GROUP_NAME
, $CLUSTER_NAME
och $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 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
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. I varje nodpool avbildas noderna på nytt efter samma process som i en standarduppgraderingsåtgärd för Kubernetes-version där buffertnoder tillfälligt läggs till för att minimera avbrott i program som körs medan nodombildningsprocessen pågår. Därför liknar eventuella störningar som kan uppstå vad du kan förvänta dig under en uppgradering av nodbilden eller uppgraderingen av Kubernetes-versionen .
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
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
.
Anteckning
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>
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
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
Krav:
- Azure CLI version 2.63 eller senare
Anteckning
- 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
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
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.
Feedback om Azure Kubernetes Service
Azure Kubernetes Service är ett öppen källkod projekt. Välj en länk för att ge feedback: