k8s网络

1) Kubernetes网络模型

  上面提到,集群中的每个Pod都有自己的IP地址,同一个Pod中的容器共享PodIP,能够通过localhost通信,每个Pod可被看作是一个个独立的系统,而Pod中的容器则可被看做同一系统中的不同进程。

      PodIP是集群可见的,即集群中的任何其他Pod和节点都可以通过IP直接与Pod通信,但是Pod是脆弱的,随时可能会动态的创建销毁,所以Podip是可变的,这种情况该怎么解决,kubernetes设计了Service来解决这个问题。

  上面讲Service时提到了ServiceipKubernetes分配的一个虚机地址,在Pod重建时,这个地址不会变化,Service通过部署Podlable来挑选Pod,挑选到的Pod会认为是同一个Service,都可以通过Serviceip访问,Service为多个Pod完成负载均衡,策略一般是轮询,Serviceip是怎么走到容器的呢,是利用的iptables,流程图如下:

上面是通过Cluster ip访问的示意图,但Cluster ip只对集群暴露,外部无法访问,所以Service还支持配置NodePort,也支持指定NodePort的端口,外部访问可以直接通过节点的ip和端口访问Service,同样是通过iptables完成,流程和上面类似。

上面就是kubernetes定义的Pod交互,PodService的交互以及外部访问的模型。

2)网络方案

   为了保证网络方案的标准化、扩展性和灵活性,Kubernetes采用了Container Networking InterfaceCNI)规范。其实本身docker有原生的跨主机通信方案,但是效率很差。所以出现了一系列的开源组件,如flannelcalicoweave等,因为它们都实现了CNI规范,kubernetes支持FlannelCalicoWeave network等多种cni网络Drivers,下面是典型的flannel流程图:

        Kubernetes每个node上都需要启动一个flanneldaemonset,安装了flannel后,cluster中各个Pod要实现相互通信,必须走flannel网络,etcd保证了所有nodeflannel所看到的配置是一致的。同时每个node上的flannel监听etcd上的数据变化,实时感知集群中node的变化。

        flannel network是一个flat network,它为每个node分配不同的子网,node内的flannel 网络直连到docker0,每个Pod被分配唯一的ip地址。各节点的flannel network是通过overlayVxlan通信的,Vxlan上面介绍过,这边就不多说了。Pod访问外部网络时,docker通过docker0iptables完成snat转换,将Pod的地址进行伪装,这样就可以和外网通信了。

 

posted @ 2018-10-10 15:06  Small_office  阅读(437)  评论(0编辑  收藏  举报