网络插件

FEATURE STATE: Kubernetes v1.16feature-state-alpha.txtThis feature is currently in a alpha state, meaning:

  • The version names contain alpha (e.g. v1alpha1).
  • Might be buggy. Enabling the feature may expose bugs. Disabled by default.
  • Support for feature may be dropped at any time without notice.
  • The API may change in incompatible ways in a later software release without notice.
  • Recommended for use only in short-lived testing clusters, due to increased risk of bugs and lack of long-term support.
警告: Alpha 特性迅速变化。

Kubernetes中的网络插件有几种类型:

  • CNI 插件: 遵守 appc/CNI 规约,为互操作性设计。
  • Kubenet 插件:使用 bridgehost-local CNI 插件实现了基本的 cbr0

安装

kubelet 有一个单独的默认网络插件,以及一个对整个集群通用的默认网络。它在启动时探测插件,记住找到的内容,并在 pod 生命周期的适当时间执行所选插件(这仅适用于 Docker,因为 rkt 管理自己的 CNI 插件)。在使用插件时,需要记住两个 Kubelet 命令行参数:

  • cni-bin-dir: Kubelet 在启动时探测这个目录中的插件
  • network-plugin: 要使用的网络插件来自 cni-bin-dir。它必须与从插件目录探测到的插件报告的名称匹配。对于 CNI 插件,其值为 “cni”。

网络插件要求

除了提供NetworkPlugin 接口来配置和清理 pod 网络之外,该插件还可能需要对 kube-proxy 的特定支持。iptables 代理显然依赖于 iptables,插件可能需要确保 iptables 能够监控容器的网络通信。例如,如果插件将容器连接到 Linux 网桥,插件必须将 net/bridge/bridge-nf-call-iptables 系统参数设置为1,以确保 iptables 代理正常工作。如果插件不使用 Linux 网桥(而是类似于 Open vSwitch 或者其它一些机制),它应该确保为代理对容器通信执行正确的路由。

默认情况下,如果未指定 kubelet 网络插件,则使用 noop 插件,该插件设置 net/bridge/bridge-nf-call-iptables=1,以确保简单的配置(如带网桥的 Docker )与 iptables 代理正常工作。

CNI

通过给 Kubelet 传递 —network-plugin=cni 命令行选项来选择 CNI 插件。Kubelet 从 —cni-conf-dir (默认是 /etc/cni/net.d) 读取文件并使用该文件中的 CNI 配置来设置每个 pod 的网络。CNI 配置文件必须与 CNI 规约匹配,并且配置引用的任何所需的 CNI 插件都必须存在于 —cni-bin-dir(默认是 /opt/cni/bin)。

如果这个目录中有多个 CNI 配置文件,则使用按文件名的字典顺序排列的第一个配置文件。

除了配置文件指定的 CNI 插件外,Kubernetes 还需要标准的 CNI lo 插件,最低版本是0.2.0。

支持 hostPort

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

如果你想要启动 hostPort 支持,则必须在 cni-conf-dir 指定 portMappings capability。例如:

  1. {
  2. "name": "k8s-pod-network",
  3. "cniVersion": "0.3.0",
  4. "plugins": [
  5. {
  6. "type": "calico",
  7. "log_level": "info",
  8. "datastore_type": "kubernetes",
  9. "nodename": "127.0.0.1",
  10. "ipam": {
  11. "type": "host-local",
  12. "subnet": "usePodCidr"
  13. },
  14. "policy": {
  15. "type": "k8s"
  16. },
  17. "kubernetes": {
  18. "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
  19. }
  20. },
  21. {
  22. "type": "portmap",
  23. "capabilities": {"portMappings": true}
  24. }
  25. ]
  26. }

支持流量整形

CNI 网络插件还支持 pod 入口和出口流量整形。您可以使用 CNI 插件团队提供的 bandwidth 插件,也可以使用您自己的具有带宽控制功能的插件。

如果您想要启用流量整形支持,你必须将 bandwidth 插件添加到 CNI 配置文件(默认是 /etc/cni/net.d)。

  1. {
  2. "name": "k8s-pod-network",
  3. "cniVersion": "0.3.0",
  4. "plugins": [
  5. {
  6. "type": "calico",
  7. "log_level": "info",
  8. "datastore_type": "kubernetes",
  9. "nodename": "127.0.0.1",
  10. "ipam": {
  11. "type": "host-local",
  12. "subnet": "usePodCidr"
  13. },
  14. "policy": {
  15. "type": "k8s"
  16. },
  17. "kubernetes": {
  18. "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
  19. }
  20. },
  21. {
  22. "type": "bandwidth",
  23. "capabilities": {"bandwidth": true}
  24. }
  25. ]
  26. }

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

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. annotations:
  5. kubernetes.io/ingress-bandwidth: 1M
  6. kubernetes.io/egress-bandwidth: 1M
  7. ...

kubenet

Kubenet 是一个非常基本的、简单的网络插件,仅适用于 Linux。它本身并不实现更高级的功能,如跨节点网络或网络策略。它通常与云驱动一起使用,云驱动为节点间或单节点环境中的通信设置路由规则。

Kubenet 创建名为 cbr0 的网桥,并为每个 pod 创建了一个 veth 对,每个 pod 的主机端都连接到 cbr0。这个 veth 对的 pod 端会被分配一个 IP 地址,该 IP 地址隶属于节点所被分配的 IP 地址范围内。节点的 IP 地址范围则通过配置或控制器管理器来设置。cbr0 被分配一个 MTU,该 MTU 匹配主机上已启用的正常接口的最小 MTU。

使用此插件还需要一些其他条件:

  • 需要标准的 CNI bridgelo 以及 host-local 插件,最低版本是0.2.0。Kubenet 首先在 /opt/cni/bin 中搜索它们。 指定 cni-bin-dir 以提供其它的搜索路径。首次找到的匹配将生效。
  • Kubelet 必须和 —network-plugin=kubenet 参数一起运行,才能启用该插件。
  • Kubelet 还应该和 —non-masquerade-cidr=<clusterCidr> 参数一起运行,以确保超出此范围的 IP 流量将使用 IP 伪装。
  • 节点必须被分配一个 IP 子网,通过kubelet 命令行的 —pod-cidr 选项或控制器管理器的命令行选项 —allocate-node-cidrs=true —cluster-cidr=<cidr> 来设置。

自定义 MTU(使用 kubenet)

要获得最佳的网络性能,必须确保 MTU 的取值配置正确。网络插件通常会尝试推断出一个合理的 MTU,但有时候这个逻辑不会产生一个最优的 MTU。例如,如果 Docker 网桥或其他接口有一个小的 MTU, kubenet 当前将选择该 MTU。或者如果您正在使用 IPSEC 封装,则必须减少 MTU,并且这种计算超出了大多数网络插件的能力范围。

如果需要,您可以使用 network-plugin-mtu kubelet 选项显式的指定 MTU。例如:在 AWS 上 eth0 MTU 通常是 9001,因此您可以指定 —network-plugin-mtu=9001。如果您正在使用 IPSEC ,您可以减少它以允许封装开销,例如 —network-plugin-mtu=8873

此选项会传递给网络插件; 当前 仅 kubenet 支持 network-plugin-mtu

使用总结

  • —network-plugin=cni 用来表明我们要使用 cni 网络插件,实际的 CNI 插件可执行文件位于 —cni-bin-dir(默认是 /opt/cni/bin)下, CNI 插件配置位于 —cni-conf-dir(默认是 /etc/cni/net.d)下。
  • —network-plugin=kubenet 用来表明我们要使用 kubenet 网络插件,CNI bridgehost-local 插件位于 /opt/cni/bincni-bin-dir 中。
  • —network-plugin-mtu=9001 指定了我们使用的 MTU,当前仅被 kubenet 网络插件使用。

反馈

此页是否对您有帮助?

感谢反馈。如果您有一个关于如何使用 Kubernetes 的特定的、需要答案的问题,可以访问Stack Overflow.在 GitHub 仓库上登记新的问题报告问题或者提出改进建议.