加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

发布时间:2019-07-30 00:33:07 所属栏目:评测 来源:Andy_Lee
导读:副标题#e# 以我的经验来讲,理解Kubernetes集群服务的概念,是比较不容易的一件事情。尤其是当我们基于似是而非的理解,去排查服务相关问题的时候,会非常不顺利。 这体现在,对于新手来说,ping不通服务的IP地址这样基础的问题,都很难理解;而就算对经验很
副标题[/!--empirenews.page--]

以我的经验来讲,理解Kubernetes集群服务的概念,是比较不容易的一件事情。尤其是当我们基于似是而非的理解,去排查服务相关问题的时候,会非常不顺利。

这体现在,对于新手来说,ping不通服务的IP地址这样基础的问题,都很难理解;而就算对经验很丰富的工程师来说,看懂服务相关的iptables配置,也是有相当的挑战的。

今天这篇文章,我来深入解释一下Kubernetes集群服务的原理与实现,便于大家理解。

Kubernetes集群服务的本质是什么

概念上来讲,Kubernetes集群的服务,其实就是负载均衡、或反向代理。这跟阿里云的负载均衡产品,有很多类似的地方。和负载均衡一样,服务有它的IP地址以及前端端口;服务后边会挂载多个容器组Pod作为其“后端服务器”,这些“后端服务器”有自己的IP以及监听端口。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

当这样的负载均衡和后端的架构,与Kubernetes集群结合的时候,我们可以想到的最直观的实现方式,就是集群中某一个节点专门做负载均衡(类似LVS)的角色,而其他节点则用来负载后端容器组。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

这样的实现方法,有一个巨大的缺陷,就是单点问题。Kubernetes集群是Google多年来自动化运维实践的结晶,这样的实现显然与其智能运维的哲学相背离的。

自带通信员

边车模式(Sidecar)是微服务领域的核心概念。边车模式,换一句通俗一点的说法,就是自带通信员。熟悉服务网格的同学肯定对这个很熟悉了。但是可能比较少人注意到,其实Kubernetes集群原始服务的实现,也是基于Sidecar模式的。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

在Kubernetes集群中,服务的实现,实际上是为每一个集群节点上,部署了一个反向代理Sidecar。而所有对集群服务的访问,都会被节点上的反向代理转换成对服务后端容器组的访问。基本上来说,节点和这些Sidecar的关系如下图所示。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

把服务照进现实

前边两节,我们看到了,Kubernetes集群的服务,本质上是负载均衡,即反向代理;同时我们知道了,在实际实现中,这个反向代理,并不是部署在集群某一个节点上,而是作为集群节点的边车,部署在每个节点上的。

在这里把服务照进反向代理这个现实的,是Kubernetes集群的一个控制器,即kube-proxy。关于Kubernetes集群控制器的原理,请参考我另外一篇关于控制器的文章。简单来说,kube-proxy作为部署在集群节点上的控制器,它们通过集群API Server监听着集群状态变化。当有新的服务被创建的时候,kube-proxy则会把集群服务的状态、属性,翻译成反向代理的配置。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

那剩下的问题,就是反向代理,即上图中Proxy的实现。

一种实现

Kubernetes集群节点实现服务反向代理的方法,目前主要有三种,即userspace、iptables以及IPVS。今天我们只深入分析iptables的方式,底层网络基于阿里云Flannel集群网络。

过滤器框架

现在,我们来设想一种场景。我们有一个屋子。这个屋子有一个入水管和出水管。从入水管进入的水,是不能直接饮用的,因为有杂质。而我们期望,从出水管流出的水,可以直接饮用。为了达到目的,我们切开水管,在中间加一个杂质过滤器。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

过了几天,我们的需求变了,我们不止要求从屋子里流出来的水可以直接饮用,我们还希望水是热水。所以我们不得不再在水管上增加一个切口,然后增加一个加热器。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

很明显,这种切开水管,增加新功能的方式是很丑陋的。因为需求可能随时会变,我们甚至很难保证,在经过一年半载之后,这跟水管还能找得到可以被切开的地方。

所以我们需要重新设计。首先我们不能随

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

便切开水管,所以我们要把水管的切口固定下来。以上边的场景为例,我们确保水管只能有一个切口位置。其次,我们抽象出对水的两种处理方式:物理变化和化学变化。

Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现

基于以上的设计,如果我们需要过滤杂质,就可以在化学变化这个功能模块里增加一条过滤杂质的规则;如果我们需要增加温度的话,就可以在物理变化这个功能模块里增加一条加热的规则。

以上的过滤器框架,显然比切水管的方式,要优秀很多。设计这个框架,我们主要做了两件事情,一个是固定水管切口位置,另外一个是抽象出两种水处理方式。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读