kubernetes架构-组件交互篇

Kubernetes的节点包含两种角色:Master节点和Node节点。Master节点部署apiserver 、scheduler、controller manager (replication controller、node controller等),Node节点上部署kubelet和proxy。当然可以把Master和Node节点部署到一起,只是生产环境通常不建议这样做。

以下涉及各个组件实现了什么,有什么处理逻辑,部分组件涉及该组件的高可用,并以deployment创建为例串了下流程。整个下来,对kunernetes各个组件有一定的了解。

kubernetes架构图
Master节点之Kubernetes集群入口组件:Apiserver

Apiserver是Kubernetes最核心的组件,是整个集群API的入口,每个组件都需要和它交互。Kubernetes所有资源数据都是通过Apiserver保存到后端Etcd的,它本身还提供了对资源的缓存。因为Apiserver是无状态的,所以在集群的高可用部署可以为多活。

Apiserver启动后会将每个版本的接口注册到一个核心的路由分发器(Mux)。Kubernetes API接口主要分为组、版本和资源三层。举例:“/apis/batch/v1/jobs”接口,batch是组,v1是版本,jobs是资源。Kubernetes的核心资源都放在“/api”接口下,扩展的接口放在“/apis”下。

Apiserver请求处理流程图

Apiserver请求处理流程拆分如下:

1) 当客户端请求到达Apiserver后,首先经过Authentication认证和Authorization授权。认证支持Basic、Token及证书认证等。授权目前默认使用的是RBAC。

2) 认证成功后,请求到达路由分发器(Mux),然后路由分发到指定接口。

3) 经过路由分发后,为了兼容多个接口版本,将请求中不同版本的资源类型统一转化为一个内部资源类型。

4) 转换为内部模型后,进入Admission准入控制,在准入控制采用插件机制,用户可以定义自己的注入控制器验证,并更改资源配置。

5) 准入控制通过后,进入Validation资源校验。资源校验主要是验证参数是否合法,必传参数是否齐备等。

6) 最后转化到用户最初的资源版本,并保存到Etcd中。

Master节点之资源管理组件:Controller manager

Controller manager是负责资源管理的组件,它主要负责容器的副本数管理、节点状态维护、节点网段分配等,是Kubernetes负责实现生命式API和控制器模式的核心。

以ReplicaSet为例,Controller manager会周期地检测理想的“目标容器数”和真实的“当前容器数”是否相同。如果不相等,则会将实际的容器数调整到目标容器数。当设置一个ReplicaSet的副本数为10的时候,如果实际的容器数小于10,则会执行调用Apiserver创建Pod。如果当前容器数大于10,则会执行删除Pod操作。

Master节点之容器调度组件:Scheduler

Scheduler负责容器调度组件。每个Pod会在一台node节点上启动,通过Scheduler调度组件的筛选、打分,选择出Pod启动的最佳节点。当Pod创建后,Pod的NodeName属性为空,Scheduler会查询所有NodeName为空的Pod,并执行调度策略。选择最优的部署节点后,调用Apiserver绑定Pod对应的主机(设置Pod NodeName属性)。绑定成功后,对应节点的Kubelet便可以启动容器。

Scheduler的调度过程分为两个步骤:

第一步是筛选(Predicate),筛选满足需要的节点。筛选的条件主要包括(1)Pod所需的资源(CPU、内存、GPU等);(2)端口是否冲突(针对Pod HostPort端口和主机上面已有端口,我认为这个应该是容器的网络模式为host);(3)nodeSelector及亲和性(Pod亲和性和Node亲和性);(4)如果使用本地存储,那么Pod在调度时,将只会调度存储绑定的节点;(5)节点的驱赶策略,节点可以通过taint(污点)设置驱赶Pod策略,对应的Pod也可以设置Toleration(容忍)。

第二步是根据资源分配算法排序打分(Priorities),选择得分最高的节点作为最终的调度节点,主要调度策略包括LeastRequestedPriority(最少资源请求)、BalancedResourceAllocation(均衡资源使用)、ImageLocalityPriority(镜像本地优先)和NodeAffinityPriority(主机亲和算法)等。为了归一化每种算法的权重,每种算法取值范围都是0~10,累加所有算法的总和,取得分最大的主机作为Pod的运行主机。

