Share via


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

    CiliumNetworkPolicy 未正式支援自定義資源。 我們建議客戶使用 Kubernetes NetworkPolicy 資源來設定網路原則。

  • 為什麼當 具有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 輸出。

    因應措施是,您可以新增 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: {}
    

    注意

    目前無法使用 來指定 NetworkPolicyipBlock ,以允許節點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 的網路功能: