从底层技术角度看,Pod内不同容器之间共享存储和一些namespace。
PID namespace: Pod中不同应用程序看拿到的其他进程的ID。Sidecar 模式下只能看到一个进程?
Network Namespace: Pod 中的多个容器具有相同的网络配置,共享一个端口范围。
IPC Namespace: Pod中的多个容器能够使用SystemV IPC 或 POSIX消息队列进行通信。
UTS Namespace: Pod中的多个容器共享一个主机名。
在Kubernetes的网络模型中,每台服务器上的容器有自己独立的IP段。
为了实现这一目标,重点解决一下两点:
- 各台服务器上的容器IP段不能重叠,所以需要某种IP段分配机制,为各台机器分配独立的IP段。
- 从某个Pod发出的流量到达所在的机器的Host上时,机器网络层应当根据目标IP地址,将流量转发到目标机器的能力。
综上,两个能力: IP地址分配和Route.
容器之间直接通信,不需要额外的NAT。
Pod to Pod
所有的Pod之间要保证3层网络的联通性
Pod to Service
Servcie 总共有4种类型,其中组常用的就是Cluster IP. 这种类型的Service会分配一个仅集群内可以访问的虚拟IP。
Kubernetes通过kube-proxy组件实现Service Cluster IP的功能。kube-proxy 是一个daemonset
,通过复杂的iptables/IPVS 规则在Pod和Service之间进行各种过滤和NAT.
Pod到集群外
从Pod内部到集群外的流量,Kubernetes会通过SNAT来处理。
Kubernets 默认的组网方案是bridge,CNI主要是用来解决容器的跨机通信。典型的跨机通信方案有bridge和overlay。
创建Pod时候,首先会创建一个pause容器。占用一个 linux的network namespace。Pod内的其他容器共享这个network namespace。此时,只有一个lo设备。 CNI负责初始化pause container 中的网络设备。
kubernetes主机内组网&跨节点组网
kubernetes 经典的主机内组网模型是veth pair+bridge。
跨机通信一般是bridge + overlay。 vxlan
downward API 通过HostAlias修改pod中的/etc/host(Pod在host network下不支持)
Pod的隔离中 network namspce 是最先创建的,如果ns使用了host模式,则uts也会使用host模式。
Pause扮演PID 1的角色,并在子进程成为“孤儿进程”时,通过wait() 收割这些僵尸子进程。
Unix的init进程的作用是当某个子进程由于父进程的错误退出而变成了“孤儿进程”,便会被init进程“收养”并在退出该进程时回收资源。