在 Azure Stack HCI 上使用 AKS 中的網路原則來保護 pod 之間的流量

使用此逐步指南來確認並試用基本的 pod 至 pod 連線,並在叢集中使用 Calico 網路原則。 在本指南中,您將瞭解如何在 Linux 和 Windows 節點上建立用戶端和伺服器 pod、確認 pod 之間的連線能力,然後套用基本網路原則來隔離 pod 流量。

先決條件

若要在 Azure Stack HCI 上部署 AKS,請遵循在 Azure Stack HCI 上安裝 AKS的步驟。

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

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

在 Linux 節點上建立 pod

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

建立稱為「原則-示範-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

將原則-示範-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 映射。

建立原則-示範-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

將原則-示範-yaml 檔案套用至 Kubernetes 叢集

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

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

kubectl apply -f policy-demo-windows.yaml

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

注意

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

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

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

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上的 porter 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 可連接 porter 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 可以這樣做。

若要達到此目的,您可以套用基本網路原則,以允許只有 >busybox pod 到達 porter pod。

建立網路原則 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

套用網路原則 yaml 檔案

  1. 開啟 PowerShell 視窗。

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

  3. 使用 kubectl 以套用網路原則 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 將無法連線到 porter 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 之間的流量。 接著,您可以: