在 Azure Kubernetes Service (AKS) 中設定由 Cilium 提供的 Azure CNI
由 Cilium 提供的 Azure CNI 可結合 Azure CNI 的健全控制平面與 Cilium 的資料平面,以提供高效能的網路和安全性。
藉由使用載入 Linux 核心的 eBPF 程式和更有效率的 API 物件結構,Azure CNI 由 Cilium 提供下列優點:
相當於現有 Azure CNI 和 Azure CNI 重疊外掛程式的功能
已改進的服務路由
更有效率的網路原則強制執行
更好的叢集流量可檢視性
支援較大的叢集 (更多節點、Pod 和服務)
使用由 Cilium 提供的 Azure CNI IP 位址管理 (IPAM)
您可以使用兩種不同的方法來指派 Pod IP,部署由 Cilium 提供的 Azure CNI:
從重疊網路指派 IP 位址 (類似於 Azure CNI 重疊模式)
從虛擬網路指派 IP 位址 (類似於具有動態 Pod IP 指派的現有 Azure CNI)
如果您不確定要選取的選項,請參閱「選擇要使用的網路模型」。
網路原則強制執行
Cilium 強制執行網路原則來允許或拒絕 Pod 之間的流量。 使用 Cilium 時,您不需要安裝個別的網路原則引擎,例如 Azure 網路原則管理員或 Calico。
限制
由 Cilium 提供的 Azure CNI 目前有下列限制:
僅適用於 Linux,不適用於 Windows。
已停用 Cilium L7 原則強制執行。
網路原則無法使用
ipBlock
來允許存取節點或 Pod IP。 如需詳細資料和建議的因應措施,請參閱常見問題。多個 Kubernetes 服務無法使用相同的主機埠搭配不同的通訊協定 (例如 TCP 或 UDP) (Cilium 問題 #14287)。
Pod 透過服務叢集 IP (Cilium 問題 #19406) 連線到本身時,可能會在回復封包上強制執行網路原則。
網路原則不會套用至使用主機網路 (
spec.hostNetwork: true
) 的 Pod,因為這些 Pod 會使用主機身分識別,而不是有個別身分識別。
必要條件
Azure CLI 2.48.1 版或更新版本。 執行
az --version
以尋找目前安裝的版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。如果使用 ARM 範本或 REST API,則 AKS API 版本必須是 2022-09-02 預覽版或更新版本。
注意
以前的 AKS API 版本 (2022-09-02preview 至 2023-01-02preview) 使用 networkProfile.ebpfDataplane=cilium
欄位。 自 2023-02-02preview 起的 AKS API 版本則使用 networkProfile.networkDataplane=cilium
欄位來啟用由 Cilium 提供的 Azure CNI。
使用由 Cilium 提供的 Azure CNI 建立新的 AKS 叢集
選項 1:從重疊網路指派 IP 位址
使用下列命令來建立具有重疊網路和 Cilium 的叢集。 取代 <clusterName>
、<resourceGroupName>
和 <location>
的值:
az aks create \
--name <clusterName> \
--resource-group <resourceGroupName> \
--location <location> \
--network-plugin azure \
--network-plugin-mode overlay \
--pod-cidr 192.168.0.0/16 \
--network-dataplane cilium \
--generate-ssh-keys
注意
--network-dataplane cilium
旗標會取代舊版 aks-preview CLI 延伸模組中使用的已淘汰 --enable-ebpf-dataplane
旗標。
選項 2:從虛擬網路指派 IP 位址
執行下列命令,以建立包含節點子網路和 Pod 子網路的資源群組及虛擬網路。
# Create the resource group
az group create --name <resourceGroupName> --location <location>
# Create a virtual network with a subnet for nodes and a subnet for pods
az network vnet create --resource-group <resourceGroupName> --location <location> --name <vnetName> --address-prefixes <address prefix, example: 10.0.0.0/8> -o none
az network vnet subnet create --resource-group <resourceGroupName> --vnet-name <vnetName> --name nodesubnet --address-prefixes <address prefix, example: 10.240.0.0/16> -o none
az network vnet subnet create --resource-group <resourceGroupName> --vnet-name <vnetName> --name podsubnet --address-prefixes <address prefix, example: 10.241.0.0/16> -o none
使用 --network-dataplane cilium
建立叢集:
az aks create \
--name <clusterName> \
--resource-group <resourceGroupName> \
--location <location> \
--max-pods 250 \
--network-plugin azure \
--vnet-subnet-id /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/virtualNetworks/<vnetName>/subnets/nodesubnet \
--pod-subnet-id /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/virtualNetworks/<vnetName>/subnets/podsubnet \
--network-dataplane cilium \
--generate-ssh-keys
將現有的叢集更新為由 Cilium 提供的 Azure CNI
注意
如果叢集符合下列準則,您可以將現有叢集更新為由 Cilium 提供的 Azure CNI:
- 叢集會使用 Azure CNI 重疊或使用動態 IP 配置的 Azure CNI。 這不包括 Azure CNI。
- 叢集沒有任何 Windows 節點集區。
注意
在具有不同網路原則引擎 (Azure NPM 或 Calico) 的叢集中啟用 Cilium 時,網路原則引擎將會取消安裝並以 Cilium 取代。 如需詳細資訊,請參閱 卸載 Azure 網路原則管理員或 Calico。
警告
升級程序會觸發每個節點集區同時重新映像。 不支援個別升級每個節點集區。 叢集網路的任何中斷都類似於節點映像升級或 Kubernetes 版本升級,其中節點集區中的每個節點都會重新映像。 只有在重新映像所有節點之後,Cilium 才會開始強制執行網路原則。
若要執行升級,您需要使用 Azure CLI 2.52.0 版或更新版本。 執行 az --version
以尋找目前安裝的版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。
使用下列命令,將現有叢集升級至由 Cilium 提供的 Azure CNI。 取代 <clusterName>
和 <resourceGroupName>
的值:
az aks update --name <clusterName> --resource-group <resourceGroupName> \
--network-dataplane cilium
注意
在 AKS 叢集上啟用由 Cilium 提供的 Azure CNI 之後,您無法將其停用。 如果您想要使用不同的網路數據平面,您必須建立新的 AKS 叢集。
常見問題集
我可以自訂 Cilium 設定嗎?
不可以,AKS 會管理 Cilium 組態,且無法修改。 我們建議需要更多控制的客戶使用 AKS BYO CNI,並手動安裝 Cilium。
我能否使用
CiliumNetworkPolicy
自訂資源,而不是 KubernetesNetworkPolicy
資源嗎?CiliumNetworkPolicy
部分支援自定義資源。 客戶可以使用 FQDN 篩選作為進階容器網路服務功能組合的一部分。此
CiliumNetworkPolicy
範例示範符合指定標籤之服務的範例比對模式。apiVersion: "cilium.io/v2" kind: CiliumNetworkPolicy metadata: name: "example-fqdn" spec: endpointSelector: matchLabels: foo: bar egress: - toFQDNs: - matchPattern: "*.example.com"
當
NetworkPolicy
具有允許 IP 位址的ipBlock
時,為什麼流量會遭到封鎖?由 Cilium 提供的 Azure CNI 限制是
NetworkPolicy
的ipBlock
無法選取 Pod 或節點 IP。例如,此
NetworkPolicy
具有允許所有輸出至0.0.0.0/0
的ipBlock
:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: example-ipblock spec: podSelector: {} policyTypes: - Egress egress: - to: - ipBlock: cidr: 0.0.0.0/0 # This will still block pod and node IPs.
不過,套用這個
NetworkPolicy
時,即使 IP 位於ipBlock
CIDR 內,Cilium 仍會封鎖輸出至 Pod 和節點 IP。為了因應此情況,您可以新增
namespaceSelector
和podSelector
來選取 Pod。 下列範例會選取所有命名空間中的所有 Pod:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: example-ipblock spec: podSelector: {} policyTypes: - Egress egress: - to: - ipBlock: cidr: 0.0.0.0/0 - namespaceSelector: {} - podSelector: {}
注意
目前無法使用
ipBlock
來指定NetworkPolicy
以允許流量流向節點 IP。AKS 是否會在 Cilium
daemonset
上設定 CPU 或記憶體限制?不會,AKS 不會在 Cilium
daemonset
上設定 CPU 或記憶體限制,因為 Cilium 是 Pod 網路和網路原則強制執行的重要系統元件。由 Cilium 提供的 Azure CNI 是否使用 Kube-Proxy?
不會,使用網路資料平面 (如 Cilium) 建立的 AKS 叢集不會使用 Kube-Proxy。 如果 AKS 叢集位於 Azure CNI 重疊或 使用動態 IP 配置的 Azure CNI 上,並升級至 AKS 叢集 (其中執行由 Cilium 提供的 Azure CNI),則會在沒有 kube-proxy 的情況下建立新的節點工作負載。 作為此升級程序的一部分,舊版工作負載也會移轉為在沒有 kube-proxy 的情況下執行。
下一步
在下列文章中深入了解 AKS 的網路功能: