Kubernetes 网络模型来龙去脉( 三 )

告诉它我需要为这个 IP 进行负载均衡分发,后面的参数就是一些分发策略等等 。virtual server 的 IP 其实就是我们的 Cluster IP 。

  • 第 3 步,为这个 IPVS service 创建相应的 real server 。
我们需要为 virtual server 配置相应的 real server,就是真正提供服务的后端是什么 。比如说我们刚才看到有三个 Pod,于是就把这三个的 IP 配到 virtual server 上,完全一一对应过来就可以了 。Kube-proxy 工作跟这个也是类似的 。只是它还需要去监控一些 Pod 的变化,比如 Pod 的数量变成 5 个了,那么规则就应变成 5 条 。如果这里面某一个 Pod 死掉了或者被杀死了,那么就要相应地减掉一条 。又或者整个 Service 被撤销了,那么这些规则就要全部删掉 。所以它其实做的是一些管理层面的工作 。
啥?负载均衡还分内部外部
最后我们介绍一下 Service 的类型,可以分为以下 4 类 。
1. ClusterIP集群内部的一个虚拟 IP,这个 IP 会绑定到一堆服务的 Group Pod 上面,这也是默认的服务方式 。它的缺点是这种方式只能在 Node 内部也就是集群内部使用 。
2. NodePort供集群外部调用 。将 Service 承载在 Node 的静态端口上,端口号和 Service 一一对应,那么集群外的用户就可以通过 <NodeIP>:<NodePort> 的方式调用到 Service 。
3. LoadBalancer给云厂商的扩展接口 。像阿里云、亚马逊这样的云厂商都是有成熟的 LB 机制的,这些机制可能是由一个很大的集群实现的,为了不浪费这种能力,云厂商可通过这个接口进行扩展 。它首先会自动创建 NodePort 和 ClusterIP 这两种机制,云厂商可以选择直接将 LB 挂到这两种机制上,或者两种都不用,直接把 Pod 的 RIP 挂到云厂商的 ELB 的后端也是可以的 。
4. ExternalName摈弃内部机制,依赖外部设施,比如某个用户特别强,他觉得我们提供的都没什么用,就是要自己实现,此时一个 Service 会和一个域名一一对应起来,整个负载均衡的工作都是外部实现的 。
下图是一个实例 。它灵活地应用了 ClusterIP、NodePort 等多种服务方式,又结合了云厂商的 ELB,变成了一个很灵活、极度伸缩、生产上真正可用的一套系统 。
Kubernetes 网络模型来龙去脉

文章插图
 
首先我们用 ClusterIP 来做功能 Pod 的服务入口 。大家可以看到,如果有三种 Pod 的话,就有三个 Service Cluster IP 作为它们的服务入口 。这些方式都是 Client 端的,如何在 Server 端做一些控制呢?
首先会起一些 Ingress 的 Pod(Ingress 是 K8s 后来新增的一种服务,本质上还是一堆同质的 Pod),然后将这些 Pod 组织起来,暴露到一个 NodePort 的 IP,K8s 的工作到此就结束了 。
任何一个用户访问 23456 端口的 Pod 就会访问到 Ingress 的服务,它的后面有一个 Controller,会把 Service IP 和 Ingress 的后端进行管理,最后会调到 ClusterIP,再调到我们的功能 Pod 。前面提到我们去对接云厂商的 ELB,我们可以让 ELB 去监听所有集群节点上的 23456 端口,只要在 23456 端口上有服务的,就认为有一个 Ingress 的实例在跑 。
整个的流量经过外部域名的一个解析跟分流到达了云厂商的 ELB,ELB 经过负载均衡并通过 NodePort 的方式到达 Ingress,Ingress 再通过 ClusterIP 调用到后台真正的 Pod 。这种系统看起来比较丰富,健壮性也比较好 。任何一个环节都不存在单点的问题,任何一个环节也都有管理与反馈 。
本文总结
本节课的主要内容就到此为止了,这里为大家简单总结一下:
  • 大家要从根本上理解 Kubernetes 网络模型的演化来历,理解 PerPodPerIP 的用心在哪里;
  • 网络的事情万变不离其宗,按照模型从 4 层向下就是发包过程,反正层层剥离就是收包过程,容器网络也是如此;
  • Ingress 等机制是在更高的层次上(服务<->端口)方便大家部署集群对外服务,通过一个真正可用的部署实例,希望大家把 Ingress+Cluster IP + PodIP 等概念联合来看,理解社区出台新机制、新资源对象的思考 。

【Kubernetes 网络模型来龙去脉】


推荐阅读