在 Azure Kubernetes Service 中設定由 Cilium 提供的 Azure CNI (AKS)
由 Cilium 提供的 Azure CNI 結合了 Azure CNI 的強固控制平面與 Cilium 的數據平面,以提供高效能的網路和安全性。
藉由使用載入至Linux核心的 eBPF 程式和更有效率的 API 對象結構,Azure CNI 由 Cilium 提供下列優點:
相當於現有 Azure CNI 和 Azure CNI 重疊外掛程式的功能
改善的服務路由
更有效率的網路原則強制執行
更佳的叢集流量可檢視性
支援較大的叢集(更多節點、Pod 和服務)
IP 位址管理 (IPAM) 與由 Cilium 支援的 Azure CNI
您可以使用兩種不同的方法來部署由 Cilium 提供的 Azure CNI,以指派 Pod IP:
從重疊網路指派 IP 位址(類似於 Azure CNI 重疊模式)
從虛擬網路指派 IP 位址(類似於具有動態 Pod IP 指派的現有 Azure CNI)
如果您不確定要選取的選項,請參閱 「選擇要使用的網路模型」。
網路原則強制執行
Cilium 會 強制執行網路原則,以允許或拒絕 Pod 之間的流量。 使用 Cilium 時,您不需要安裝個別的網路原則引擎,例如 Azure 網路原則管理員或 Calico。
限制
由 Cilium 提供的 Azure CNI 目前有下列限制:
僅適用於Linux,不適用於Windows。
Cilium L7 原則強制執行已停用。
Hubble 已停用。
網路原則無法用來
ipBlock
允許存取節點或 Pod IP。 如需詳細資訊和建議的因應措施,請參閱常見問題。不支援具有
internalTrafficPolicy=Local
的 Kubernetes 服務(Cilium 問題 #17796)。多個 Kubernetes 服務無法使用相同的主機埠搭配不同的通訊協定(例如 TCP 或 UDP)(Cilium 問題 #14287)。
當 Pod 透過服務叢集 IP 連線到本身時,可能會對回復封包強制執行網路原則(Cilium 問題 #19406)。
必要條件
Azure CLI 2.48.1 版或更新版本。 執行
az --version
以查看目前安裝的版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。如果使用 ARM 範本或 REST API,AKS API 版本必須是 2022-09-02-preview 或更新版本。
注意
先前的 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 的叢集。 取代、 <resourceGroupName>
與<location>
值<clusterName>
:
az aks create --name <clusterName> --resource-group <resourceGroupName> --loctaion <location> \
--network-plugin azure \
--network-plugin-mode overlay \
--pod-cidr 192.168.0.0/16 \
--network-dataplane cilium
注意
旗 --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
將現有的叢集升級至由 Cilium 提供的 Azure CNI
注意
如果叢集符合下列準則,您可以將現有的叢集更新為由 Cilium 提供的 Azure CNI:
- 叢集會使用 Azure CNI Overlay 或 Azure CNI 搭配動態 IP 配置。 這不包括 Azure CNI。
- 叢集沒有任何 Windows 節點集區。
注意
在具有不同網路原則引擎 (Azure NPM 或 Calico) 的叢集中啟用 Cilium 時,網路原則引擎將會卸載並以 Cilium 取代。 如需詳細資訊,請參閱 卸載 Azure 網路原則管理員或 Calico 。
警告
升級程式會觸發每個節點集區同時重新映像。 不支援個別升級每個節點集區。 叢集網路的任何中斷都類似於節點映射升級或 Kubernetes 版本升級 ,其中節點集區中的每個節點都會重新建立映像。
只有在重新映像所有節點之後,Cilium 才會開始強制執行網路原則。
若要執行升級,您需要 Azure CLI 2.52.0 版或更新版本。 執行 az --version
以查看目前安裝的版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。
使用下列命令,將現有的叢集升級至由 Cilium 提供的 Azure CNI。 取代與<resourceGroupName>
值<clusterName>
:
az aks update --name <clusterName> --resource-group <resourceGroupName> \
--network-dataplane cilium
常見問題集
我可以自定義 Cilium 設定嗎?
否,AKS 會管理 Cilium 設定,且無法修改。 我們建議需要更多控制權的客戶使用 AKS BYO CNI ,並手動安裝 Cilium。
是否可以使用
CiliumNetworkPolicy
自定義資源,而不是 KubernetesNetworkPolicy
資源?CiliumNetworkPolicy
未正式支援自定義資源。 我們建議客戶使用 KubernetesNetworkPolicy
資源來設定網路原則。為什麼當 具有
ipBlock
允許IP位址的時NetworkPolicy
,流量會遭到封鎖?由 Cilium 提供的 Azure CNI 限制是
NetworkPolicy
,無法ipBlock
選取 Pod 或節點 IP。例如,這
NetworkPolicy
具有ipBlock
允許所有輸出到0.0.0.0/0
的 :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位於CIDR內,Cilium仍會封鎖對Pod和節點IP的ipBlock
輸出。因應措施是,您可以新增
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: {}
注意
目前無法使用 來指定
NetworkPolicy
ipBlock
,以允許節點IP的流量。AKS 是否會在 Cilium
daemonset
上設定 CPU 或記憶體限制?否,AKS 不會在 Cilium 上設定 CPU 或記憶體限制,因為 Cilium
daemonset
是 Pod 網路和網路原則強制執行的重要系統元件。由 Cilium 提供的 Azure CNI 是否使用 Kube-Proxy?
否,使用網路數據平面建立的 AKS 叢集,因為 Cilium 不會使用 Kube-Proxy。 如果 AKS 叢集位於 Azure CNI 重疊 或 具有動態 IP 配置的 Azure CNI 或 Azure CNI 上,而且會升級至由 Cilium 提供之 Azure CNI 的 AKS 叢集,則會在沒有 kube-proxy 的情況下建立新的節點工作負載。 舊版工作負載也會移轉為在沒有 kube-proxy 的情況下執行,作為此升級程式的一部分。
下一步
在下列文章中深入了解 AKS 的網路功能: