Freigeben über


Verwenden der Calico-Netzwerkrichtlinie zum Schützen des Poddatenverkehrs

Gilt für: AKS in Azure Stack HCI 22H2, AKS unter Windows Server

Verwenden Sie diese Schritt-für-Schritt-Anleitung, um die grundlegende Pod-zu-Pod-Konnektivität zu überprüfen und auszuprobieren und Calico-Netzwerkrichtlinien in einem Cluster in einem AKS zu verwenden, der durch die Azure Arc-Bereitstellung aktiviert ist. In diesem Artikel wird beschrieben, wie Sie Client- und Serverpods auf Linux- und Windows-Knoten erstellen, die Konnektivität zwischen den Pods überprüfen und dann eine grundlegende Netzwerkrichtlinie anwenden, um den Poddatenverkehr in AKS Arc zu isolieren.

Voraussetzungen

Führen Sie zum Bereitstellen von AKS Arc die Schritte zum Einrichten eines AKS-Hosts aus.

Um dieses Handbuch verwenden zu können, benötigen Sie Folgendes:

  • Ein AKS-Workloadcluster.
  • Mindestens einen im Cluster bereitgestellten Windows-Workerknoten.
  • Mindestens einen im Cluster bereitgestellten Linux-Workerknoten.
  • Das Calico-Netzwerk-Plug-In muss beim Erstellen des Workloadclusters aktiviert sein. Wenn das Plug-In nicht aktiviert wurde, nutzen Sie die Anweisungen unter New-AksHciCluster.

Erstellen von Pods auf Linux-Knoten

Erstellen Sie auf den Linux-Knoten zunächst einen Clientpod, busybox, und einen Serverpod, nginx.

Erstellen einer YAML-Datei mit dem Namen „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

Anwenden der Datei „policy-demo-linux.yaml“ auf den Kubernetes-Cluster

Öffnen Sie ein PowerShell-Fenster, und laden Sie die Anmeldeinformationen für Ihren Zielcluster mit dem Get-AksHciCredential Befehl.

Verwenden Sie kubectl als Nächstes, um die policy-demo-linux.yaml Konfiguration wie folgt anzuwenden:

kubectl apply -f policy-demo-linux.yaml

Create Pods auf Windows-Knoten

Erstellen Sie einen Clientpod pwsh und einen Serverpod porter auf den Windows-Knoten.

Hinweis

Das Manifest der Pods verwendet Images, die auf mcr.microsoft.com/windows/servercore:1809 basieren. Wenn Sie eine neuere Version von Windows Server verwenden, aktualisieren Sie die Manifeste, um ein Server Core-Image zu verwenden, das Ihrer Windows Server-Version entspricht.

Erstellen von „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

Anwenden der Datei „policy-demo-windows.yaml“ auf den Kubernetes-Cluster

Öffnen Sie ein PowerShell-Fenster, und laden Sie die Anmeldeinformationen für Ihren Zielcluster mit dem Get-AksHciCredential Befehl.

Verwenden Sie als Nächstes kubectl zum Anwenden derpolicy-demo-windows.yaml-Konfiguration:

kubectl apply -f policy-demo-windows.yaml

Überprüfen, ob die vier Pods erstellt sind und ausgeführt werden

Hinweis

Abhängig von der Downloadgeschwindigkeit Ihres Netzwerks kann es eine Weile dauern, bis die Windows-Pods gestartet werden.

Öffnen Sie ein PowerShell-Fenster, und laden Sie die Anmeldeinformationen für Ihren Zielcluster mit dem Get-AksHciCredential Befehl.

Listen Sie als Nächstes mit kubectl die Pods im calico-demo-Namespace auf:

kubectl get pods --namespace calico-demo

Die Ausgabe sollte etwa folgendem Beispiel entsprechen:

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

Wiederholen Sie den Befehl alle paar Minuten, bis in der Ausgabe alle vier Pods im Status „Wird ausgeführt“ angezeigt werden.

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

Überprüfen der Konnektivität zwischen Pods auf Linux- und Windows-Knoten

