The Kubernetes network model

在 kubernetes 内部的网络上面我们要解决 4 个问题

  1. Pod 内的 container to conatiner 互联,因为 pod 内的 container 使用了相同的 network namespace,它们可以通过 localhost 互联,所以不需要额外的操作
  2. Pod to Pod 的互联分为以下两类
  3. 同一个 node 中的 pod to pod,一般通过宿主机内部网络栈
  4. 不同 node 之间的 pod to pod,这个是网络主要需要解决的问题
  5. Pod to Service 的连接,需要 Service 的实现来解决,比如 kube-proxy
  6. External to internal service 的联通: 通过 cloud provider 的 LoadBalancer Service 或者 ingress 方式解决,不在我们下面要讨论的范畴内

在 kubernetes 中,每个 pod 拥有自己的 IP,kubernetes 对于网络实现进行了以下强制要求:

  1. 一个 node 中的 pod 可以与集群中任意一个 node 中的任意一个 pod 联通,并且不通过 NAT
  2. 一个 node 中的 agent(比如 daemons,kubelet)可以与这个节点中所有的 pod 联通
  3. 运行在 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 分配由网络模式决定

  1. 如果是 hostnetwork 则 pod ip 就是 node ip
  2. 如果非 hostnetwork,则由 k8s 使用的 CNI 来决定