本文說明如何在 AKS 叢集中設定具有容器網路安全性功能的進階容器網路服務。
必要條件
- 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱開始使用 Azure Cloud Shell。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱 使用 Azure CLI 向 Azure 進行驗證。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能的詳細資訊,請參閱 使用和管理 Azure CLI 的擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
本文步驟所需的 Azure CLI 最低版本為 2.71.0。 執行 az --version
以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。
局限性:
- 部分支援通配符 FQDN 原則。 這表示您可以建立符合特定模式與前置通配符的原則(例如 .example.com),但您無法使用通用通配符 () 來比對字段上的所有網域
spec.egress.toPorts.rules.dns.matchPattern
支援的模式:
*.example.com
- 這可讓流量流向 example.com 下的所有子域。app*.example.com
- 此規則更具體,而且只允許流量流向以 「app」 開頭的子域,example.com不支援的模式
*
此嘗試會比對不受支援的任何網域名稱。
- 節點本機 DNS 目前不支援 FQDN 篩選。
- 不支援 Kubernetes 服務名稱。
- 不支援其他 L7 原則。
- 處理每秒超過 1,000 個要求時,FQDN Pod 可能會表現出效能降低。
- 如果停用進階容器網路服務(ACNS)安全性,則會封鎖 FQDN 和 L7 原則(HTTP、HTTPS、Kafka 和 gRPC)。
- 使用 Cilium 網路原則時,Alpine 型容器映射可能會遇到 DNS 解析問題。 這是因為 musl libc 的搜尋網域反覆運算有限。 若要解決此問題,請使用通配符模式明確定義網路原則 DNS 規則中的所有搜尋網域,如下列範例
rules:
dns:
- matchPattern: "*.example.com"
- matchPattern: "*.example.com.*.*"
- matchPattern: "*.example.com.*.*.*"
- matchPattern: "*.example.com.*.*.*.*"
- matchPattern: "*.example.com.*.*.*.*.*"
- toFQDNs:
- matchPattern: "*.example.com"
啟用進階容器網路服務
若要繼續,您必須已啟用進階容器網路服務的 AKS 叢集。
具有 az aks create
進階容器網路服務旗標的 --enable-acns
命令會建立具有所有進階容器網路服務功能的新 AKS 叢集。 這些功能包括:
容器網路可檢視性: 提供網路流量的深入解析。 若要深入瞭解,請造訪 容器網路可觀察性。
容器網路安全性: 提供完整功能變數名稱 (FQDN) 篩選等安全性功能。 若要深入瞭解,請造訪 容器網路安全性。
# Set an environment variable for the AKS cluster name. Make sure to replace the placeholder with your own value.
export CLUSTER_NAME="<aks-cluster-name>"
# Create an AKS cluster
az aks create \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--generate-ssh-keys \
--location eastus \
--network-plugin azure \
--network-dataplane cilium \
--node-count 2 \
--enable-acns
在現有叢集上啟用進階容器網路服務
具有az aks update
進階容器網路服務旗標的--enable-acns
命令會使用所有進階容器網路服務功能來更新現有的 AKS 叢集,包括容器網路可檢視性和容器網路安全性功能
注意
只有具有 Cilium 數據平面的叢集支援進階容器網路服務的容器網路安全性功能。
az aks update \
--resource-group $RESOURCE_GROUP \
--name $CLUSTER_NAME \
--enable-acns
取得叢集認證
使用 az aks get-credentials
命令來取得叢集認證。
az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
使用原則測試連線能力
本節示範如何觀察透過 Cilium 代理程式強制執行的原則。 DNS 要求會傳送給允許的 FQDN,以及封鎖它的另一個案例。
建立名為 demo-policy.yaml
的檔案,並貼上下列 YAML 資訊清單:
注意
在原則中使用 FQDN 時,spec.egress.toPorts.rules.dns.matchPattern
欄位是必要的。 本節會指示 Cilium 檢查 DNS 查詢,並將其與指定的模式比對。 如果沒有本節,Cilium 只會允許 DNS 流量,而不會檢查其內容,以瞭解哪些 IP 與 FQDN 相關聯。 因此,連接到那些 IP地址(即非DNS流量)會遭到封鎖,因為 Cilium 無法將它們與允許的網域產生關聯。
請務必先檢查 限制 區段。
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "allow-bing-fqdn"
spec:
endpointSelector:
matchLabels:
app: demo-container
egress:
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchPattern: "*.bing.com"
- toFQDNs:
- matchPattern: "*.bing.com"
指定 YAML 指令清單的名稱,並使用 [kubectl apply][kubectl-apply]加以套用:
kubectl create ns demo
kubectl apply -f demo-policy.yaml -n demo
建立示範 Pod
建立執行 Bash 的 client
Pod:
kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.43 --labels="app=demo-container" --command -- bash
具有測試 FQDN 之公用程式殼層應該會以下列輸出開啟:
If you don't see a command prompt, try pressing enter.
bash-5.0#
在不同的視窗中,執行下列命令以取得執行中 Pod 的節點。
kubectl get po -n demo --sort-by="{spec.nodeName}" -o wide
輸出應類似下列範例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
client 1/1 Running 0 5m50s 192.168.0.139 aks-nodepool1-22058664-vmss000001 <none> <none>
Pod 正在名為 aks-nodepool1-22058664-vmss000001
的節點上執行。 取得在該節點上執行的 Cilium 代理程式實例:
kubectl get po -n kube-system -o wide --field-selector spec.nodeName="aks-nodepool1-22058664-vmss000001" | grep "cilium"
預期的 cilium-s4x24
應該在輸出中。
cilium-s4x24 1/1 Running 0 47m 10.224.0.4 aks-nodepool1-22058664-vmss000001 <none> <none>
檢查 Cilium 代理程式
cilium
使用 CLI 來監視遭到封鎖的流量。
kubectl exec -it -n kube-system cilium-s4x24 -- sh
Defaulted container "cilium-agent" out of: cilium-agent, install-cni-binaries (init), mount-cgroup (init), apply-sysctl-overwrites (init), mount-bpf-fs (init), clean-cilium-state (init), block-wireserver (init)
#
在這裡殼層內執行 : cilium monitor -t drop
Listening for events on 2 CPUs with 64x4096 of shared memory
Press Ctrl-C to quit
time="2024-10-08T17:48:27Z" level=info msg="Initializing dissection cache..." subsys=monitor
驗證原則
從第一個殼層中,建立允許 FQDN 的要求, *.bing.com
如原則所指定。 此請求應該會成功並獲得代理人的允許。
./agnhost connect www.bing.com:80
然後,對預期遭到封鎖的 FQDN 建立另一個要求:
./agnhost connect www.example.com:80
Cilium 代理程式封鎖了輸出的要求:
xx drop (Policy denied) flow 0xfddd76f6 to endpoint 0, ifindex 29, file bpf_lxc.c:1274, , identity 48447->world: 192.168.0.149:45830 -> 93.184.215.14:80 tcp SYN
清除資源
如果您不打算使用此應用程式,請使用 az group delete
命令刪除您在本文所建立的其他資源。
az group delete --name $RESOURCE_GROUP
下一步
在本操作說明文章中,您已瞭解如何使用適用於 AKS 叢集的進階容器網路服務來安裝和啟用安全性功能。
- 如需 Azure Kubernetes Service (AKS) 進階容器網路服務的詳細資訊,請參閱什麼是 Azure Kubernetes Service (AKS) 進階容器網路服務?。