Nachdem die Client- und Serverpods nun auf Linux- und Windows-Knoten ausgeführt werden, überprüfen Sie, ob Clientpods auf Linux-Knoten Serverpods auf Windows-Knoten erreichen können.

  1. Öffnen Sie ein PowerShell-Fenster, und laden Sie die Anmeldeinformationen für Ihren Zielcluster mit dem Get-AksHciCredential Befehl.

  2. Bestimmen Sie mit kubectl die IP-Adresse des porter-Pods:

    kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}'
    
  3. Melden Sie sich beim busybox-Pod an, und versuchen Sie, den Portierpod an Port 80 zu erreichen. Ersetzen Sie das Tag <porter_ip> durch die vom vorherigen Befehl zurückgegebene IP-Adresse.

    kubectl exec --namespace calico-demo busybox -- nc -vz <porter_ip> 80
    

    Sie können auch die beiden oben aufgeführten Schritte kombinieren:

    kubectl exec --namespace calico-demo busybox -- nc -vz $(kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}') 80
    

    Wenn die Verbindung zwischen dem busybox-Pod und dem Porterpod erfolgreich ist, erhalten Sie eine Ausgabe ähnlich dem folgenden Beispiel:

    192.168.40.166 (192.168.40.166:80) open
    

    Hinweis

    Die zurückgegebenen IP-Adressen können je nach Umgebungseinrichtung variieren.

  4. Vergewissern Sie sich, dass der pwsh-Pod den nginx-Pod erreichen kann:

    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
    

    Wenn die Verbindung erfolgreich hergestellt wurde, wird eine Ausgabe ähnlich der folgenden angezeigt:

    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. Vergewissern Sie sich, dass der pwsh-Pod den porter-Pod erreichen kann:

    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
    

    Wenn dies erfolgreich ist, wird eine Ausgabe ähnlich dem folgenden Beispiel angezeigt:

    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
    
    

Sie haben nun überprüft, ob die Kommunikation zwischen allen Pods in der Anwendung möglich ist.

Anwenden der Richtlinie auf den Windows-Clientpod

In einer realen Bereitstellung möchten Sie sicherstellen, dass nur Pods, die miteinander kommunizieren sollen, dazu berechtigt sind. Um dies zu erreichen, wenden Sie eine grundlegende Netzwerkrichtlinie an, die es nur dem busybox-Pod ermöglicht, den Porterpod zu erreichen.

Erstellen der Datei „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

Anwenden der Datei „network-policy.yaml“

  1. Öffnen Sie ein PowerShell-Fenster.

  2. Laden Sie die Anmeldeinformationen für den Zielcluster mit dem Get-AksHciCredential-Befehl.

  3. Verwenden Sie kubectl , um die Datei network-policy.yaml anzuwenden:

    kubectl apply -f network-policy.yaml
    

Überprüfen der Wirksamkeit der Richtlinie

Wenn die Richtlinie in Kraft ist, sollte der busybox-Pod weiterhin den porter-Pod erreichen können. Wie bereits erwähnt, können Sie die Schritte in der Befehlszeile kombinieren:

kubectl exec --namespace calico-demo busybox -- nc -vz $(kubectl get po porter -n calico-demo -o 'jsonpath={.status.podIP}') 80

Der pwsh-Pod kann den Porterpod jedoch nicht erreichen:

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

Für die Anforderung wird ein Zeitüberschreitung mit einer Meldung wie der folgenden angezeigt:

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 dieser Demo haben wir Pods auf Linux- und Windows-Knoten konfiguriert, die grundlegende Podkonnektivität überprüft und eine grundlegende Netzwerkrichtlinie zum Isolieren von Pod-zu-Pod-Datenverkehr ausprobiert.

Im letzten Schritt können Sie alle Demoressourcen bereinigen:

kubectl delete namespace calico-demo

Nächste Schritte

In diesem Artikel haben Sie erfahren, wie Sie Datenverkehr zwischen Pods mithilfe von Netzwerkrichtlinien sichern. Als Nächstes haben Sie folgende Möglichkeiten: