在 AKS 中使用網路原則保護 Pod 之間的流量

在 Kubernetes 中執行現代微服務型應用程式時,最好要能控制能與彼此通訊的元件。 最低權限準則應套用至 Azure Kubernetes Service (AKS) 叢集中 Pod 間流量的流動方式。 假設您想要直接封鎖流向後端應用程式的流量。 Kubernetes 中的網路原則功能可讓您針對叢集中 Pod 之間的輸入和輸出流量定義規則。

本文說明如何安裝網路原則引擎,並建立 Kubernetes 網路原則,以控制 AKS 中 Pod 之間的流量。 網路原則可用於 AKS 中以 Linux 為基礎的或以 Windows 為基礎的節點和 Pod。

網路原則概觀

根據預設,AKS 叢集中的所有 Pod 都可以無限制地傳送及接收流量。 為了提升安全性,您可以定義可控制流量流程的規則。 例如,後端應用程式通常只會對必要的前端服務公開。 或者,只有連線到資料庫元件的應用層才能存取它們。

網路原則是 Kubernetes 規格,可定義 Pod 之間通訊的存取原則。 當您使用網路原則時,您可以定義一組已排序的規則來傳送和接收流量。 您可以將規則套用至符合一或多個標籤選取器的 Pod 集合。

網路原則規則會定義為 YAML 指令清單。 網路原則可納入更廣泛的資訊清單中,而該清單也會建立部署或服務。

AKS 中的網路原則選項

Azure 提供三個網路原則引擎來強制執行網路原則:

  • 使用 Azure CNI Powered by Cilium 的 AKS 叢集 Cilium。
  • Azure 網路原則管理員
  • Calico 是 Tigera建立的開放原始碼網路和網路安全性解決方案。

Cilium 是我們建議的網路原則引擎。 Cilium 會使用Linux Berkeley Packet Filter (BPF) 在流量上強制執行網路原則,這通常比 “IPTables” 更有效率。 如需詳細資訊, 請參閱由 Cilium 提供的 Azure CNI 檔
若要強制執行指定的原則,適用於Linux的 Azure 網路原則管理員會使用Linux IPTable。 適用於 Windows 的 Azure 網路原則管理員會使用 主機網路服務 (HNS) ACLPolicies。 這些原則會轉譯成一組允許和不允許的 IP 配對。 然後,這些配對會以 或 HNS ACLPolicy 篩選規則進行IPTable程序設計。

網路原則引擎之間的差異:Cilium、Azure NPM 和 Calico

功能 Azure Network Policy Manager Calico Cilium
支援的平台 Linux、Windows Server 2022 (預覽版)。 Linux、Windows Server 2019 和 2022。 Linux。
支援的網路功能選項 Azure 容器網路介面 (CNI)。 Azure CNI (Linux、Windows Server 2019 和 2022) 和 kubenet (Linux)。 Azure CNI。
符合 Kubernetes 規格 支援所有原則類型 支援所有原則類型。 支援所有原則類型。
其他功能 無。 由全域網路原則、全域網路集和主機端點組成的延伸原則模型。 如需使用 calicoctl CLI 管理這些擴充功能的詳細資訊,請參閱 calicoctl 使用者參考 無。
支援 Azure 支援和工程小組支援。 Azure 支援和工程小組支援。 Azure 支援和工程小組支援。

限制

Azure Network Policy Manager 不支援 IPv6。 否則,Azure 網路原則管理員完全支援 Linux 中的網路原則規格。

在 Windows 中,Azure 網路原則管理員不支援:

  • 具名埠。
  • 串流控制傳輸通訊協定(SCTP)。
  • 負比對標籤或命名空間選取器(例如,除了 以外的 debug=true所有標籤)。
  • except 無類別網路由 (CIDR) 區塊(例外的 CIDR)。

注意

如果建立不受支援的原則,則 Azure Network Policy Manager Pod 記錄會記錄錯誤。

調整

使用適用於Linux的 Azure 網路原則管理員,我們不允許調整超過250個節點和20,000個Pod。 如果您嘗試調整超過這些限制,可能會遇到「記憶體不足」(OOM) 錯誤。 若要增加記憶體限制,請建立支援票證。

開始之前

您必須安裝並設定 Azure CLI 版本 2.0.61 或更新版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

建立 AKS 叢集並啟用網路原則

若要查看作用中的網路原則,您可以建立支持網路原則的 AKS 叢集,然後處理新增原則。

若要使用 Azure Network Policy Manager,您必須使用 Azure CNI 外掛程式。 Calico 可以搭配 Azure CNI 外掛程式或 Kubenet CNI 外掛程式使用。

下列範例腳本會建立具有系統指派身分識別的 AKS 叢集,並使用 Azure 網路原則管理員啟用網路原則。

注意

Calico 可以搭配 --network-plugin azure--network-plugin kubenet 參數使用。

您也可以使用使用者指派的身分識別,而不是使用系統指派的身分識別。 如需詳細資訊,請參閱使用受控識別

