Kubernetes 网络实现

发布时间: 更新时间: 总字数:777 阅读时间:2m 作者: IP上海 分享 网址

Kubernetes 网络实现

Kubernetes 网络通信

网络通信要求:

  • 容器间通信:同一个 Pod 内的多个容器间的通信通过 lo
  • Pod 通信:Pod IP <–> Pod IP
  • Pod 与 Service 通信:Pod IP <–> Cluster IP
  • Service 与集群外部客户端的通信:通过 NodePod、LB、Ingress 等

外部访问 Kubernetes 中的 Pod

参考:Service

CNI

CNI(Container Network Interface) 插件:遵守CNI 规范CNI 是 CNCF 的项目。

容器网络解决方案

网络实现

  • Flannel 最为普遍的实现,提供多种网络 backend 实现,覆盖多种场景,缺点不支持网络策略。backend 包括:
    • 用户态的 UDP 实现
    • 内核的 Vxlan 实现
    • host-gw 实现
  • Calico 采用策略路由 + BGP 提供网络直连,功能丰富,对底层网络有要求(MAC 地址直通,不能跨二层域)
  • Canal(Flannel for network + Calico for firewalling) 嫁接型创新项目
  • Cilium 基于 eBPF 和 XDP 的高性能 Overlay 网络方案
  • Kube-router 采用 BGP 提供网络直连,集成基于 LVS 的负载均衡能力
  • Romana 采用 BGP or OSPF 提供网络直连能力的方案
  • WeaveNet 采用 UDP 封装实现 L2 Overlay,支持用户态(慢,可加密)/内核态(快,不能加加密)两种实现

在 Node 节点上,由 kubelet 调用网络插件实现网络功能的,任何部署 kubelet 的节点,都应该部署网络插件。

Kubernetes 网络默认实现

  • 可执行文件目录 --cni-bin-dir(默认是 /opt/cni/bin
  • kubelet 网络插件配置目录 --cni-conf-dir(默认是 /etc/cni/net.d
root@k8s-master:~# ls /etc/cni/net.d
10-flannel.conflist
root@k8s-master:~# cat /etc/cni/net.d/10-flannel.conflist
{
  "name": "cbr0",
  "cniVersion": "0.3.1",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}

其他

Docker 的网络模型:Linux Bridge + 内部保留 IP 优点:容器的网络和外部是解耦的,不占用宿主机的 IP 或资源,完全是虚拟的 实现方式:

  • 当容器访问外部网络时,采用 SNAT 技术借用 Node 的 IP 去访问
  • 当容器对外提供服务时,采用 DNAT 技术,即在 Node 上开一个端口,通过 iptable 把流导入到容器中
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数