全部產品
Search
文件中心

Container Service for Kubernetes:配置自訂CNI Chain

更新時間:Jun 19, 2024

CNI(Container Network Interface)是Kubernetes中實現網路外掛程式的介面標準。CNI Chain是一種CNI外掛程式模式,支援結合多個CNI外掛程式實現更靈活的網路設定。在Kubernetes叢集中,CNI Chain可將多個CNI外掛程式組成一個鏈,每個外掛程式負責處理特定的網路任務,例如IP分配、路由等。當容器建立時,CNI Chain首先調用第一個外掛程式,並將輸出傳遞給下一個外掛程式,直到所有外掛程式都完成任務。

警告

ACK不保證多個CNI外掛程式之間可以協作。配置自訂CNI Chain屬於高危操作,請在充分理解多個CNI功能後進行配置,謹慎操作,避免配置錯誤導致業務中斷

前提條件

已建立Kubernetes託管版叢集,且叢集的網路外掛程式為Terway。更多資訊,請參見建立Kubernetes託管版叢集

使用限制

Terway版本需大於等於v1.5.6。關於如何升級組件版本,請參見管理組件

配置自訂CNI Chain

當您需要使用CNI Chain時,需要在Terway設定檔中增加您需要的外掛程式。

操作步驟

  1. 修改Terway設定檔,執行以下命令,修改eni-config設定檔。

    kubectl edit cm -nkube-system eni-config

    配置參數

    說明

    10-terway.conf

    terway CNI 配置,請勿修改其中內容。

    重要

    請勿修改原有配置內容。

    10-terway.conflist

    自訂CNI Chain配置。

    plugins中第一個cni配置應當為10-terway.conf內配置。

    重要

    文檔內配置僅為樣本說明,請勿直接拷貝,導致配置錯誤。

    配置塊的內容應當為JSON格式,請保證格式正確。

    設定檔樣本

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: eni-config
      namespace: kube-system
    data:
      10-terway.conflist: |
          {
            "plugins": [
              {
                "cniVersion": "0.4.0",
                "name": "terway",
                "type": "terway",
                "capabilities": {"bandwidth": true}
              },
              {
                "type": "portmap",
                "capabilities": {"portMappings": true},
                "externalSetMarkChain":"KUBE-MARK-MASQ"
              }
            ]
          }
      10-terway.conf: |
        {
          "cniVersion": "0.4.0",
          "name": "terway",
          "type": "terway",
          "capabilities": {"bandwidth": true}
        }
  2. 使用kubectl rollout restart -n kube-system daemonset.apps/terway-eniip重建Terway Pods。

    若配置正確,您可以在節點etc/cni/net.d/10-terway.conflis設定檔中查看您自訂的外掛程式配置。

使用案例

警告

ACK不保證多個CNI外掛程式之間可以協作。配置自訂CNI Chain屬於高危操作,請在充分理解多個CNI功能後進行配置,謹慎操作,避免配置錯誤導致業務中斷

下文使用案例僅供參考。

設定portmap

Portmap外掛程式的主要職責是將Pod的內部連接埠映射到宿主機的連接埠上,從而允許外部網路訪問Pod的特定服務。

配置樣本

kind: ConfigMap
apiVersion: v1
metadata:
  name: eni-config
  namespace: kube-system
data:
  10-terway.conflist: |
      {
        "plugins": [
          {
            "cniVersion": "0.4.0",
            "name": "terway",
            "type": "terway",
            "capabilities": {"bandwidth": true} 
          },
          {
            "type": "portmap",
            "capabilities": {"portMappings": true},
            "externalSetMarkChain":"KUBE-MARK-MASQ"
          }
        ]
      }

  10-terway.conf: |
    {
      "cniVersion": "0.4.0",
      "name": "terway",
      "type": "terway",
      "capabilities": {"bandwidth": true}
    }

關閉容器內IPv6功能

在容器內,即使您的叢集並未啟用IPv6雙棧功能,容器的網路介面在建立後仍會自動分配一個IPv6本地鏈路地址,屬於fe80::/64網段。這是作業系統核心的預設行為,通常是無害的,並不會干擾正常業務運行。

然而,如果您的應用程式在處理網路地址時存在錯誤,可能會錯誤地將這個IPv6 Link-Local地址識別為Pod的IP,並嘗試使用它進行通訊。但Link-Local地址旨在用於同一鏈路內的裝置間通訊,並不能用於網路通訊,這可能會導致您的應用程式運行異常。在這種情況下,您的應用程式代碼存在缺陷,請優先嚮應用程式的供應商報告並尋求解決方案。

如果您仍然需要在容器內關閉IPv6本地鏈路地址,您可以通過配置tuning外掛程式實現。

配置樣本

kind: ConfigMap
apiVersion: v1
metadata:
  name: eni-config
  namespace: kube-system
data:
  10-terway.conflist: |
      {
        "plugins": [
          {
            "cniVersion": "0.4.0",
            "name": "terway",
            "type": "terway",
            "capabilities": {"bandwidth": true}
          },
          {
            "type": "tuning",
            "sysctl": {
              "net.ipv6.conf.all.disable_ipv6": "1",
              "net.ipv6.conf.default.disable_ipv6": "1",
              "net.ipv6.conf.lo.disable_ipv6": "1"
            }
          }
        ]
      }
  10-terway.conf: |
    {
      "cniVersion": "0.4.0",
      "name": "terway",
      "type": "terway",
      "capabilities": {"bandwidth": true}
    }