配置自定义CNI Chain

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

CNI(Container Network Interface)是Kubernetes中实现网络插件的接口标准。CNI Chain是一种CNI插件模式,支持结合多个CNI插件实现更灵活的网络配置。在Kubernetes集群中,CNI Chain可将多个CNI插件组成一个链,每个插件负责处理特定的网络任务,例如IP分配、路由等。当容器创建时,CNI Chain首先调用第一个插件,并将输出传递给下一个插件,直到所有插件都完成任务。

警告

ACK不保证多个CNI插件之间可以协作。配置自定义CNI Chain属于高危操作,请在充分理解多个CNI功能后进行配置,谨慎操作,避免配置错误导致业务中断

前提条件

已创建Kubernetes托管版集群,且集群的网络插件为Terway。更多信息,请参见创建ACK托管集群

使用限制

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}
    }