Kubernetes网络

Kubernetes网络

2020-03-01
opensource
kubernetes

规则

Kubernetes规定网络需要满足以下条件:

  • 所有Pod之间可以互通,不能通过NAT
  • 所有Node和Pod之间可以互通,不能通过NAT
  • 每个Pod拥有唯一的IP

数据流

Container-to-Container

alt

Linux中,每个进程都在network namespace和其他进程通信,共享路由、防火墙、网络设备等。默认均被分配在root network namespace中和外界通信。

Kubernetes中,每个Pod都在独立的network namespace中,Pod内部容器ctr*共享Pod的network namespace。

所以,Pod内的容器之间,可以直接通过localhost进行通信。

Pod-to-Pod

alt

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实现

alt

  • Ingress Controller检测并创建Ingress资源
  • Ingress配置LB和Service对应关系
  • Service寻址Pod

Service访问方式

ClusterIP

kubernetes默认值,尽允许集群内部访问

alt

外部访问,需要通过Proxy访问

NodePort

alt

通过节点上指定的port,转发到对应的service上

LoadBalancer

alt

通过云服务提供商LB服务实现

Ingress

alt

通过Ingress资源实现反向代理,访问service

参考: