The Kubernetes network model
在 kubernetes 内部的网络上面我们要解决 4 个问题
- Pod 内的 container to conatiner 互联,因为 pod 内的 container 使用了相同的 network namespace,它们可以通过 localhost 互联,所以不需要额外的操作
- Pod to Pod 的互联分为以下两类
- 同一个 node 中的 pod to pod,一般通过宿主机内部网络栈
- 不同 node 之间的 pod to pod,这个是网络主要需要解决的问题
- Pod to Service 的连接,需要 Service 的实现来解决,比如 kube-proxy
- External to internal service 的联通: 通过 cloud provider 的 LoadBalancer Service 或者 ingress 方式解决,不在我们下面要讨论的范畴内
在 kubernetes 中,每个 pod 拥有自己的 IP,kubernetes 对于网络实现进行了以下强制要求:
- 一个 node 中的 pod 可以与集群中任意一个 node 中的任意一个 pod 联通,并且不通过 NAT
- 一个 node 中的 agent(比如 daemons,kubelet)可以与这个节点中所有的 pod 联通
- 运行在 hostnetwork 的 pod 可以与与集群中任意一个 node 中的任意一个 pod 联通,并且不通过 NAT
Container Network Interface(CNI)
上面对 kubernetes network model 的实现就是通过 CNI 来实现
ToB 的环境最终会使用某一个 CNI 的实现,一般是 overlay 的网络,最常见的就是 flannel
这里的建议是,对于那种读写性能要求很高的服务,比如 bytestore,可以使用 hostnetwork,而对于一般的业务,推荐走 CNI
Pod != IP Pod != IP Pod != IP
k8s 本身只认 pod name, IP 分配由网络模式决定
- 如果是 hostnetwork 则 pod ip 就是 node ip
- 如果非 hostnetwork,则由 k8s 使用的 CNI 来决定