Scheduler组件本地维护了一个调度队列和本地缓存,调度队列暂存了需要被调度的Pod,调度的先后顺序可以调整。本地缓存主要是缓存Pod和Node信息,可以避免每次调度时都从Apiserver获取主机信息。

为了提高调度效率,Scheduler采用了乐观锁,即Predicate和Priorities是并行操作的,那么有可能会出现数据的不一致,即Pod调度时主机上面资源是符合要求的。当容器启动时,由于其他容器也调度到该节点导致资源又不满足要求了。所以在Kubelet启动容器之前首先执行一遍审计(在Kubelet上重新执行一遍Predicate)操作,确认资源充足才会启动容器,否则将更新Pod状态为Failed。

Scheduler是典型的单体调度。为了支持高可用,可以部署多个Scheduler,但只有一个Scheduler处于Active状态,其他都为Standby状态。当处于Active的Scheduler宕机后,由于无法续约,会从Etcd中摘除,其他Scheduler节点便可以通过争抢注册Etcd的方式获得调度权限。

Minion节点之Kubelet组件

Kubelet接收Apiserver分配的启动容器的任务,然后拉起容器。当然,如果收到销毁指令,同样会执行删除容器的操作。

本地镜像也是由Kubelet负责维护,配合GC机制,删除无用的镜像和容器。

除此之外,Kubelet还需定时向Apiserver上报自己的状态,一方面告知Apiserver自身还存活着,另一方面将本节点的Pod状态、存储使用等信息上报到Apiserver。

Kubelet启动一个主线程,用于保持和Apiserver的通信,主线程不能被阻塞,否则将无法定时完成上报,导致Apiserver将该节点设置为NotReady状态。所以Kubelet会启动很多协程用于检测节点状态,回收废旧资源,驱赶低优先级Pod,探测Pod健康状态等。syncLoop是Kubelet的核心,它通过一个死循环不断接收来自Pod的变化信息,并通过各种Manger执行对应的操作,如下图。

Minion节点之Kube-proxy代理服务

Kube-proxy是代理服务,为Kubernetes的Service提供负载均衡,本质上是iptables或ipvs实现的。Kubernetes将服务和Pod通过标签的方式关联到一起,通过服务的标签筛选找到后端的Pod,但服务的后端通过Endpoint(端点)关联Pod,Endpoint可以理解为“Pod地址:Pod端口”的组合。

举例:kube-proxy如何生成iptables规则的?当创建一个服务后,Kubernetes默认会为每个服务生成一个虚拟IP(VIP)。通过访问VIP即以负载均衡的方式访问后端Pod的服务。举例一个服务:对内提供服务的端口8080,对外提供服务的端口31341,并通过paas.io/serviceName选择后端容器。这会在每台机器上生产如下iptables规则。

1)将进和出的流量都转到KUBE-SERVICES链上。

2)目标是VIP(10.0.0.41)或访问NodePort的流量都转发到某个链上(KUBE-SVC-HDARFCJAQENGWQ37)。

3)KUBE-SVC-HDARFCJAQENGWQ37链通过iptables的随机模块分发流量,第一个是50%,第二个是100%。如果后端有3个Pod,那么比例将会是33%、50%、100%,以此类推。

4)最终通过DNAT进入容器。

一个Deployment的启动

通过kubectl run(eg:kubectl run nginx--image=nginx--replicas=5)命令去创建一个Deployment。

这个请求先到达Apiserver,Apiserver负责保存到EtcdController manager中的Deployment控制器会监测到有一个Deployment被创建,此时会创建相应的ReplicaSet,ReplicaSet的控制器也会监测到有新的ReplicaSet创建,会根据相应的副本数调用Apiserver创建Pod。

此时Pod的主机字段是空的,因为还不知道将要在哪台机器上面启动,然后Scheduler开始介入,调度没有分配主机的Pod,通过预先设定的调度规则,包括节点标签匹配、资源使用量等选择出最合适的一台机器,在通过apiserver的bind请求将Pod的主机字段设置完成。

Kubelet监测到属于自己的节点有新容器创建的事件,于是便拉起一个容器,并上报给apiserver容器的状态。

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