Kubernetes 网络实现
Kubernetes 网络通信
网络通信要求:
- 容器间通信:同一个 Pod 内的多个容器间的通信通过 lo
 
- Pod 通信:Pod IP <–> Pod IP
 
- Pod 与 Service 通信:Pod IP <–> Cluster IP
 
- Service 与集群外部客户端的通信:通过 NodePod、LB、Ingress 等
 
外部访问 Kubernetes 中的 Pod
- Service 如:NodePort
 
- hostNetwork: 
kubectl explain pod.spec.hostNetwork 
- hostPort: 
kubectl explain pod.spec.containers.ports.hostPort 
- NodePort
 
- LoadBalancer
 
- Ingress
 
- Gateway API
 
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 把流导入到容器中