k8s网络
1) Kubernetes网络模型
上面提到,集群中的每个Pod都有自己的IP地址,同一个Pod中的容器共享Pod的IP,能够通过localhost通信,每个Pod可被看作是一个个独立的系统,而Pod中的容器则可被看做同一系统中的不同进程。
Pod的IP是集群可见的,即集群中的任何其他Pod和节点都可以通过IP直接与Pod通信,但是Pod是脆弱的,随时可能会动态的创建销毁,所以Pod的ip是可变的,这种情况该怎么解决,kubernetes设计了Service来解决这个问题。
上面讲Service时提到了Service的ip是Kubernetes分配的一个虚机地址,在Pod重建时,这个地址不会变化,Service通过部署Pod的lable来挑选Pod,挑选到的Pod会认为是同一个Service,都可以通过Service的ip访问,Service为多个Pod完成负载均衡,策略一般是轮询,Service的ip是怎么走到容器的呢,是利用的iptables,流程图如下:
上面是通过Cluster ip访问的示意图,但Cluster ip只对集群暴露,外部无法访问,所以Service还支持配置NodePort,也支持指定NodePort的端口,外部访问可以直接通过节点的ip和端口访问Service,同样是通过iptables完成,流程和上面类似。
上面就是kubernetes定义的Pod交互,Pod和Service的交互以及外部访问的模型。
2)网络方案
为了保证网络方案的标准化、扩展性和灵活性,Kubernetes采用了Container Networking Interface(CNI)规范。其实本身docker有原生的跨主机通信方案,但是效率很差。所以出现了一系列的开源组件,如flannel,calico,weave等,因为它们都实现了CNI规范,kubernetes支持Flannel、Calico、Weave network等多种cni网络Drivers,下面是典型的flannel流程图:
Kubernetes每个node上都需要启动一个flannel的daemonset,安装了flannel后,cluster中各个Pod要实现相互通信,必须走flannel网络,etcd保证了所有node上flannel所看到的配置是一致的。同时每个node上的flannel监听etcd上的数据变化,实时感知集群中node的变化。
flannel network是一个flat network,它为每个node分配不同的子网,node内的flannel 网络直连到docker0,每个Pod被分配唯一的ip地址。各节点的flannel network是通过overlay的Vxlan通信的,Vxlan上面介绍过,这边就不多说了。Pod访问外部网络时,docker通过docker0的iptables完成snat转换,将Pod的地址进行伪装,这样就可以和外网通信了。