kubernetes 通信浅谈

kubernetes 通信浅谈

咱们在平常工做中,能碰见的状况只有下面三种,k8s集群内部之间的相互链接,k8s集群内部访问k8s集群外部的服务,还有就是k8s集群外部服务访问k8s集群内部的访问。下面咱们来说解下他们都是如何实现的,咱们将使用分步的方式来说解html

kubernetes集群内部的通信

当k8s里面只有两个POD之间的通讯是最为简单的
image.png
上图所示是咱们Pod B客户端去连接请求Pod A服务端,这个时候咱们只须要把Pod A的地址告诉Pod B便可,这个时候Pod A扛不住请求了,咱们须要在扩展一个Pod A
image.png
那我门是否是就想要办法在Pod A服务端前面放个Nginx或者什么的来作负载,只有这样Pod B才能按照之前的地址去请求服务啊,因此咱们这个时候在Pod A上面添加上一个service服务
image.png
svc资源经过matchLables字段选择打有对应标签的Pod,这个时候Pod B在来请求服务的时候就直接去访问SVC A,咱们告诉Pod B SVC A所对应的IP地址是什么,SVC A会自动负载到后端的POD A上,须要注意的是:当这个时候若是 A服务仍是扛不住压力,那咱们就只须要多启动几个Pod A就好了,启动的新的Pod以后,svc仍是会根据matchLables把它自动添加到负载里面去
咱们k8s集群里面不可能只有两种服务啊,确定有不少服务,但咱们不可能每一个都手工去配置吧,因此这个时候就引入了CoreDNS的概念,咱们用CoreDNS来维护svc 和clusterIP的关系
image.png
其实这个时候 k8s集群内部的通信就大体讲清楚了,可是这个里面有个及其特殊的svc:headless svc,这个svc当别的客户端来请求他的时候,他不会去负载的向下面pod去作请求,而是把下面POD的全部IP返回给客户端,由客户端本身来决定连接那个POD。node

k8s集群内部请求集群外部的服务

若是是单个服务,咱们能够选择直接在内部直接链接外部的服务,可是若是外部服务是个集群的话,那若是咱们还这样作就须要在外部集群前面作个负载,
image.png
可是这样若是有不少个集群咱们就要建立不少个nginx的4层负载,太麻烦了,咱们能够把负载放到k8s集群里面,咱们采用k8s的svc+endpoints来实现外部集群的负载均衡
image.png
这个时候svcendpoint是经过名字来进行绑定的,这样咱们就实现了集群内部和集群外部通信nginx

k8s集群外部和k8s集群内部通讯

在实际工做中,除了k8s集群内部通信,我认为就是这种通信方式使用的比较多,由于咱们在k8s上跑的集群不就是为了让客户来访问的吗?下面咱们将下三种实现方式后端

nodeport

nodeport是咱们在node上面所端口绑定,因此node上都会开放此pord端口,咱们任意请求其中一个node端口,即便这个pod没有落在这个node上也行,当请求到node port的时候他会自动转发到对应的Podip上来实现访问
image.png负载均衡

hostport

必须pod落在那个node上,那个node才会开放对应的端口less

ingress

ingress是咱们使用最广泛的暴漏k8s集群内部服务让外部来访问的方式,ingress是一类资源的统称,咱们如今通常都适用ingress-nginx,关于ingress 请参考https://www.zhangshoufu.com/articles/2019/07/19/1563529715618.html, 这里不在细说ide

视频讲解:https://www.bilibili.com/video/av71139472code

相关文章
相关标签/搜索