建立已啟用 Azure Network Policy Manager 的 AKS 叢集 - 僅限 Linux

在本節中,您會建立已啟用Linux節點集區和 Azure 網路原則管理員的叢集。

首先,您可以取代和 $CLUSTER_NAME 變數的值$RESOURCE_GROUP_NAME

$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$LOCATION=canadaeast

建立 AKS 叢集,並針對 network-pluginnetwork-policy 指定 azure

若要建立叢集,請使用下列命令:

az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --network-plugin azure \
    --network-policy azure

建立已啟用 Azure 網路原則管理員的 AKS 叢集 - Windows Server 2022 (預覽)

在本節中,您會建立已啟用 Windows 節點集區和 Azure 網路原則管理員的叢集。

注意

具有 Windows 節點的 Azure Network Policy Manager 只能在 Windows Server 2022 上使用。

安裝 aks-preview Azure CLI 延伸模組

重要

AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

若要安裝 aks-preview 擴充功能,請執行下列命令:

az extension add --name aks-preview

若要更新至發行的最新版本擴充功能,請執行下列命令:

az extension update --name aks-preview

註冊 WindowsNetworkPolicyPreview 功能旗標

使用 az feature register 命令以註冊 WindowsNetworkPolicyPreview 功能旗標,如下列範例所示:

az feature register --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"

狀態需要幾分鐘的時間才會顯示「已註冊」。 使用 az feature show 命令以驗證註冊狀態:

az feature show --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"

當狀態反映已註冊時,請使用 az provider register 命令重新整理資源提供者的Microsoft.ContainerService註冊

az provider register --namespace Microsoft.ContainerService

建立 AKS 叢集

現在,您會取代、 $CLUSTER_NAME$WINDOWS_USERNAME 變數的值$RESOURCE_GROUP_NAME

$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$WINDOWS_USERNAME=myWindowsUserName
$LOCATION=canadaeast

建立使用者名稱,以做為叢集上 Windows Server 容器的管理員認證。 下列命令會提示您輸入使用者名稱。 請將它設定為 $WINDOWS_USERNAME。 請記住,本文中的命令會輸入Bash殼層。

echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME

若要建立叢集,請使用下列命令:

az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --windows-admin-username $WINDOWS_USERNAME \
    --network-plugin azure \
    --network-policy azure

建立叢集需要幾分鐘的時間。 根據預設,您的叢集只會使用 Linux 節點集區來建立。 如果您想要使用 Windows 節點集區,可以新增一個。 以下是範例:

az aks nodepool add \
    --resource-group $RESOURCE_GROUP_NAME \
    --cluster-name $CLUSTER_NAME \
    --os-type Windows \
    --name npwin \
    --node-count 1

建立已啟用 Calico 的 AKS 叢集

建立 AKS 叢集並指定 --network-plugin azure、 與 --network-policy calico。 指定 --network-policy calico 可在Linux和 Windows 節點集區上啟用 Calico。

如果您打算將 Windows 節點集區新增至叢集,請包含windows-admin-username符合 Windows Server 密碼需求的windows-admin-password 參數。

重要

目前,搭配 Windows 節點使用 Calico 網路原則可在新的叢集上使用 Kubernetes 1.20 版或更新版本搭配 Calico 3.17.2,並要求您使用 Azure CNI 網路。 已啟用 Calico 的 AKS 叢集上的 Windows 節點預設也會啟用浮動 IP。

對於只有執行 Kubernetes 1.20 且舊版 Calico 的 Linux 節點集區,Calico 版本會自動升級至 3.17.2。

建立使用者名稱,以做為叢集上 Windows Server 容器的管理員認證。 下列命令會提示您輸入使用者名稱。 請將它設定為 $WINDOWS_USERNAME。 請記住,本文中的命令會輸入Bash殼層。

echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --windows-admin-username $WINDOWS_USERNAME \
    --network-plugin azure \
    --network-policy calico

建立叢集需要幾分鐘的時間。 根據預設,您的叢集只會使用 Linux 節點集區來建立。 如果您想要使用 Windows 節點集區,可以新增一個。 例如:

az aks nodepool add \
    --resource-group $RESOURCE_GROUP_NAME \
    --cluster-name $CLUSTER_NAME \
    --os-type Windows \
    --name npwin \
    --node-count 1

在現有的叢集中安裝 Azure 網路原則管理員或 Calico

也支援在現有的 AKS 叢集上安裝 Azure 網路原則管理員或 Calico。

警告

升級程序會觸發每個節點集區同時重新映像。 不支援個別升級每個節點集區。 叢集網路的任何中斷都類似於節點映像升級或 Kubernetes 版本升級,其中節點集區中的每個節點都會重新映像。

安裝 Azure 網路原則管理員的範例命令:

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy azure

安裝 Calico 的範例命令:

警告

