Verkeer tussen pods beveiligen met behulp van netwerkbeleid in AKS
Wanneer u moderne, op microservices gebaseerde toepassingen uitvoert in Kubernetes, wilt u vaak bepalen welke onderdelen met elkaar kunnen communiceren. Het principe van minimale bevoegdheden moet worden toegepast op de wijze waarop verkeer tussen pods in een AKS-cluster (Azure Kubernetes Service) kan stromen. Stel dat u verkeer rechtstreeks naar back-endtoepassingen wilt blokkeren. Met de functie netwerkbeleid in Kubernetes kunt u regels definiëren voor inkomend en uitgaand verkeer tussen pods in een cluster.
In dit artikel leest u hoe u de netwerkbeleidsengine installeert en Kubernetes-netwerkbeleid maakt om de verkeersstroom tussen pods in AKS te beheren. Netwerkbeleid kan worden gebruikt voor linux- of Windows-knooppunten en -pods in AKS.
Overzicht van netwerkbeleid
Alle pods in een AKS-cluster kunnen standaard verkeer verzenden en ontvangen zonder beperkingen. Om de beveiliging te verbeteren, kunt u regels definiëren waarmee de verkeersstroom wordt bepaald. Back-endtoepassingen worden vaak alleen blootgesteld aan vereiste front-endservices, bijvoorbeeld. Of databaseonderdelen zijn alleen toegankelijk voor de toepassingslagen die er verbinding mee maken.
Netwerkbeleid is een Kubernetes-specificatie die toegangsbeleid definieert voor communicatie tussen pods. Wanneer u netwerkbeleid gebruikt, definieert u een geordende set regels voor het verzenden en ontvangen van verkeer. U past de regels toe op een verzameling pods die overeenkomen met een of meer labelkiezers.
De netwerkbeleidsregels worden gedefinieerd als YAML-manifesten. Netwerkbeleid kan worden opgenomen als onderdeel van een breder manifest dat ook een implementatie of service maakt.
Netwerkbeleidsopties in AKS
Azure biedt drie netwerkbeleidsengines voor het afdwingen van netwerkbeleid:
- Cilium voor AKS-clusters die gebruikmaken van Azure CNI Powered by Cilium.
- Azure Network Policy Manager.
- Calico, een opensource-netwerk- en netwerkbeveiligingsoplossing die is opgericht door Tigera.
Cilium is onze aanbevolen netwerkbeleidsengine. Cilium dwingt netwerkbeleid af op het verkeer met behulp van Linux Berkeley Packet Filter (BPF), wat over het algemeen efficiënter is dan 'IPTables'. Zie de documentatie over Azure CNI Powered by Cilium voor meer informatie.
Voor het afdwingen van het opgegeven beleid gebruikt Azure Network Policy Manager voor Linux IPTables. Azure Network Policy Manager voor Windows maakt gebruik van HNS-ACLPolicies (Host Network Service). Beleidsregels worden omgezet in sets met toegestane en niet-toegestane IP-paren. Deze paren worden vervolgens geprogrammeerd als IPTable
of HNS ACLPolicy
filterregels.
Verschillen tussen netwerkbeleidsengines: Cilium, Azure NPM en Calico
Mogelijkheid | Azure Network Policy Manager | Calico | Cilium |
---|---|---|---|
Ondersteunde platforms | Linux, Windows Server 2022 (preview). | Linux, Windows Server 2019 en 2022. | Linux. |
Ondersteunde netwerkopties | Azure Container Networking Interface (CNI). | Azure CNI (Linux, Windows Server 2019 en 2022) en kubenet (Linux). | Azure CNI. |
Naleving van Kubernetes-specificatie | Alle beleidstypen die worden ondersteund | Alle beleidstypen worden ondersteund. | Alle beleidstypen worden ondersteund. |
Andere functies | Geen. | Uitgebreid beleidsmodel dat bestaat uit Global Network Policy, Global Network Set en Host Endpoint. Zie calicoctl-gebruikersreferenties voor meer informatie over het gebruik van de calicoctl CLI om deze uitgebreide functies te beheren. |
Geen. |
Ondersteuning | Ondersteund door het ondersteunings- en engineeringteam van Azure. | Ondersteund door het ondersteunings- en engineeringteam van Azure. | Ondersteund door het ondersteunings- en engineeringteam van Azure. |
Beperkingen van Azure Network Policy Manager
Notitie
Met Azure NPM voor Linux kunnen we niet meer schalen dan 250 knooppunten en 20.000 pods. Als u probeert te schalen buiten deze limieten, kunnen er OOM-fouten (Onvoldoende geheugen) optreden. Voor betere schaalbaarheid en IPv6-ondersteuning en als de volgende beperkingen van belang zijn, raden we u aan om azure CNI Powered by Cilium te gebruiken als netwerkbeleidsengine.
Azure NPM biedt geen ondersteuning voor IPv6. Anders worden de netwerkbeleidsspecificaties in Linux volledig ondersteund.
In Windows biedt Azure NPM geen ondersteuning voor de volgende functies van de netwerkbeleidsspecificaties:
- Benoemde poorten.
- Stream Control Transmission Protocol (SCTP).
- Negatieve overeenkomst label of naamruimteselectors. Bijvoorbeeld alle labels behalve
debug=true
. except
ciDR-blokken (classless interdomain routing) (CIDR met uitzonderingen).
Notitie
Azure Network Policy Manager-podlogboeken registreren een fout als er een niet-ondersteund netwerkbeleid wordt gemaakt.
Netwerkbeleid bewerken/verwijderen
In sommige zeldzame gevallen is er een kans op een racevoorwaarde die kan leiden tot tijdelijke, onverwachte connectiviteit voor nieuwe verbindingen met/van pods op getroffen knooppunten bij het bewerken of verwijderen van een 'groot genoeg' netwerkbeleid. Het bereiken van deze racevoorwaarde heeft nooit invloed op actieve verbindingen.
Als deze racevoorwaarde optreedt voor een knooppunt, voert de Azure NPM-pod op dat knooppunt een status in waarin de beveiligingsregels niet kunnen worden bijgewerkt, wat kan leiden tot onverwachte connectiviteit voor nieuwe verbindingen met/van pods op het betrokken knooppunt. Om het probleem te verhelpen, wordt de Azure NPM-pod automatisch ~15 seconden na het invoeren van deze status opnieuw opgestart. Terwijl Azure NPM opnieuw wordt opgestart op het betrokken knooppunt, worden alle beveiligingsregels verwijderd en worden vervolgens beveiligingsregels voor alle netwerkbeleidsregels opnieuw toegepast. Hoewel alle beveiligingsregels opnieuw worden toegepast, is er een kans op tijdelijke, onverwachte connectiviteit voor nieuwe verbindingen met/van pods op het betrokken knooppunt.
Als u de kans wilt beperken dat deze racevoorwaarde wordt bereikt, kunt u de grootte van het netwerkbeleid verkleinen. Dit probleem treedt waarschijnlijk op voor een netwerkbeleid met verschillende ipBlock
secties. Een netwerkbeleid met vier of minder ipBlock
secties heeft minder kans op het probleem.
Voordat u begint
U moet Azure CLI versie 2.0.61 of hoger hebben geïnstalleerd en geconfigureerd. Voer az --version
uit om de versie te bekijken. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.
Een AKS-cluster maken en netwerkbeleid inschakelen
Als u netwerkbeleid in actie wilt zien, maakt u een AKS-cluster dat netwerkbeleid ondersteunt en werkt u vervolgens aan het toevoegen van beleid.
Als u Azure Network Policy Manager wilt gebruiken, moet u de Azure CNI-invoegtoepassing gebruiken. Calico kan worden gebruikt met de Azure CNI-invoegtoepassing of met de Kubenet CNI-invoegtoepassing.
Met het volgende voorbeeldscript maakt u een AKS-cluster met door het systeem toegewezen identiteit en schakelt u netwerkbeleid in met behulp van Azure Network Policy Manager.
Notitie
Calico kan worden gebruikt met de --network-plugin azure
of --network-plugin kubenet
parameters.
In plaats van een door het systeem toegewezen identiteit te gebruiken, kunt u ook een door de gebruiker toegewezen identiteit gebruiken. Zie Beheerde identiteiten gebruiken voor meer informatie.
Een AKS-cluster maken waarvoor Azure Network Policy Manager is ingeschakeld - alleen Linux
In deze sectie maakt u een cluster waarvoor Linux-knooppuntgroepen zijn ingeschakeld en Azure Network Policy Manager is ingeschakeld.
Om te beginnen vervangt u de waarden voor de $RESOURCE_GROUP_NAME
en $CLUSTER_NAME
variabelen.
$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$LOCATION=canadaeast
Maak het AKS-cluster en geef azure
het op voor de network-plugin
en network-policy
.
Gebruik de volgende opdracht om een cluster te maken:
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--network-plugin azure \
--network-policy azure \
--generate-ssh-keys
Een AKS-cluster maken waarvoor Azure Network Policy Manager is ingeschakeld - Windows Server 2022 (preview)
In deze sectie maakt u een cluster waarvoor Windows-knooppuntgroepen zijn ingeschakeld en Azure Network Policy Manager is ingeschakeld.
Notitie
Azure Network Policy Manager met Windows-knooppunten is alleen beschikbaar op Windows Server 2022.
De Azure CLI-extensie aks-preview installeren
Belangrijk
AKS preview-functies zijn beschikbaar op selfservice, opt-in basis. Previews worden geleverd 'zoals is' en 'als beschikbaar' en ze worden uitgesloten van de serviceovereenkomsten en beperkte garantie. AKS-previews worden gedeeltelijk gedekt door klantondersteuning op basis van best effort. Daarom zijn deze functies niet bedoeld voor productiegebruik. Zie de volgende ondersteuningsartikelen voor meer informatie:
Voer de volgende opdracht uit om de aks-preview
extensie te installeren:
az extension add --name aks-preview
Voer de volgende opdracht uit om bij te werken naar de nieuwste versie van de extensie die is uitgebracht:
az extension update --name aks-preview
De functievlag WindowsNetworkPolicyPreview registreren
Registreer de WindowsNetworkPolicyPreview
functievlag met behulp van de opdracht az feature register , zoals wordt weergegeven in het volgende voorbeeld:
az feature register --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"
Het duurt enkele minuten voordat de status Geregistreerd wordt weergegeven. Controleer de registratiestatus met behulp van de opdracht az feature show :
az feature show --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"
Wanneer de status Geregistreerd is, vernieuwt u de registratie van de Microsoft.ContainerService
resourceprovider met behulp van de opdracht az provider register:
az provider register --namespace Microsoft.ContainerService
Het AKS-cluster maken
Nu vervangt u de waarden voor de $RESOURCE_GROUP_NAME
, $CLUSTER_NAME
en $WINDOWS_USERNAME
variabelen.
$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$WINDOWS_USERNAME=myWindowsUserName
$LOCATION=canadaeast
Maak een gebruikersnaam voor gebruik als beheerdersreferenties voor uw Windows Server-containers in uw cluster. Met de volgende opdracht wordt u om een gebruikersnaam gevraagd. Stel deze in op $WINDOWS_USERNAME
. Houd er rekening mee dat de opdrachten in dit artikel worden ingevoerd in een Bash-shell.
echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
Gebruik de volgende opdracht om een cluster te maken:
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
Het duurt een paar minuten om het cluster te maken. Uw cluster wordt standaard gemaakt met alleen een Linux-knooppuntgroep. Als u Windows-knooppuntgroepen wilt gebruiken, kunt u er een toevoegen. Hier volgt een voorbeeld:
az aks nodepool add \
--resource-group $RESOURCE_GROUP_NAME \
--cluster-name $CLUSTER_NAME \
--os-type Windows \
--name npwin \
--node-count 1
Een AKS-cluster maken waarvoor Calico is ingeschakeld
Maak het AKS-cluster en geef --network-plugin azure
, en --network-policy calico
. --network-policy calico
Door op te geven kunt u Calico inschakelen voor zowel Linux- als Windows-knooppuntgroepen.
Als u van plan bent Windows-knooppuntgroepen toe te voegen aan uw cluster, neemt u de windows-admin-username
en windows-admin-password
parameters op die voldoen aan de wachtwoordvereisten voor Windows Server.
Belangrijk
Op dit moment is het gebruik van Calico-netwerkbeleid met Windows-knooppunten beschikbaar op nieuwe clusters met behulp van Kubernetes versie 1.20 of hoger met Calico 3.17.2 en moet u Azure CNI-netwerken gebruiken. Windows-knooppunten op AKS-clusters waarvoor Calico is ingeschakeld, hebben ook standaard Zwevend IP-adres ingeschakeld.
Voor clusters met alleen Linux-knooppuntgroepen met Kubernetes 1.20 met eerdere versies van Calico wordt de Calico-versie automatisch bijgewerkt naar 3.17.2.
Maak een gebruikersnaam voor gebruik als beheerdersreferenties voor uw Windows Server-containers in uw cluster. Met de volgende opdracht wordt u om een gebruikersnaam gevraagd. Stel deze in op $WINDOWS_USERNAME
. Houd er rekening mee dat de opdrachten in dit artikel worden ingevoerd in een Bash-shell.
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
Het duurt een paar minuten om het cluster te maken. Uw cluster wordt standaard gemaakt met alleen een Linux-knooppuntgroep. Als u Windows-knooppuntgroepen wilt gebruiken, kunt u er een toevoegen. Voorbeeld:
az aks nodepool add \
--resource-group $RESOURCE_GROUP_NAME \
--cluster-name $CLUSTER_NAME \
--os-type Windows \
--name npwin \
--node-count 1
Azure Network Policy Manager of Calico installeren in een bestaand cluster
Het installeren van Azure Network Policy Manager of Calico op bestaande AKS-clusters wordt ook ondersteund.
Waarschuwing
Tijdens het upgradeproces wordt elke knooppuntgroep geactiveerd om tegelijkertijd opnieuw te worden geinstallatiekopieën. Het afzonderlijk bijwerken van elke knooppuntgroep wordt niet ondersteund. Binnen elke knooppuntgroep worden knooppunten opnieuw geinstallatiekopied volgens hetzelfde proces als in een standaard upgradebewerking voor Kubernetes-versie, waarbij bufferknooppunten tijdelijk worden toegevoegd om onderbreking van actieve toepassingen te minimaliseren terwijl het proces voor het opnieuw maken van knooppunten wordt uitgevoerd. Eventuele onderbrekingen die kunnen optreden, zijn daarom vergelijkbaar met wat u zou verwachten tijdens een upgrade van een knooppuntinstallatiekopie of een upgradebewerking van de Kubernetes-versie .
Voorbeeldopdracht voor het installeren van Azure Network Policy Manager:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy azure
Voorbeeldopdracht voor het installeren van Calico:
Waarschuwing
Deze waarschuwing geldt voor het upgraden van Kubenet-clusters waarvoor Calico is ingeschakeld voor Azure CNI-overlay met Calico ingeschakeld.
- In Kubenet-clusters waarvoor Calico is ingeschakeld, wordt Calico gebruikt als een CNI- en netwerkbeleidsengine.
- In Azure CNI-clusters wordt Calico alleen gebruikt voor het afdwingen van netwerkbeleid, niet als een CNI. Dit kan een korte vertraging veroorzaken tussen wanneer de pod wordt gestart en wanneer Calico uitgaand verkeer van de pod toestaat.
Het wordt aanbevolen om Cilium te gebruiken in plaats van Calico om dit probleem te voorkomen. Meer informatie over Cilium op Azure CNI Powered by Cilium
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy calico
Een bestaand cluster upgraden waarop Azure NPM of Calico is geïnstalleerd naar Azure CNI Powered by Cilium
Configuratie van netwerkbeleid controleren
Wanneer het cluster klaar is, configureert u kubectl
om verbinding te maken met uw Kubernetes-cluster met behulp van de opdracht az aks get-credentials . Met deze opdracht downloadt u referenties en configureert u de Kubernetes CLI om deze te gebruiken:
az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
Als u wilt beginnen met de verificatie van netwerkbeleid, maakt u een voorbeeldtoepassing en stelt u verkeersregels in.
Maak eerst een naamruimte die wordt aangeroepen demo
om de voorbeeldpods uit te voeren:
kubectl create namespace demo
Maak nu twee pods in het cluster met de naam client
en server
.
Notitie
Als u de client of server op een bepaald knooppunt wilt plannen, voegt u de volgende bit toe vóór het --command
argument in de kubectl-opdracht voor het maken van de pod:
--overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "linux|windows"}}}'
Maak een server
pod. Deze pod dient op TCP-poort 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"
Maak een client
pod. Met de volgende opdracht wordt Bash uitgevoerd op de client
pod:
kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --command -- bash
Voer nu in een afzonderlijk venster de volgende opdracht uit om het IP-adres van de server op te halen:
kubectl get pod --output=wide -n demo
De uitvoer moet er als volgt uitzien:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
server 1/1 Running 0 30s 10.224.0.72 akswin22000001 <none> <none>
Connectiviteit testen zonder netwerkbeleid
Voer in de shell van de client de volgende opdracht uit om de verbinding met de server te controleren. Vervang server-ip
het IP-adres in de uitvoer van het uitvoeren van de vorige opdracht. Als de verbinding is geslaagd, is er geen uitvoer.
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
Connectiviteit testen met netwerkbeleid
Als u netwerkbeleidsregels wilt toevoegen, maakt u een bestand met de naam demo-policy.yaml
en plakt u het volgende 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
Geef de naam van uw YAML-manifest op en pas dit toe met behulp van kubectl apply:
kubectl apply –f demo-policy.yaml
Controleer nu in de shell van de client de verbinding met de server door de volgende /agnhost
opdracht uit te voeren:
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
Connectiviteit met verkeer wordt geblokkeerd omdat de server is gelabeld met app=server
, maar de client niet is gelabeld. De voorgaande connect-opdracht levert deze uitvoer op:
TIMEOUT
Voer de volgende opdracht uit om de client
verbinding met de server te labelen en te controleren. De uitvoer moet niets retourneren.
kubectl label pod client -n demo app=client
Azure Network Policy Manager of Calico verwijderen
Vereisten:
- Azure CLI versie 2.63 of hoger
Notitie
- Tijdens het verwijderingsproces worden geen aangepaste resourcedefinities (CRD's) en aangepaste resources (CR's) verwijderd die door Calico worden gebruikt. Deze CRD's en CA's hebben allemaal namen die eindigen op 'projectcalico.org' of 'tigera.io'. Deze CRD's en bijbehorende CR's kunnen handmatig worden verwijderd nadat Calico is verwijderd (verwijderen van de CRD's voordat calico het cluster verwijdert).
- Met de upgrade worden geen NetworkPolicy-resources in het cluster verwijderd, maar na het verwijderen van dit beleid worden deze beleidsregels niet meer afgedwongen.
Waarschuwing
Tijdens het upgradeproces wordt elke knooppuntgroep geactiveerd om tegelijkertijd opnieuw te worden geinstallatiekopieën. Het afzonderlijk bijwerken van elke knooppuntgroep wordt niet ondersteund. Eventuele onderbrekingen in clusternetwerken zijn vergelijkbaar met een upgrade van de installatiekopie van een knooppunt of een upgrade van de Kubernetes-versie waarbij elk knooppunt in een knooppuntgroep opnieuw wordt geinstallatiekopie gemaakt.
Voer de volgende opdracht uit om Azure Network Policy Manager of Calico uit een cluster te verwijderen:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy none
Resources opschonen
In dit artikel hebt u een naamruimte en twee pods gemaakt en een netwerkbeleid toegepast. Als u deze resources wilt opschonen, gebruikt u de opdracht kubectl delete en geeft u de resourcenaam op:
kubectl delete namespace demo
Volgende stappen
Zie Netwerkconcepten voor toepassingen in Azure Kubernetes Service (AKS) voor meer informatie over netwerkresources.
Zie Kubernetes-netwerkbeleid voor meer informatie over beleidsregels.
Azure Kubernetes Service