第6章 简洁的服务模型

6.1 服务的本质是什么

K8s集群的服务,其实就是负载均衡或反向代理。这跟阿里云的负载均衡有很多类似的地方、和负载均衡一样,服务有它的IP地址以及前端端口,同时服务后面会挂载多个容器组作为其“后端服务器”,这些“后端服务器”有自己的IP地址以及监听端口。如下图所示。

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

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

6.2 自带通信员

边车(sidecar)模式是微服务领域的核心概念。边车模式换一个通俗一点的说法,就是自带通信员模式。如图6-3所示。

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

6.3 让服务照进现实

K8s集群的服务本质上是负载均衡,即反向代理;在具体实现中,这个反向代理,并不是部署在集群某一个节点上的,二是作为集群节点的sidecar部署在每个节点上的。

在这里让服务“照”进反向代理这个“现实”的,是K8s集群的一个控制器,即kube-proxy。简单来说,kube-proxy作为部署在集群节点上的控制器,通过集群API Server监听着集群状态变化。当有新的服务被创建的时候,kube-proxy会把集群服务的状态、属性,翻译成反向代理的配置,整个过程如图6-5所示。

那剩下的问题就是反向代理(即图6-5中的proxy)的实现了

6.4 基于Netfilter的实现

K8s集群节点实现服务反向代理的方法目前主要有三种,即userspace、iptables以及ipvs。本章以阿里云Flannel集群网络为范本,仅对基于iptables的服务实现做深入探讨。

6.4.1 过滤器框架

Netfilter实际上是一个过滤器框架。Netfilter在网络包收发及路由的“管道”上,一共"切"开了5个扣,分别是PREROUTING、FORWARD、POSTROUTING、INPUT、以及OUTPUT,同时Netfilter定义了包括NAT、Filter在内的若干个网络包处理方式。NetFilter框架如图6-9所示。

需要注意的是,Routing和FORWARD很大程序上增加了以上Netfilter的复杂程度,如果我们不考虑Routing和FORWARD,那么NetFilter就会变得和我们的水过滤框架一样简单。

6.4.2 节点网络大图

参考图6-10所示的K8s集群节点网络全貌。横向来看,节点上的网络环境被分割成不同的网络命名空间,包括主机网络命名空间和Pod网络命名空间;纵向来看,每个网络命名空间包括完整的网络栈:从应用到协议栈,再到网络设备。

在网络设备这一层,我们通过cni0虚拟网桥组建出系统内部的一个虚拟局域网。Pod网络通过Veth对连接到这个虚拟局域网内,cni0虚拟局域网通过主机路由以及网口eth0与外部通信。

在网络协议栈这一层,我们可以通过在Netfilter过滤器框架上编程,来实现集群节点的反向代理。

实现反向代理,归根结底就是做DNAT,即把发送给集群服务IP地址和端口的数据包,修改成发给具体容器组的IP地址和端口。参考图6-9中的Netfilter过滤器框架。在Netfilter里,可以通过在PREROUTING、OUTPUT以及POSTROUTING三个位置加入NAT规则,来改变数据包的源地址或目的地址。

因为这里需要做的是DNAT,需要改变目的地址,这样的修改必须在路由(Routing)之前发生以保证数据包可以被路由正确处理,所以实现反向代理的规则,需要被加到PREROUTING和OUTPUT两个位置。

其中,PREROUTING的规则用来处理从Pod访问服务的流量。数据包从Pod网络Veth发送到cni0之后,进入主机协议栈,首先会经过Netfilter PREROUTING的处理,所以发送给服务的数据包,会在这个位置做DNAT。经过DNAT处理之后,数据包的目的地址变成另一个Pod的地址,从而经过主机路由转发到eth0,发送给正确的集群节点。

而添加在OUTPUT这个位置的DNAT规则,则用来处从主机网络发给服务的数据包,原理也是类似的,即在经过路由之前修改目的地址,以方便路由转发。

6.4.3 升级过滤器框架

在"过滤器框架"一节,我们看到Netfilter是一个过滤器框架。Netfilter在数据“管道”上“切“了5个口,分别在这5个扣上做了一些数据包处理工作。虽然固定切口位置以及网络包处理方式分类已经极大地优化了过滤器框架,但是有一个关键的问题,就是我们还需要再管道上做修改以满足新的功能。换句话说,这个框架没有做到管道和过滤功能两者的彻底解耦。

为了实现管道和过滤功能两者的解耦,Netfilter用了表的概念,表就是Netfilter的过滤中心,其核心功能是过滤方式的分类(表),以及每种过滤方式中过滤规则的组织(链),如图6-11所示。

把管道和过滤功能解耦之后,所有对数据包的处理都变成了对表的配置。而管道上的5个切口,仅仅变成了流量的出入口,负责把流量发送到过滤中心,并把处理之后的流量沿着管道继续传送下去。

Netfilter把表中的规则组织成链。表中有针对每个管道切口的默认链,也有我们我们自己加入的自定义链。默认链是数据的入口,默认链可以通过跳转到自定义链来完成一些复杂的功能,比如实现K8s集群节点的反向代理,我们可以使用自定义链来使我们的规则模块化。

6.4.4 用自定义链实现服务的反向代理

集群服务的反向代理,实际上就是利用自定义链,模块化实现数据包的DNAT转换。KUBE-SERVICE是整个反向代理的入口链,其对应所有服务的总入口;KUBE-SVC-XXXX链是具体某一个服务的入口链。KUBE-SERVICE链会根据服务IP地址,跳转到具体服务的KUBE-SVC-XXXX链。KUBE-SEP-XXXX链代表着某一个具体Pod的地址和端口,即Endpoint,具体服务链KUBE-SVC-XXXXX会按照一定的负载均衡算法跳转到Endpoint链,其整体结构如图6-12所示。

而如前面提到的,因为这里需要做的是DNAT,即改变目的地址,这样的修改必须在路由之前发生以保证数据包可以被路由正确处理,所以KUBE-SERVICE会被PREROUTING和OUTPUT两个默认链所调用、

6.5总结

服务本质上是负载均衡

服务负载均衡的实现采用了与服务网格类似的边车模式,而不是LVS类型的独占模式。

kube-proxy本质上是一个集群控制器。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容