使用 Calico 網路原則來保護 Pod 流量

適用於:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS

使用此逐步指南來驗證並試用基本 Pod 對 Pod 連線能力,以及在 Azure Arc 部署所啟用 AKS 的叢集中使用 Calico 網路原則。 本文說明如何在Linux和Windows節點上建立用戶端和伺服器Pod、確認Pod之間的連線,然後套用基本網路原則來隔離AKS Arc中的 Pod 流量。

必要條件

若要部署 AKS Arc,請遵循步驟來 設定 AKS 主機

若要使用本指南,您需要:

  • AKS 工作負載叢集。
  • 在叢集中至少部署一個 Windows 背景工作節點。
  • 在叢集中至少部署一個 Linux 背景工作節點。
  • 建立工作負載叢集時,必須啟用 Calico 網路外掛程式。 如果未啟用此外掛程式,請參閱 New-AksHciCluster 以取得指示。

在 Linux 節點上建立 Pod

首先,在 Linux 節點上建立用戶端 Pod、busybox 和伺服器 Pod、nginx。

建立稱為 policy-demo-linux.yaml 的 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

將 policy-demo-linux.yaml 檔案套用至 Kubernetes 叢集

開啟 PowerShell 視窗,並使用 命令載入目標叢集的 Get-AksHciCredential 認證。

接下來,使用 kubectl 來套用設定 policy-demo-linux.yaml ,如下所示:

kubectl apply -f policy-demo-linux.yaml

在視窗節點上建立 Pod

在 Windows 節點上建立用戶端 Pod pwsh 和伺服器 Pod porter。

注意

Pod 的資訊清單會根據 mcr.microsoft.com/windows/servercore:1809 來使用映像。 如果您使用的是較新的 Windows Server 版本,請更新資訊清單以使用符合您 Windows 伺服器版本的 Server Core 映像。

建立 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

將 policy-demo-windows.yaml 檔案套用至 Kubernetes 叢集

開啟 PowerShell 視窗,並使用 命令載入目標叢集的 Get-AksHciCredential 認證。

接下來,使用 kubectl 套用 policy-demo-windows.yaml 設定:

kubectl apply -f policy-demo-windows.yaml

確認已建立並正在執行四個 Pod

注意

根據您的網路下載速度,啟動 Windows Pod 可能需要一些時間。

開啟 PowerShell 視窗,並使用 命令載入目標叢集的 Get-AksHciCredential 認證。

接下來,使用 kubectl 來列出 calico-demo 命名空間中的 Pod:

kubectl get pods --namespace calico-demo

您應該會看到類似下列範例的結果:

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

每隔幾分鐘重複命令,直到輸出顯示所有四個 Pod 處於執行中狀態。

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

檢查 Linux 和 Windows 節點上的 Pod 之間的連線能力

現在,用戶端和伺服器 Pod 都在 Linux 和 Windows 節點上執行,請確認 Linux 節點上的用戶端 Pod 可以連線至 Windows 節點上的伺服器 Pod。

  1. 開啟 PowerShell 視窗,並使用 命令載入目標叢集的 Get-AksHciCredential 認證。

  2. 使用 kubectl 來判斷 Porter Pod IP 位址:

    kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}'
    
  3. 登入 busybox Pod,並嘗試連線到埠 80 上的 移植器 Pod。 以上一個命令傳回的 IP 位址取代 「<porter_ip>」標籤。

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

    您也可以結合上述兩個步驟:

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

    如果 從 busybox Pod 到 porter Pod 的連線成功,您會收到類似下列範例的輸出:

    192.168.40.166 (192.168.40.166:80) open
    

    注意

    傳回的IP位址可能會根據您的環境設定而有所不同。

  4. 確認 pwsh Pod 可連線至 nginx Pod:

    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
    

    如果連線成功,您會看到類似下列的輸出:

    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. 確認 pwsh Pod 可連線至 nginx Pod:

    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
    

    如果成功,您會看到類似下列範例的輸出:

    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
    
    

您現在已確認應用程式中所有的 Pod 之間都可以進行通訊。

將原則套用至 Windows 用戶端 Pod

在真實世界的部署中,您想要確定只有應該彼此通訊的 Pod 才能這麼做。 若要達到此目的,您可以套用基本網路原則,只允許 忙碌箱 Pod 連線到 移植者 Pod。

建立 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

套用 network-policy.yaml 檔案

  1. 開啟 PowerShell 視窗。

  2. 使用 Get-AksHciCredential 命令載入目標叢集的認證。

  3. 使用 kubectl 來套用 network-policy.yaml 檔案:

    kubectl apply -f network-policy.yaml
    

確認原則已生效

使用原則之後,busybox Pod 應該仍能連線到 porter Pod。 如先前所述,您可以結合命令行中的步驟:

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

不過, pwsh Pod 將無法連線到 移植器 Pod:

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

要求逾時,訊息如下:

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

在此示範中,我們已在Linux和Windows節點上設定Pod、已驗證基本Pod線上能力,並嘗試基本網路原則來隔離Pod對Pod流量。

在最後一個步驟中,您可以清除所有的示範資源:

kubectl delete namespace calico-demo

後續步驟

在本文中,您已了解如何使用網路原則來保護 Pod 之間的流量。 接著,您可以: