Calico-netwerkbeleid gebruiken om podverkeer te beveiligen
Van toepassing op: AKS in Azure Stack HCI 22H2, AKS op Windows Server
Gebruik deze stapsgewijze handleiding om de basisconnectiviteit van pod-naar-pods te controleren en uit te proberen en om Calico-netwerkbeleid te gebruiken in een cluster in een AKS die is ingeschakeld door azure Arc-implementatie. In dit artikel wordt beschreven hoe u client- en serverpods maakt op Linux- en Windows-knooppunten, de connectiviteit tussen de pods controleert en vervolgens een basisnetwerkbeleid toepast om podverkeer in AKS Arc te isoleren.
Vereisten
Als u AKS Arc wilt implementeren, volgt u de stappen voor het instellen van een AKS-host.
Als u deze handleiding wilt gebruiken, hebt u het volgende nodig:
- Een AKS-workloadcluster.
- Ten minste één Windows-werkknooppunt geïmplementeerd in het cluster.
- Ten minste één Linux-werkknooppunt geïmplementeerd in het cluster.
- De Calico-netwerkinvoegtoepassing moet zijn ingeschakeld bij het maken van het workloadcluster. Als deze invoegtoepassing niet is ingeschakeld, raadpleegt
New-AksHciCluster
u voor instructies.
pods Creatie op Linux-knooppunten
Maak eerst een clientpod, busybox en serverpod, nginx, op de Linux-knooppunten.
Creatie een YAML-bestand met de naam policy-demo-linux.yaml
apiVersion: v1
kind: Namespace
metadata:
name: calico-demo
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: busybox
name: busybox
namespace: calico-demo
spec:
containers:
- args:
- /bin/sh
- -c
- sleep 360000
image: busybox:1.28
imagePullPolicy: Always
name: busybox
nodeSelector:
beta.kubernetes.io/os: linux
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: nginx
name: nginx
namespace: calico-demo
spec:
containers:
- name: nginx
image: nginx:1.8
ports:
- containerPort: 80
nodeSelector:
beta.kubernetes.io/os: linux
Het bestand policy-demo-linux.yaml toepassen op het Kubernetes-cluster
Open een PowerShell-venster en laad de referenties voor uw doelcluster met behulp van de Get-AksHciCredential
opdracht .
kubectl
Gebruik vervolgens om de policy-demo-linux.yaml
configuratie als volgt toe te passen:
kubectl apply -f policy-demo-linux.yaml
Creatie pods op Windows-knooppunten
Creatie een clientpod pwsh en server pod porter op de Windows-knooppunten.
Notitie
Het manifest van de pods maakt gebruik van installatiekopieën op mcr.microsoft.com/windows/servercore:1809
basis van . Als u een recentere versie van Windows Server gebruikt, werkt u de manifesten bij om een Server Core-installatiekopieën te gebruiken die overeenkomt met uw Windows Server-versie.
Creatie policy-demo-windows.yaml
apiVersion: v1
kind: Pod
metadata:
name: pwsh
namespace: calico-demo
labels:
app: pwsh
spec:
containers:
- name: pwsh
image: mcr.microsoft.com/windows/servercore:1809
args:
- powershell.exe
- -Command
- "Start-Sleep 360000"
imagePullPolicy: IfNotPresent
nodeSelector:
kubernetes.io/os: windows
---
apiVersion: v1
kind: Pod
metadata:
name: porter
namespace: calico-demo
labels:
app: porter
spec:
containers:
- name: porter
image: calico/porter:1809
ports:
- containerPort: 80
env:
- name: SERVE_PORT_80
value: This is a Calico for Windows demo.
imagePullPolicy: IfNotPresent
nodeSelector:
kubernetes.io/os: windows
Het bestand policy-demo-windows.yaml toepassen op het Kubernetes-cluster
Open een PowerShell-venster en laad de referenties voor uw doelcluster met behulp van de Get-AksHciCredential
opdracht .
kubectl
Gebruik vervolgens om de policy-demo-windows.yaml
configuratie toe te passen:
kubectl apply -f policy-demo-windows.yaml
Controleer of de vier pods zijn gemaakt en worden uitgevoerd
Notitie
Afhankelijk van de downloadsnelheid van uw netwerk kan het even duren om de Windows-pods te starten.
Open een PowerShell-venster en laad de referenties voor uw doelcluster met behulp van de Get-AksHciCredential
opdracht .
Gebruik vervolgens kubectl
om de pods in de naamruimte weer te geven calico-demo
:
kubectl get pods --namespace calico-demo
De uitvoer ziet er ongeveer als volgt uit:
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 0 4m14s
nginx 1/1 Running 0 4m14s
porter 0/1 ContainerCreating 0 74s
pwsh 0/1 ContainerCreating 0 2m9s
Herhaal de opdracht om de paar minuten totdat in de uitvoer alle vier de pods worden weergegeven met de status Actief.
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 0 7m24s
nginx 1/1 Running 0 7m24s
porter 1/1 Running 0 4m24s
pwsh 1/1 Running 0 5m19s
Connectiviteit tussen pods op Linux- en Windows-knooppunten controleren
Nu de client- en serverpods worden uitgevoerd op zowel Linux- als Windows-knooppunten, controleert u of clientpods op Linux-knooppunten serverpods op Windows-knooppunten kunnen bereiken.
Open een PowerShell-venster en laad de referenties voor uw doelcluster met behulp van de
Get-AksHciCredential
opdracht .Gebruik
kubectl
om het IP-adres van de porter-pod te bepalen:kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}'
Meld u aan bij de pod busybox en probeer de portierpod op poort 80 te bereiken. Vervang de tag '<porter_ip>' door het IP-adres dat is geretourneerd met de vorige opdracht.
kubectl exec --namespace calico-demo busybox -- nc -vz <porter_ip> 80
U kunt ook beide bovenstaande stappen combineren:
kubectl exec --namespace calico-demo busybox -- nc -vz $(kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}') 80
Als de verbinding van de pod busybox naar de porter-pod slaagt, krijgt u uitvoer die vergelijkbaar is met het volgende voorbeeld:
192.168.40.166 (192.168.40.166:80) open
Notitie
De geretourneerde IP-adressen kunnen variëren, afhankelijk van de instellingen van uw omgeving.
Controleer of de pwsh-pod de nginx-pod kan bereiken:
kubectl exec --namespace calico-demo pwsh -- powershell Invoke-WebRequest -Uri http://$(kubectl get po nginx -n calico-demo -o 'jsonpath={.status.podIP}') -UseBasicParsing -TimeoutSec 5
Als de verbinding tot stand is gebracht, ziet u uitvoer die vergelijkbaar is met:
StatusCode : 200 StatusDescription : OK Content : <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> <...
Controleer of de pwsh-pod de porter-pod kan bereiken:
kubectl exec --namespace calico-demo pwsh -- powershell Invoke-WebRequest -Uri http://$(kubectl get po porter -n calico-demo -o 'jsonpath={.status.podIP}') -UseBasicParsing -TimeoutSec 5
Als dat lukt, ziet u uitvoer die vergelijkbaar is met het volgende voorbeeld:
StatusCode : 200 StatusDescription : OK Content : This is a Calico for Windows demo. RawContent : HTTP/1.1 200 OK Content-Length: 49 Content-Type: text/plain; charset=utf-8 Date: Fri, 21 Aug 2020 22:45:46 GMT This is a Calico for Windows demo. Forms : Headers : {[Content-Length, 49], [Content-Type, text/plain; charset=utf-8], [Date, Fri, 21 Aug 2020 22:45:46 GMT]} Images : {} InputFields : {} Links : {} ParsedHtml : RawContentLength : 49
U hebt nu gecontroleerd of communicatie mogelijk is tussen alle pods in de toepassing.
Het beleid toepassen op de Windows-clientpod
In een implementatie in de praktijk wilt u ervoor zorgen dat alleen pods die met elkaar moeten communiceren, dit mogen doen. Om dit te bereiken, past u een basisnetwerkbeleid toe waarmee alleen de pod busybox de porter-pod kan bereiken.
Creatie het bestand network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-busybox
namespace: calico-demo
spec:
podSelector:
matchLabels:
app: porter
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: busybox
ports:
- protocol: TCP
port: 80
Het bestand network-policy.yaml toepassen
Open een Powershell-venster.
Laad de referenties voor uw doelcluster met behulp van de
Get-AksHciCredential
opdracht .Gebruik
kubectl
om het bestand network-policy.yaml toe te passen:kubectl apply -f network-policy.yaml
Controleren of het beleid van kracht is
Nu het beleid is ingesteld, moet de pod busybox nog steeds de portierpod kunnen bereiken. Zoals eerder vermeld, kunt u de stappen in de opdrachtregel combineren:
kubectl exec --namespace calico-demo busybox -- nc -vz $(kubectl get po porter -n calico-demo -o 'jsonpath={.status.podIP}') 80
De pwsh-pod kan de porter-pod echter niet bereiken:
kubectl exec --namespace calico-demo pwsh -- powershell Invoke-WebRequest -Uri http://$(kubectl get po porter -n calico-demo -o 'jsonpath={.status.podIP}') -UseBasicParsing -TimeoutSec 5
Er treedt een time-out op voor de aanvraag met een bericht zoals dit:
Invoke-WebRequest : The operation has timed out.
At line:1 char:1
+ Invoke-WebRequest -Uri http://192.168.40.166 -UseBasicParsing -Timeout ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:Htt
pWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
command terminated with exit code 1
In deze demo hebben we pods geconfigureerd op Linux- en Windows-knooppunten, de basisconnectiviteit van pods geverifieerd en een basisnetwerkbeleid geprobeerd om pod-naar-pod-verkeer te isoleren.
Als laatste stap kunt u alle demoresources opschonen:
kubectl delete namespace calico-demo
Volgende stappen
In dit artikel hebt u geleerd hoe u verkeer tussen pods kunt beveiligen met behulp van netwerkbeleid. Vervolgens kunt u het volgende doen:
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor