网络插件

Kubernetes(1.3 版本至今,包括最新的 1.33 版本,未来也可能继续)允许你使用 容器网络接口(CNI)插件进行集群网络配置。你必须使用一个与你的集群兼容并满足你需求的 CNI 插件。更广泛的 Kubernetes 生态系统中提供了不同的插件(包括开源和闭源的)。

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

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

安装

在网络上下文中,容器运行时是节点上的一个守护进程,配置为为 kubelet 提供 CRI 服务。特别是,必须配置容器运行时来加载实现 Kubernetes 网络模型所需的 CNI 插件。

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

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

网络插件要求

Loopback CNI

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

支持 hostPort

CNI 网络插件支持 hostPort。你可以使用 CNI 插件团队提供的官方 portmap 插件,或者使用带有 portMapping 功能的你自己的插件。

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

{
  "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}
    }
  ]
}

现在你可以为 Pod 添加 kubernetes.io/ingress-bandwidthkubernetes.io/egress-bandwidth 注解。例如:

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

接下来