k8s的网络发现

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。

image.png

在容器集群中创建一个覆盖网络(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的方式来实现

参考https://blog.csdn.net/huwh_/article/details/77922093

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubern...
    devabel阅读 6,397评论 0 13
  • 1. 组件版本和配置策略 组件版本: Kubernetes 1.10.4 Docker 18.03.1-ce Et...
    Anson前行阅读 5,847评论 0 11
  • 1. 介绍 Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。 K...
    爱学习的ren阅读 1,281评论 0 0
  • 我出生在一个贫寒的家庭环境中。记事起,我每天早晨起床后,第一件事就是喂鹅。刚出生的小鹅,需要喂切碎的莴笋叶子,大约...
    我爱木棉花阅读 515评论 4 6
  • 今天送走了最后一个室友,留下了满室狼藉等我收拾。可我却觉得异常疲惫,动也不想动。 一直想让自己过得平和温暖,却又觉...
    一碗糖ls阅读 457评论 0 0