此警告適用於將已啟用 Calico 的 Kubenet 叢集升級至已啟用 Calico 的 Azure CNI 重疊。

  • 在已啟用 Calico 的 Kubenet 叢集中,Calico 會作為 CNI 和網路原則引擎使用。
  • 在 Azure CNI 叢集中,Calico 僅用於網路原則強制執行,而不是 CNI。 這可能會導致 Pod 啟動時和 Calico 允許來自 Pod 的輸出流量之間的短暫延遲。

建議使用 Cilium 而非 Calico 來避免此問題。 在由 Cilium 提供 Powered 的 Azure CNI 深入了解 Cilium

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy calico

將已安裝 Azure NPM 或 Calico 的現有叢集升級至由 Cilium 提供的 Azure CNI

若要將已安裝網路原則引擎的現有叢集升級至由 Cilium 支援的 Azure CNI,請參閱 將現有的叢集升級至由 Cilium 支援的 Azure CNI

確認網路原則設定

當叢集備妥時,請使用 az aks get-credentials 命令,設定 kubectl 以連線到 Kubernetes 叢集。 此命令會下載認證,並設定 Kubernetes CLI 以使用認證:

az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME

若要開始驗證網路原則,您可以建立範例應用程式並設定流量規則。

首先,建立名為 demo 的命名空間以執行範例 Pod:

kubectl create namespace demo

現在,在名為 clientserver的叢集中建立兩個 Pod。

注意

如果您想要排程特定節點上的用戶端或伺服器,請在 Pod 建立 kubectl run 命令中的 自變數之前--command新增下列位:

--overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "linux|windows"}}}'

建立 server Pod。 此 Pod 在 TCP 連接埠 80 上提供:

kubectl run server -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --labels="app=server" --port=80 --command -- /agnhost serve-hostname --tcp --http=false --port "80"

建立 client Pod。 下列命令會在 client Pod 上執行 Bash:

kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --command -- bash

現在,在個別視窗中執行下列命令,以取得伺服器 IP:

kubectl get pod --output=wide -n demo

輸出應會顯示如下:

NAME     READY   STATUS    RESTARTS   AGE   IP            NODE             NOMINATED NODE   READINESS GATES
server   1/1     Running   0          30s   10.224.0.72   akswin22000001   <none>           <none>

測試沒有網路原則的連線能力

在用戶端的殼層中,執行下列命令來驗證與伺服器的連線。 使用執行上一個指令的輸出中找到的 IP 來取代 server-ip 。 如果連線成功,則沒有輸出。

/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp

使用網路原則測試連線能力

若要新增網路原則,請建立名為 demo-policy.yaml 的檔案,並貼上下列 YAML 指令清單:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: demo-policy
  namespace: demo
spec:
  podSelector:
    matchLabels:
      app: server
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: client
    ports:
    - port: 80
      protocol: TCP

指定 YAML 指令清單的名稱,並使用 kubectl apply 加以套用

kubectl apply –f demo-policy.yaml

現在,在用戶端的殼層中,執行下列 /agnhost 命令來確認與伺服器的連線:

/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp

因為伺服器已加上標籤,但用戶端未加上標籤app=server,因此會封鎖流量 連線。 上述 connect 命令會產生下列輸出:

TIMEOUT

執行下列命令來標記 client ,並驗證與伺服器的連線。 輸出應該不會傳回任何內容。

kubectl label pod client -n demo app=client

卸載 Azure 網路原則管理員或 Calico (預覽版)

需求:

  • aks-preview Azure CLI 擴充功能 0.5.166 版或更新版本。 請參閱 安裝 aks-preview Azure CLI 擴充功能
  • Azure CLI 2.54 版或更新版本
  • AKS REST API 版本 2023-08-02-preview 或更新版本

注意

  • 卸載程式不會移除 Calico 所使用的自訂資源定義 (CRD) 和自訂資源 (CR)。 這些CRD和CR都有以「projectcalico.org」 或 「tigera.io」 結尾的名稱。 成功卸載 Calico 之後,可以手動刪除這些 CRD 和相關聯的 CR(在移除 Calico 中斷叢集之前刪除 CRD)。
  • 升級不會移除叢集中的任何 NetworkPolicy 資源,但在卸載之後,不會再強制執行這些原則。

警告

升級程序會觸發每個節點集區同時重新映像。 不支援個別升級每個節點集區。 叢集網路的任何中斷都類似於節點映像升級或 Kubernetes 版本升級,其中節點集區中的每個節點都會重新映像。

若要從叢集移除 Azure 網路原則管理員或 Calico,請執行下列命令:

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy none

清除資源

在本文中,您已建立命名空間和兩個 Pod,並套用網路原則。 若要清除這些資源,請使用 kubectl delete 命令並指定資源名稱:

kubectl delete namespace demo

下一步

如需網路資源的詳細資訊,請參閱 Azure Kubernetes Service (AKS) 中應用程式的網路概念。

若要深入了解原則,請參閱 Kubernetes 網路原則