全部產品
Search
文件中心

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

更新時間:Oct 25, 2024

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

背景資訊

彈性網卡中繼(Trunk ENI)是一種新的虛擬網卡。除了提供原有彈性網卡(ENI)相同的功能外,還支援將額外的ENI掛載到Trunk ENI上使用。這部分額外的ENI將以獨佔的方式分配給Pod。

在為叢集啟用Trunk ENI功能後,可以讓一部分Pod使用自訂配置,另外的Pod則使用共用配置。Pod自訂配置是可選功能,預設情況下建立的Pod使用的是共用ENI上的IP地址。只有當您主動聲明為指定Pod開啟自訂配置後,相應的Pod才能使用自訂配置。

啟用Pod自訂配置後,叢集內將部署terway-controlplane組件,其工作模式如下圖所示。

使用限制

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

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

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

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

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

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

為建立叢集啟用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提交工單申請即可使用Trunk ENI功能。

  • 對於存量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-enniip。

    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. 自訂資源頁面,單擊使用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
    status:
      status: Ready               

    參數說明如下:

    參數

    說明

    allocationType

    (描述Pod IP分配的策略)

    type

    取值範圍:

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

    • Fixed:固定IP策略。

      啟用後,該PodNetworking只對有狀態(StatefulSet)的Pod生效。關於StatefulSet,請參見Kubernetes具狀態服務-StatefulSet使用最佳實務

      說明

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

    releaseStrategy

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

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

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

    releaseAfter

    延遲回收時間。僅在releaseStrategyTTL模式下生效,支援時間格式為Go time type,例如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將無法建立。

    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自訂資源後,需要為指定命名空間增加匹配的標籤,確保與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
  2. 遷移叢集完成後,檢查遷移結果。

    說明

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

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

      # 恢複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 your-pod-name -n default -oyaml
    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodENI
    metadata:
      finalizers:
      - pod-eni
      generation: 1
      name: your-pod-name
      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將無法被匹配。

相關文檔