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
参考: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 把流导入到容器中