使用 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。
開啟 PowerShell 視窗,並使用 命令載入目標叢集的
Get-AksHciCredential
認證。使用
kubectl
來判斷 Porter Pod IP 位址:kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}'
登入 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位址可能會根據您的環境設定而有所不同。
確認 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> <...
確認 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 檔案
開啟 PowerShell 視窗。
使用
Get-AksHciCredential
命令載入目標叢集的認證。使用
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 之間的流量。 接著,您可以:
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應