一、介绍
k8s不提供网络通信,提供了CNI接口(Container Network Interface,容器网络接口),由CNI插件实现完成。
1.1 Pod通信
1.1.1 同一节点Pod通信
Pod通过虚拟Ethernet接口对(Veth Pair)与外部通信,Veth像一根网线,一端在Pod内部,一端在Pod外部。同一节点内的Pod通过网桥通信,如下图:veth的另一端连接到网桥,IP地址通过网桥动态获取,与网桥在同一网段,网桥负责转发所有非本地的流量,实现Pod内的互相访问。
1.1.2 不用节点Pod通信
k8s集群内不同节点访问Pod,需要保证Pod ip唯一,所以会给每个节点分配不同的IP,Pod通过网桥获取ip,从而保证Pod IP唯一。在不同节点Pod通过IP互相访问,网络插件大致分成三类:
Overlay模式、路由模式、Underlay模式三类。
- Overlay模式(独立网络)是在节点网络基础上通过隧道封装构建的独立网络,拥有自己独立的IP地址空间、交换或者路由的实现。VXLAN协议是目前最流行的Overlay网络隧道协议之一。
- 路由模式 采用VPC路由表的方式与底层网络相结合,能够更加便捷地连接容器和主机,在性能上会优于Overlay的隧道封装。
- Underlay模式 (直接访问Pod内部网卡)是借助驱动程序将节点的底层网络接口直接暴露给容器使用的一种网络构建技术,享有较高的性能,较为常见的解决方案有IP VLAN等。
二、Service
2.1 作用:解决Pod的访问问题
1、Pod可能被Deployment重建删除,造成Pod的Ip变化。
2、Pod的Ip只有在服务启动后才会被分配,无法预知。
3、一个镜像最后会变成多个Pod,Pod访问需要随机策略。
举个例子,假设有这样一个应用程序,使用Deployment创建了前台和后台,前台会调用后台做一些计算处理,如图1所示。前台一个Pod,后台运行了3个Pod,这些Pod是相互独立且可被替换的,当Pod出现状况被重建时,新建的Pod的IP地址是新IP,前台的Pod无法直接感知。
2.1 使用Service解决Pod的访问问题
k8s的Service就是为了解决Pod访问的问题而设计的。Service有一个固定的IP,Service流量转发给Pod,具体转发给哪些Pod由Label标签选择。Service可以给这些Pod做负载均衡。
添加Service后访问后,Pod访问如下图:
2.2 创建Service yaml示例
2.2.1 创建Deployment