Delen via


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:1809basis 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.

  1. Open een PowerShell-venster en laad de referenties voor uw doelcluster met behulp van de Get-AksHciCredential opdracht .

  2. Gebruik kubectl om het IP-adres van de porter-pod te bepalen:

    kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}'
    
  3. 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.

  4. 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>
                        <...
    
  5. 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

  1. Open een Powershell-venster.

  2. Laad de referenties voor uw doelcluster met behulp van de Get-AksHciCredential opdracht .

  3. 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: