全部產品
Search
文件中心

Container Service for Kubernetes:為Pod配置固定IP及獨立虛擬交換器、安全性群組

更新時間:Oct 24, 2025

如果您希望為ACK叢集提供精細化的流量管理、流量隔離、網路原則配置和IP管理能力,可以通過使用Terway彈性網卡中繼(Trunk ENI)為每個Pod配置固定IP、獨立的虛擬交換器或安全性群組來實現。

背景資訊

為了給 Pod 配置固定 IP、獨立虛擬交換器及安全性群組,ACK提供基於彈性網卡ENI的網路方案。在 ACK 叢集中,主要通過兩種模式來使用 ENI:

  • 獨佔 ENI 模式:每個 Pod 直接綁定一個獨立的 ENI,享有獨立的網路資源。此模式的網路隔離性較強,但會消耗較多的 ENI 配額,更適用於對網路效能與隔離要求較高的應用。

    使用此模式時,需在建立節點池時配置獨佔 ENI 網路模式

  • Trunk ENI 模式:通過節點上的中繼網卡(Trunk ENI)作為通道,為節點上的多個 Pod 動態提供輔助 ENI。此模式可以提升單節點的 Pod 部署密度,適用於大規模自訂網路設定的情境。

    使用此模式時,需預先在叢集中啟用 Trunk ENI 功能。啟用後,叢集將自動部署 terway-controlplane 組件,負責管理自訂網路設定的生命週期與策略下發。其工作架構如下圖所示。

    基於 Trunk ENI 模式,您還可以啟用Pod 自訂網路設定的能力,按需為部分關鍵 Pod 指定獨立的虛擬交換器、安全性群組和固定 IP,而叢集中其餘的 Pod 仍可沿用預設的共用網路設定,實現了靈活與精細化的管理。

使用限制

  • 如果您的叢集為ACK專有叢集,需到配額平台申請容器網路支援Terway ENI Trunking模式。

  • 單節點所支援的Pod數量有限制,關於節點所支援容器網路Pod數量的詳細描述,請參見使用Terway網路外掛程式

  • Pod安全性群組規則不會應用到同節點Pod之間的流量以及同節點上節點與Pod之間的流量。如果您需要限制,可以通過NetworkPolicy進行配置。

  • Terway 版本要求:

    如需升級Terway,請參見組件
    • Trunk ENI 模式:Terway 版本 ≥ v1.3.0

    • 獨佔 ENI 模式:Terway 版本 ≥ v1.11.0

  • 此功能僅支援 ECS 執行個體。

資料鏈路

下面的資料路徑,描述了使用Trunk(中繼)網卡和獨佔ENI的差異。

Pod獨立配置使用範圍

Pod 獨立配置通過為每個 Pod 建立自己專屬的彈性網卡,為彈性網卡設定Pod 專屬的交換器、安全性群組實現。

Pod 獨立配置依賴下面兩種節點配置模式:

支援中繼網卡的節點

支援彈性網卡的節點(請參考為節點池配置獨佔ENI網路模式

預設支援叢集類型

ACK託管叢集

ACK託管叢集ACK專有叢集

部署密度

普通 Pod 使用共用 eni,指定 Pod 使用獨佔 eni,整體密度高

節點上所有 Pod 只能使用獨佔彈性網卡, 密度低

支援節點類型

ECS 節點

ECS 節點

機型

您需要選擇支援Trunk功能,且響應參數為EniTrunkSupported=true的執行個體。關於執行個體支援情況,請參見DescribeInstanceTypes

支援彈性網卡的機型

適用情境

成本敏感、低並發業務

高效能、低延遲、高並發業務

Kubernetes 資源限制

  • 不支援kube-system空間下的Pod。

  • 不支援使用HostNetwork的Pod。

  • 不支援Label 包含k8s.aliyun.com/ignore-by-terway=true的Pod。

步驟一:為叢集啟用Trunk ENI功能

為建立叢集啟用Trunk ENI功能

建立ACK叢集,網路外掛程式選擇Terway,在Terway模式中選中Trunk ENI支援,該模式的網路外掛程式類型為terway-eniip。詳細資料,請參見建立ACK專有叢集(已停止建立)建立ACK託管叢集

說明

從Kubernetes 1.31開始,建立的ACK託管叢集預設開啟Trunk ENI支援,無需配置。

重要

建立叢集一旦啟用Trunk ENI功能,則不再支援修改。

為已有叢集啟用Trunk ENI功能

前提條件

已有叢集的網路外掛程式類型為terway-eniip。關於Terway網路外掛程式的更多資訊,請參見使用Terway網路外掛程式

說明

可以在叢集的組件管理頁面查看您安裝的網路外掛程式類型。

使用限制

  • 2020年06月之前建立的ACK託管叢集可能不支援此功能,請通過步驟一檢查是否支援。

  • 固定IP及獨立虛擬交換器、安全性群組開啟後不可關閉。

步驟一:查看叢集是否支援使用Trunk ENI功能

重要
  • ACK專有叢集需要額外申請Trunk執行個體使用許可權,請向ECS提交工單申請。

  • 對於存量ACK託管叢集或是由ACK專有叢集遷移過來的ACK託管叢集,需要查看叢集是否支援使用Trunk ENI功能,並修改配置。無需額外申請Trunk執行個體使用許可權。

執行以下命令,檢查token配置。

kubectl get secret -nkube-system addon.network.token

預期輸出如下所示:

NAME                  TYPE     DATA   AGE
addon.network.token   Opaque   1      69m

如果存在token配置,則執行下一步;如果不存在token配置,表明該叢集不支援使用Trunk ENI功能,請建立叢集支援Trunk ENI功能。

步驟二:開啟terway-eniip並為叢集啟用Trunk ENI功能

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

  3. 組件管理頁面,單擊網路頁簽,找到terway-eniip組件。

  4. terway-eniip卡片,單擊升級,升級terway-eniip組件到最新版本。

    如果卡片上沒有升級字樣,說明當前組件已經是最新版本,請跳過此步驟。

  5. 開啟terway-eniip。

    1. 執行如下命令,編輯eni-config。

      kubectl edit cm -nkube-system eni-config
    2. 編輯YAML檔案的eni-config參數:

      參數

      說明

      enable_eni_trunking

      true

      啟用Trunk ENI功能。開啟後不可關閉。

      credential_path

      /var/addon/token-config

      對於ACK託管叢集,如果YAML檔案中不存在該參數,請自行添加。

      重要
      • 請勿修改其他參數。

      • eni-config內容需要為合法JSON格式。

      配置參數樣本如下:

      apiVersion: v1
      data:
        eni_conf: |
          {
            "min_pool_size": 0,
            "enable_eni_trunking": true,
            "credential_path": "/var/addon/token-config",
            ...
          }
      kind: ConfigMap
    3. 執行如下命令,重啟terway pods,使配置生效。

      kubectl delete pod -n kube-system -l app=terway-eniip
  6. 請在terway-eniip參數配置完成後,在組件管理頁面的網路頁簽,安裝terway-controlplane組件。

    安裝結束後,在terway-controlplane卡片上可以看到已安裝字樣。

步驟二:建立網路自訂資源PodNetworking

Terway增加一種名為PodNetworking的自訂資源來描述網路設定。您可以建立多個PodNetworking來規劃不同的網路平面。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 自訂資源

  3. 自訂資源頁面,單擊資源定義(CustomResourceDefinition)頁簽,然後單擊使用YAML建立資源

    建立PodNetworking的樣本如下:

    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodNetworking
    metadata:
      name: example
    spec:
      allocationType:
        type: Fixed # Pod IP分配的策略,可以取值為Elastic或Fixed。
        releaseStrategy: TTL # 只有將type配置為Fixed時,releaseStrategy參數才有效;type的配置為Elastic時,無需配置releaseStrategy和releaseAfter參數。
        releaseAfter: "1h" # 在releaseStrategy為TTL模式下,releaseAfter參數才有效。
      selector:
        podSelector:
          matchLabels:
            foo: bar
        namespaceSelector:
          matchLabels:
            foo: bar
      securityGroupIDs:
      - sg-bpxxxx
      vSwitchOptions:
      - vsw-bpxxxx
      eniOptions:
        eniType: Default

    參數說明如下:

    參數

    說明

    allocationType

    (描述Pod IP分配的策略)

    type

    取值範圍:

    • Elastic:彈性IP策略。Pod刪除後,IP資源被釋放。

    • Fixed:固定IP策略。

      啟用後,該PodNetworking對固定名稱的Pod生效。預設支援StatefulSet和無ownerReferences 的Pod使用。如果您需要設定自訂工作負載,請在組件管理對terway-controlplane進行配置。

      說明

      如果您使用了固定IP策略,Pod重建後的可用性區域將被添加約束,來確保和第一次調度的可用性區域匹配。

    releaseStrategy

    IP釋放策略,只有將type配置為Fixed時,該參數才有效。參數取值範圍如下。

    • TTL:延遲釋放IP策略。當Pod被刪除一段時間後,才會釋放IP,最小值為5分鐘。

    • Never:不釋放IP策略。當您無需使用IP時,需要自行刪除PodENI資源。

    releaseAfter

    延遲回收時間。僅在releaseStrategyTTL模式下生效,支援時間格式為Go time type,請使用hm時間單位 ,例如2h45m5m0s。關於Go time type,請參見Go time type

    selector

    (用於配置標籤選取器,被選中的Pod將使用該網路設定)

    podSelector

    • 用來匹配Pod的Labels,匹配的Pod在建立時將使用這個網路設定。

    • 如果同時配置podSelectornamespaceSelector,符合全部匹配規則的Pod在建立時將使用這個網路設定。

    • 您在配置Pod標籤與PodNetworking中的selector時,請確保有唯一匹配關係,如果Pod被多個PodNetworking配置所匹配,將使用任一匹配的PodNetworking配置。

    namespaceSelector

    • 用來匹配Namespace的Labels,匹配的Pod在建立時將使用這個網路設定。

    • 如果同時配置podSelectornamespaceSelector,符合全部匹配規則的Pod在建立時將使用這個網路設定。

    • 您在配置Pod標籤與PodNetworking中的selector時,請確保有唯一匹配關係,如果Pod被多個PodNetworking配置匹配,將使用任意匹配的PodNetworking配置。

    vSwitchOptions

    -

    • 用於配置Pod使用的vSwitch,多個vSwitchID之間為的關係。Pod僅能使用一個vSwitch,Terway將選擇一個合格vSwitch。

    • 您的Pod部署的可用性區域將被添加約束,來確保這些可用性區域保持和您配置的vSwitchOptions列表中的可用性區域一致。

    • 請確保vSwitchOptions中的vSwitch所在可用性區域與您指定調度的節點可用性區域一致,並且擁有足夠的剩餘IP資源,否則Pod將無法建立。

    說明

    如果您同時啟用了節點自動調整,vSwitchOptions參數添加的可用性區域約束可能導致節點池擴容無法觸發,詳情請參見依賴特定可用性區域啟動並執行Pod無法觸發多可用性區域的節點池擴容 節點自動調整FAQ

    vSwitchSelectOptions

    (配置交換器的選擇策略)

    vSwitchSelectionPolicy

    取值範圍:

    • ordered:預設,按填寫的交換器順序。

    • most:優先使用剩餘IP多的交換器。

    • random:隨機播放交換器。

    說明

    從Terway v1.11.0開始支援。

    securityGroupIDs

    -

    可配置多個安全性群組ID,配置多個安全性群組時將同時生效,安全性群組數量小於等於5個。

    eniOptions

    (配置Pod使用的彈性網卡類型)

    eniType

    取值範圍:

    • Default:預設,在共用ENI叢集,使用Trunk ENI,在獨佔ENI叢集,使用獨佔ENI。

    • ENI:使用獨佔ENI。

    • Trunk:使用Trunk ENI。

    說明

    從Terway v1.11.0開始支援。

  4. 單擊建立

    建立PodNetworking資源後,Terway將同步網路設定資訊,只有在status成為Ready後,該網路資源才能對Pod生效。

    執行以下命令,查看資源狀態是否ready

    kubectl describe PodNetworking example # 請將example換成您自己的自訂資源名稱。

(可選)步驟三:為命名空間添加匹配標籤

在部署PodNetworking自訂資源後,如果通過Namespace標籤將命名空間與PodNetworking的規則相匹配,需要為指定命名空間增加相同的標籤。

  1. 執行以下命令,建立測試命名空間example。

    kubectl create ns example
  2. 執行以下命令,為命名空間打上foo=bar標籤。

    kubectl label namespaces example foo=bar  # 請將example換成您自己指定命名空間名稱。
  3. 執行以下命令,查看命名空間的標籤。

    kubectl get namespace example --show-labels  # 請將example換成您自己指定命名空間名稱。

    預期輸出如下。

     NAME      STATUS   AGE   LABELS
    example   Active   24s   foo=bar,kubernetes.io/metadata.name=example

(可選)步驟四:建立應用Pod

當建立Pod時,Pod將根據標籤與PodNetworking資源進行匹配。如果Pod沒有匹配到任何PodNetworking資源,它將預設使用ENI提供的IP。如果有匹配的PodNetworking,Pod將按照該資源定義的配置來分配ENI。

對於這類Pod,Terway將建立一個名為PodENI的CRD來跟蹤Pod所佔用的網路資源。這個資源由Terway管理。有關Pod標籤的更多資訊,請參見標籤

  1. 使用以下樣本應用的YAML內容,建立名為my-nginx.yaml檔案。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: my-nginx    # 執行個體應用的名稱。
      namespace: example   # 指定命名空間為example。
      labels:
        app: nginx
    spec:
      serviceName: "nginx-service"  
      replicas: 1    
      selector:
        matchLabels:
          app: nginx 
      template:
        metadata:
          labels:
            app: nginx
            foo: bar  # 為Pod添加foo: bar標籤。
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80  
    
    #  如果StatefulSet需要持久化儲存,需要定義volumeClaimTemplates。
    #  例如
    #  volumeClaimTemplates:
    #  - metadata:
    #      name: nginx-storage
    #    spec:
    #      accessModes: ["ReadWriteOnce"]
    #      storageClassName: "my-storage-class"
    #      resources:
    #        requests:
    #          storage: 1Gi
  2. 執行以下命令,部署樣本應用my-nginx。部署完成後,驗證操作請參見如何判斷Pod是否使用了PodNetworking的網路設定?

    kubectl apply -f my-nginx.yaml

ACK專有叢集遷移時,停止terway-controlplane

ACK專有叢集在啟用Pod自訂配置後,不能隨即轉移到ACK託管叢集Pro版。您需要在遷移前停止terway-controlplane,並在遷移後啟用terway-controlplane。

  1. 遷移前準備。

    1. 執行以下命令,停止terway-controlplane。

      kubectl scale deploy -nkube-system terway-controlplane --replicas 0
    2. 執行以下命令,完成webhook配置。

      # 備份webhook配置。
      kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.mutatingwebhookconfigurations.yaml
      kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.validatingwebhookconfigurations.yaml
      # 清理webhook配置。
      kubectl delete -f terway-controlplane.mutatingwebhookconfigurations.yaml
      kubectl delete -f terway-controlplane.validatingwebhookconfigurations.yaml
    3. 執行以下命令,完成service配置。

      # 備份原有service配置
      kubectl get service -nkube-system terway-controlplane -oyaml > terway-controlplane.service.yaml
      # 清理原有service配置
      kubectl delete -f terway-controlplane.service.yaml
  2. 遷移叢集完成後,檢查遷移結果。

    說明

    關於遷移叢集的具體操作,請參見熱遷移ACK專有叢集至ACK託管叢集Pro版

    • 如果遷移叢集失敗,執行以下命令,恢複webhook和terway-controlplane。

      # 恢複service配置
      kubectl apply -f terway-controlplane.service.yaml
      # 恢複webhook配置。
      kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml
      kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml
      # 恢複terway-controlplane。
      kubectl scale deploy -nkube-system terway-controlplane --replicas 1
    • 如果遷移叢集成功,執行以下命令,清理資源。

      kubectl delete deploy -nkube-system terway-controlplane
  3. 組件管理頁面安裝terway-controlplane。具體操作,請參見管理組件

常見問題

如何判斷Pod是否使用了PodNetworking的網路設定?

  1. Pod建立後,在annotations中將以k8s.aliyun.com/pod-networking作為索引值記錄建立該Pod時是否使用了PodNetworking資源。

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        k8s.aliyun.com/pod-eni: "true"
        k8s.aliyun.com/pod-networking: podnetworking
      labels:
        app: example
        pod-ip: elastic
  2. Terway將建立與Pod同名、同命名空間的PodENI資源,用於記錄所使用的網路設定資訊。

    kubectl get podenis.network.alibabacloud.com <my-nginx-0> -n <example> -o yaml # 替換<my-nginx-0>為Pod名稱,<example>為Pod所處命名空間

    輸出內容如下,則說明Pod已經使用PodNetworking配置。

    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodENI
    metadata:
      finalizers:
      - pod-eni
      generation: 1
      name: <my-nginx-0>
      namespace: default
    spec:
      allocations:
      - allocationType:
          type: Elastic
        eni:
          id: eni-bp1xxxx
          mac: 00:16:xx:xx:xx:xx
          securityGroupIDs:
          - sg-bp1xxxx
          vSwitchID: vsw-bp1xxxx
          zone: cn-hangzhou-h
        ipv4: 192.168.x.x
        ipv4CIDR: 192.168.x.x/19
        ipv6: 2408:x:x:x:x:x:x:x
        ipv6CIDR: 2408:x:x:x::/64
      zone: cn-hangzhou-h
    status:
      eniInfos:
        eni-bp1xxxx:
          id: eni-bp1xxxx
          status: Bind
          vid: 1001
      instanceID: i-bp1xxxx
      phase: Bind
      podLastSeen: "2021-xx-xxT00:00:00Z"
      trunkENIID: eni-bp1xxxx

Pod建立後為什麼沒有使用PodNetworking中的網路設定?

  1. 請確保PodNetworking資源狀態為Ready

  2. 請確保Pod標籤和PodNetworking中的標籤可以唯一匹配。

  3. 如果您使用固定IP策略,則非StatefulSet控制器建立的Pod將無法被匹配。

相關文檔