前面说的k8s的网络分为三种:cluster、node和pod ip,那k8s是怎样使用这三种网络对外提供服务的?有些图片是人家的借来用用,省的自己画。

k8s对外暴露服务的方式有三种:

NodePort
        将服务的类型设置成NodePort-每个集群节点都会在节点上打 开 一个端口, 对于NodePort服务, 每个集群节点在节点本身(因此得名叫NodePort)上打开一个端口,并将在该端口上接收到的流量重定向到基础服务。该服务仅在内部集群 IP 和端口上才可访间, 但也可通过所有节点上的专用端口访问。

        在k8s上可以给Service设置成NodePort类型,这样的话可以让Kubernetes在其所有节点上开放一个端口给外部访问(所有节点上都使用相同的端口号), 并将传入的连接转发给作为Service服务对象的pod。这样我们的pod就可以被外部请求访问到,但是问题是每个节点都得开端口,一旦服务多了,端口管理会比较麻烦,而且某个节点如果没有运行的service的时候会怎样?


LoadBalane
        将服务的类型设置成LoadBalance, NodePort类型的一 种扩展,这使得服务可以通过一个专用的负载均衡器来访问, 这是由Kubernetes中正在运行的云基础设施提供的。 负载均衡器将流量重定向到跨所有节点的节点端口。客户端通过负载均衡器的 IP 连接到服务。注意这是NodePort的升级方案,只是在其基础上加上了负载均衡,也就是说对于节点而言,它还是需要添加service端口的只是它不是直接用nodeip对外提供服务,而是用辅助均衡器的统一ip对外提供服务。


Ingress
        创建一 个Ingress资源, 这是一 个完全不同的机制, 通过一 个IP地址公开多个服务,就是一个网关入口,和springcloud的网关zuul、gateway类似,这个也是我们公司在用的。

        这个ingress(通常我们称为ingress网关)可以根据服务前缀找到服务并有service路由来控制访问pod,就不需要在每个节点上都启端口,这个就像我们的nginx,同一个端口监听,然后按照服务前缀做路由转发到service。

        ingress包含两个组件:ingress和ingress controller。

        ingress可以理解为就是nginx的配置我们这里叫他ingress-nginx,可以让用户配置不同的域名、前缀等来对应service,只不过在k8s中这个被抽象出来用yml来创建和更新。

        上面说的ingress-nginx可以让你配置,那么配置了怎样才生效就需要ingress controller。        

        Ingress Controoler 通过与 Kubernetes API 交互,动态的去感知集群中 Ingress 规则变化,然后读取他,按照他自己模板生成一段 Nginx 配置,再写到 Nginx Pod 里,最后 reload 一下。但是对外的统一地址需要我们自己去实现,ingress只能是从某一个node往下做到动态分发,上层的我们可以借助LoadBalance来实现。

        

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