Kubernetes网络
2020-03-01
规则
Kubernetes规定网络需要满足以下条件:
- 所有Pod之间可以互通,不能通过NAT
- 所有Node和Pod之间可以互通,不能通过NAT
- 每个Pod拥有唯一的IP
数据流
Container-to-Container
Linux中,每个进程都在network namespace和其他进程通信,共享路由、防火墙、网络设备等。默认均被分配在root network namespace中和外界通信。
Kubernetes中,每个Pod都在独立的network namespace中,Pod内部容器ctr*共享Pod的network namespace。
所以,Pod内的容器之间,可以直接通过localhost进行通信。
Pod-to-Pod
network namespace可以通过虚拟网络设备veth连接,从而实现Pod namespace和root namespace之间通信
veth可以通过网桥cbr连接,通过root namespace的网桥cbr,可以实现Pod namespace之间的通信
跨vm的pod之间通信,原理类似,通过一个vm的eth0出,到另一个vm的eth0进,完成跨节点通信
Pod<->Service
Service是一个逻辑概念,包含所有pod的当前状态,通过iptables等路由规则,完成pod和service之间网络的路由
Internet<->Service
- Egress,流量出到Internet,通常在VPC外包一层Gateway实现
- Ingress,流量从Internet来,L4通过LoadBalancer实现,L7通过Ingress Controller实现
- Ingress Controller检测并创建Ingress资源
- Ingress配置LB和Service对应关系
- Service寻址Pod
Service访问方式
ClusterIP
kubernetes默认值,尽允许集群内部访问
外部访问,需要通过Proxy访问
NodePort
通过节点上指定的port,转发到对应的service上
LoadBalancer
通过云服务提供商LB服务实现
Ingress
通过Ingress资源实现反向代理,访问service
参考: