网络插件

Kubernetes(从版本 1.3 到最新的 1.34,并且可能在未来持续支持)允许你使用 容器网络接口 (CNI) 插件来实现集群网络。你必须使用与你的集群兼容并满足你需求的 CNI 插件。在更广泛的 Kubernetes 生态系统中,有多种插件可用(包括开源和闭源)。

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

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

安装

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

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

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

网络插件要求

环回 CNI

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

支持 hostPort

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

如果你想启用 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
...

下一步