k8s网络场景
- 容器与容器之间的通信
- pod与pod之间的通信
- pod到service之间的通信
- 集群外部与集群内部pod之间的通信
1、pod网络
pod是k8s的最小调度单元,pod更像是一个容器组,包含多个容器,是一个逻辑概念,pod包含的容器都会运行在同一个节点上,这些容器共享一个命名空间,这些容器之间能够直接进行通信,能够在本地访问其他容器的端口
实际上pod第一个创建的会是一个pause容器,他不做任何事情,只是用来提供网络,创建的容器会加入这个容器从而做到网络共享。
pod网络实际上还是容器网络,所以pod-ip就是网络容器的container-ip
2、容器之间的通信
同一个pod之间的不同容器因为位于一个网络命名空间,共享一个ip和网卡,所以可以直接通过localhost进行通信
3、pod之间的通信
3.1、同一个节点上pod之间的通信
同一个节点上的pod的ip,都是通过节点上docker0网卡来分配ip的,可以通过docker0网卡进行转发进行通信,直接通过pod的ip进行通信就可以
3.2、不同节点上pod之间的通信
不同的节点之间,节点的ip相当与外网ip,可以直接访问,而node内的docker0和pod的ip属于内网ip,无法直接跨主机访问,需要通过网卡转发
所以不同Node之间的通信需要达到两个条件:
1、对整个集群中的Pod-IP分配进行规划,不能有冲突(可以通过第三方开源工具来管理,例如flannel)。
2、将Node-IP与该Node上的Pod-IP关联起来,通过Node-IP再转发到Pod-IP。
在容器集群中创建一个覆盖网络(Overlay Network),联通各个节点,目前可以通过第三方网络插件来创建覆盖网络,比如Flannel和Open vSwitch等。
4、Service网络
service的作用就是在pod之间起到代理服务的作用,对外表现为一个单一访问接口,将请求转发给Pod,service的网络转发是Kubernetes实现服务编排的关键一环。
Kubernetes Porxy实现了以下功能:
1、转发访问Service的Service-IP的请求到Endpoints(即Pod-IP)。
2、监控Service和Endpoints的变化,实时刷新转发规则。
3、负载均衡能力。
service实现代理有两种方式,一种是通过iptables
转发方式,另一种是IPVS
的方式
iptables转发
iptables方式会在集群节点上指定iptables
规则,会将请求转接到对应的pod节点
,但是当集群有大量pod的时候,会产生大量的iptables规则,会大量占用cpu资源,甚至宕机,下面介绍IPVS转发方式
IPVS转发
当我们创建了service之后,kube-proxy会在宿主机上建立一个虚拟网卡(kube-ipvs0),并为他分配 Service VIP
作为ip地址,然后,kube-proxy会通过Linux的ipvs模块为这个ip地址设置对应副本数量的虚拟ip,并使用轮询方式进行负载均衡
注意:通过service创建虚拟ip访问pod的方式只在集群内部可以使用,原理是通过宿主机上创建iptables进行通信
集群通过service的方式实现负载均衡有点类似与docker的端口的映射,只不过这里会生成一个虚拟ip让我们进行访问,而不是映射成物理机的端口
5、容器外部访问pod节点
5.1、NodePort
NodePort实现的原理和docker映射端口类似,只不过是在sercice的基础之上,对虚拟ip的端口进行映射,映射成宿主机的端口,通过宿主机:端口的方式来进行访问
5.2、 LoadBalancer
这种方式使用于公有云上的k8s服务
在公有云提供的 Kubernetes 服务里,都使用了一个叫作 CloudProvider
的转接层,来跟公有云本身的 API 进行对接。
当 LoadBalancer
类型的 Service 被提交后,Kubernetes就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端
5.3、 ExternalName
ExternalName
:用于将集群外部的服务引入集群内部,在集群内部可直接访问来获取服务。
通过对域名添加cname的方式来实现