在 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 設定嗎?
不可以,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 的網路功能: