网络插件

Kubernetes(从 1.3 版本到最新的 1.36 版本,以及后续版本)允许你使用容器网络接口 (CNI) 插件进行集群联网。你必须使用与你的集群兼容且符合你需求的 CNI 插件。在更广泛的 Kubernetes 生态系统中,有多种可用的插件(包括开源和闭源插件)。

需要使用 CNI 插件来实现 Kubernetes 网络模型

你必须使用与 v0.4.0 或更高版本的 CNI 规范兼容的 CNI 插件。Kubernetes 项目建议使用与 v1.0.0 CNI 规范兼容的插件(插件可以同时兼容多个版本)。

安装

在网络环境中,容器运行时(Container Runtime)是节点上配置的守护进程,旨在为 kubelet 提供 CRI 服务。具体来说,必须配置容器运行时以加载实现 Kubernetes 网络模型所需的 CNI 插件。

说明

在 Kubernetes 1.24 之前,CNI 插件也可以由 kubelet 使用 cni-bin-dirnetwork-plugin 命令行参数进行管理。这些命令行参数已在 Kubernetes 1.24 中移除,CNI 的管理不再属于 kubelet 的职责范围。

如果你在移除 dockershim 后遇到问题,请参考 排查 CNI 插件相关错误

有关容器运行时如何管理 CNI 插件的具体信息,请参阅该容器运行时的文档,例如:

有关如何安装和管理 CNI 插件的具体信息,请参阅该插件的文档或 网络提供商 的说明。

网络插件需求

Loopback CNI

除了安装在节点上用于实现 Kubernetes 网络模型的 CNI 插件外,Kubernetes 还要求容器运行时提供一个回环(loopback)接口 lo,该接口用于每个沙箱(Pod 沙箱、虚拟机沙箱等)。实现回环接口可以通过重用 CNI loopback 插件 来完成,也可以通过开发你自己的代码来实现(参见 CRI-O 的此示例)。

支持 hostPort

CNI 网络插件支持 hostPort。你可以使用 CNI 插件团队提供的官方 portmap 插件,或使用你自己的具有端口映射功能的插件。

如果你想启用 hostPort 支持,必须在 cni-conf-dir 中指定 portMappings 功能。例如:

{
  "name": "k8s-pod-network",
  "cniVersion": "0.4.0",
  "plugins": [
    {
      "type": "calico",
      "log_level": "info",
      "datastore_type": "kubernetes",
      "nodename": "127.0.0.1",
      "ipam": {
        "type": "host-local",
        "subnet": "usePodCidr"
      },
      "policy": {
        "type": "k8s"
      },
      "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
      }
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true},
      "externalSetMarkChain": "KUBE-MARK-MASQ"
    }
  ]
}

支持流量整形

实验性功能

CNI 网络插件还支持 Pod 入站和出站流量整形。你可以使用 CNI 插件团队提供的官方 bandwidth 插件,或使用你自己的具有带宽控制功能的插件。

如果你想启用流量整形支持,必须将 bandwidth 插件添加到你的 CNI 配置文件中(默认位置为 /etc/cni/net.d),并确保该二进制文件包含在你的 CNI bin 目录中(默认位置为 /opt/cni/bin)。

{
  "name": "k8s-pod-network",
  "cniVersion": "0.4.0",
  "plugins": [
    {
      "type": "calico",
      "log_level": "info",
      "datastore_type": "kubernetes",
      "nodename": "127.0.0.1",
      "ipam": {
        "type": "host-local",
        "subnet": "usePodCidr"
      },
      "policy": {
        "type": "k8s"
      },
      "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
      }
    },
    {
      "type": "bandwidth",
      "capabilities": {"bandwidth": true}
    }
  ]
}

现在,你可以将 kubernetes.io/ingress-bandwidthkubernetes.io/egress-bandwidth 注解添加到你的 Pod 中。例如:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/ingress-bandwidth: 1M
    kubernetes.io/egress-bandwidth: 1M
...

接下来