全部產品
Search
文件中心

Container Service for Kubernetes:在ACK叢集使用自訂CNI外掛程式

更新時間:Aug 02, 2025

ACK預設提供的Terway和Flannel CNI外掛程式,能夠滿足絕大多數的容器網路需求。但在某些情境下,若您需要使用其他CNI外掛程式中的特定功能,ACK支援通過Bring your own Container Network Interface(簡稱BYOCNI)模式在叢集中安裝自訂CNI外掛程式。本文介紹如何建立未安裝CNI外掛程式的ACK託管叢集Pro版,並手動安裝自訂CNI外掛程式。

責任聲明

容器網路介面(CNI)不僅影響叢集內東西向流量,還影響南北向流量,以及核心組件的部分能力(例如Webhook依賴API Server能夠直接存取Pod)。

對於使用者側在ACK託管叢集Pro版中使用自訂CNI外掛程式產生的故障,阿里雲不提供SLA;自訂CNI外掛程式相關的網路能力需要使用者側自行保障,進行故障排查及修複,ACK不提供相關的支援人員。

如果您需要CNI相關支援,請使用ACK提供的CNI外掛程式,或者使用商業版CNI外掛程式以獲得第三方的專業支援人員。

注意事項

如果您的自訂CNI外掛程式使用Overlay網路,ACK託管叢集Pro版的API Server將無法訪問任何Webhook,影響包括metrics-server在內的所有使用Webhook能力的組件。

步驟一:建立BYOCNI叢集

  1. ACK目前只能通過CreateCluster - 建立叢集或者通過Terraform建立ACK託管叢集的方式建立一個未安裝CNI外掛程式的ACK託管叢集Pro版(簡稱BYOCNI叢集)。您需要在建立叢集時,禁用kube-flannel-ds組件。

    使用OpenAPI

    使用Terraform

    "addons": [
        {
            "name": "kube-flannel-ds",
            "disabled": true
        }
    ]
    addons {
      name     = "kube-flannel-ds"
      disabled = true
    }
  2. (可選)使用VPC路由模式需要額外配置cloud-controller-manager組件。詳細內容,請參見cloud-controller-manager配置

    使用OpenAPI

    使用Terraform

    "addons": [
        {
            "name": "cloud-controller-manager",
            "config": "{\"EnableCloudRoutes\":\"true\",\"BackendType\":\"NodePort\"}"
        }
    ]
    addons {
      name = "cloud-controller-manager"
      config = jsonencode({
        EnableCloudRoutes = "true"
        BackendType       = "NodePort"
      })
    }
  3. 叢集建立成功後,由於未安裝CNI外掛程式,所有節點將處於未就緒 (NotReady) 狀態,這屬於正常現象。成功安裝CNI外掛程式後,節點狀態將自動變為就緒(Ready)。

    image

步驟二:安裝自訂CNI外掛程式

重要

以下步驟僅以安裝Cilium(VPC路由模式)為例。請您根據實際所選的CNI外掛程式調整操作。

在本樣本操作之前,請確保已使用kubectl串連叢集並安裝Helm CLI。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集Installing Helm

本樣本中的Cilium鏡像位于海外倉庫,可能出現拉取失敗的情況。您可參見下列解決方案:
方案一:通過什麼是Container RegistryACR訂閱海外源鏡像,請參見訂閱海外源鏡像
方案二:建立Global AccelerationGA(Global Accelerator)執行個體,使用其覆蓋全球的網路加速服務直接拉取海外源鏡像,請參見使用GA實現ACK跨域加速拉取容器鏡像
  1. 執行以下命令,添加Cilium的helm倉庫。

    helm repo add cilium https://helm.cilium.io/
  2. 執行以下命令安裝Cilium。請根據您的叢集網路規劃,修改命令中的參數。

    helm install --set securityContext.privileged=true \
        --set routingMode=native \
        --set ipam.mode=kubernetes \
        --set ipMasqAgent.enable=true \
        --set ipMasqAgent.config.nonMasqueradeCIDRs='{172.16.0.0/12,10.0.0.0/8 }' \
        --set ipv4NativeRoutingCIDR=172.16.0.0/12 \
        cilium cilium/cilium --version 1.17.4 \
      --namespace kube-system

    關鍵參數說明:

    • ipv4NativeRoutingCIDR:172.16.0.0/12為叢集使用的Pod位址區段。

    • ipMasqAgent.config.nonMasqueradeCIDRs:172.16.0.0/12為叢集使用的Pod位址區段,10.0.0.0/8為叢集使用的VPC位址區段。

    預期輸出:

    NAME: cilium
    LAST DEPLOYED: Fri Jul 18 16:34:50 2025
    NAMESPACE: kube-system
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    You have successfully installed Cilium with Hubble.
    
    Your release version is 1.17.4.
    
    For any further help, visit https://docs.cilium.io/en/v1.17/gettinghelp
  3. 成功安裝Cilium CNI外掛程式之後,節點進入就緒(Ready)狀態。

    image

更多配置

您可以在建立BYOCNI叢集時通過更詳細的參數定製叢集的行為,以更好地滿足CNI外掛程式的需要。

為Node分配PodCIDR

有些CNI外掛程式依賴Node上的PodCIDR屬性為Pod分配IP,您可以在建立叢集的時候指定container_cidrnode_cidr_mask來設定叢集內Pod網段和每個節點上網段的掩碼。

在配置了container_cidrcidr_mask的情況下,叢集內節點將分配PodCIDR,否則節點上不會分配。具體配置方式,請參見CreateCluster - 建立叢集

cloud-controller-manager配置

ACK cloud-controller-manager為BYOCNI叢集提供了可選的能力。您可以在建立叢集時,通過配置cloud-controller-manager addon的參數,開啟和關閉響應的能力。

參數

預設值

是否必填

描述

EnableCloudRoutes

false

當啟用Node上的PodCIDR之後,如果您使用VPC路由表實現Pod之間的互連,您可以啟用cloud-controller-manager的enableCloudRoutes功能,cloud-controller-manager將自動地為每個節點上的PodCIDR段添加一個路由表,從PodCIDR分配的IP地址,在VPC內可以直接存取。

BackendType

NodePort

cloud-controller-manager負責處理LoadBalancer類型的Service,包括建立CLB/NLB、將Pod配置到CLB/NLB後端等。預設情況下,cloud-controller-manager將叢集內的Node IP配置到負載平衡後端,負載平衡將流量轉寄到節點上,再通過節點內Service轉寄的配置轉寄到Pod上。如果您的BYOCNI外掛程式為Pod分配的是VPC IP,您可以直接將Pod IP配置到負載平衡後端,而不需要再通過節點轉寄。

可選值:

  • NodePort:負載平衡後端配置節點IP,通過節點轉寄到Pod。

  • Pod:負載平衡後端直接掛載Pod IP,要求Pod地址必須是VPC地址。

配置樣本:

使用OpenAPI

使用Terraform

"addons": [
    {
        "name": "cloud-controller-manager",
        "config": "{\"EnableCloudRoutes\":\"true\",\"BackendType\":\"NodePort\"}"
    }
]
addons {
  name = "cloud-controller-manager"
  config = jsonencode({
    EnableCloudRoutes = "true"
    BackendType       = "NodePort"
  })
}