共用方式為


在 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自訂資源,而不是 Kubernetes NetworkPolicy 資源嗎?

    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 限制是 NetworkPolicyipBlock 無法選取 Pod 或節點 IP。

    例如,此 NetworkPolicy 具有允許所有輸出至 0.0.0.0/0ipBlock

    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。

    為了因應此情況,您可以新增 namespaceSelectorpodSelector 來選取 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 的網路功能: