k8s原理——关键组件

1. master节点上的组件:

etcd:
API Server:
Scheduler:
Controller Manager:
为了保证高可用,master节点的组件可以多实例运行,但是只有etcd和API Server可以同时并行工作,Scheduler和Controller Manager在同一时间内只能有一个实例处于运行状态,其他实例处于待命模式。

1.1 etcd

1.1.1

k8s里的所有对象:pod,ReplicationContorller,service,secret等等的元数据都需要以持久化的方式存储到某个地方,这样组件重启了元数据才不会丢失。

1.1.2

唯一能和etcd通信的组件是API server,其他组件要和etcd通信都要通过API Server。这样也保证了API Server能通过乐观锁的方式更新etcd。

1.1.3 etcd存储资源的方式:

etcd v2: 类似于文件系统,每个key要么是一个目录(包含其他key),要么是一个常规key,对应一个value。例子:

/registry/pods     //pods是一个目录
/registry/namespace
...

etcd v3: 不支持目录,但是key可以包含斜杠,其实就跟目录差不多。例子(etcd v3不支持 ls命令):

/registry/pods/default/kubia-159041347-xk0vc //直接列出key,没有目录
...

获取key对应的value:

{"kind":"Pod","apiVersion":"v1"....} //可以看出其实它就是我们创建pod时用的那个yml文件

1.1.4 HA

etcd是可以通过运行多个etcd实例来达到HA的。通常对于大集群,etcd有5个或者7个就够了,可以允许2-3个宕机(因为必须保证超过半数的机器还活着)
由于必须保证超过半数的机器还活着,所以etcd集群的实力个数通常都是奇数个。

1.2 API Server

其他组或者客户端(如kubectl)都会去调用它。以RESTful API的形式提供了可以查询,修改集群状态的接口(CRUD)。并把最终状态存到etcd。它是唯一一个能与etcd交互的组件。所有其他组件要与etcd通信来改变资源的配置时都需要通过apiServer。

提供三个功能:

  1. 作为统一的接口取访问etcd。
  2. 将资源描述文件(yml)存入etcd之前,对文件做校验。这样客户端kubectl就无法存入非法对象了
  3. 提供了乐观锁机制,这样多个客户端kubectl并发更新的情况下,不会出现先更新的覆盖后更新的。

1.2.1 一个请求从客户端kubectl发出来之后,在api server中的流程

  1. API Server上会被配置一个或者多个认证插件(Authentication plugin), 轮流调用这些插件对客户端kubectl发过来的请求做认证,以确认是哪个用户发送的该请求。
  2. 同上,会配置多个授权插件(Authorization plugin),轮流调用这些插件,判断是否授权客户端执行相应的请求。
  3. 同上,多个准入控制插件(Admission control plugin),对创建,修改,删除资源的操作,进行校验,其实就是看看你的yml文件写的对不对,是不是有语法错误(有语法错误就拒绝请求),给你漏配的字段填写默认值等。注意如果只是读数据,则不会做准入控制的验证。

1.2.2 API Server提供了监听的功能,以通知各个组件,当前资源发生了改变。

比如说客户端kubectl创建一个pod,api server收到请求后把它存入etcd。那controller manager是怎么知道现在它需要去创建一个pod的呢?答案是controller manager注册了对api server的监听。一旦有资源的变化,api server都会回调controller manager。

//这个命令就可以创建kubectl对api server的监听,一旦有新的pod创建,
//api server就会回调到这里
kubectl get pods --watch  

1.3 Scheduler

利用API Server的监听机制,等待新创建的pod,然后给每个新的pod分配Node。

注意:Scheduler不会去命令某个node运行pod。

  • 它只是通过API Server更新pod的定义(也就是yml文件),然后存入etcd,更新的内容肯定就是pod应该被调度到哪个Node上。
  • 然后运行在node上的kubelet同样也会监听API Server,pod更新后,对应Node上运行的kubelet收到回调,发现pod是被调度到本节点,就会去创建并运行pod。

1.3.1 Scheduler最核心的其实就是调度算法了,调度算法分2步:

  • 过滤所有node,找出可用的node列表。

  • 在可用的node列表中,按优先级排序。如果多个node都有最高优先级分数,则循环分配。
    具体的调度算法,亲缘性规则以及各种因子这里不展开了。

1.3.2 Scheduler也是可以有多个的

在给pod定义的时候就可以指定SchedulerName来指定这个pod被哪个Scheduler调度。没配的话就会用k8s默认的调度器,default-scheduler。

1.4 Controller Manager控制器管理器

包括:
ReplicationController Controller
ReplicaSet/DaemonSet/Job controller
Deployment Controller
StatefulSet Controller
Node Controller
等等...
它们的主要的作用就是确保集群里的资源的真实状态,朝着跟yml中定义的期望状态收敛。

1.4.1 ReplicationController

比如说某个ReplicationController中定义了pod的个数是3个,当前只有2个pod的话,ReplicationController Controller就需要通过API Server再创建一个pod。如果有4个,就需要删除一个。
需要注意的是,ReplicationController并不会去轮询所有pod,而是通过API Server的监听机制订阅可能影响期望值的replica数量或者符合pod数量变化的事件。ReplicationController收到这些事件的通知后就会去检测期望的replica的数量和实际pod的数量,然后作出相应操作(创建/删除pod)。

大概流程:

  1. 通过kubectl apply创建一个replicationController资源。
  2. API Server收到请求,并将yml文件写入etcd。
  3. ReplicationController组件收到回调,然后查看当前pod个数(此时当前pod个数肯定是0了),然后通过API Server创建pod。
  4. API Server把创建pod的 yml文件写入etcd.
  5. scheduler收到监听,给pod找匹配的Node。
  6. scheduler找到匹配的node后,通过API Server更新pod的yml,写入etcd。
  7. node上的kubelet收到监听消息,开始创建pod。

其他的控制器跟replicationController差不多,都是确保集群里的资源的真实状态,朝着跟yml中定义的期望状态收敛。

1.4.2 DeploymentController

每次Deployment对象修改后,如果修改会影响到部署的pod,DeploymentController都会创建一个新的replicaSet,然后按照Deployment中定义的策略同时伸缩新,旧的replicaSet。

2. 工作节点上的组件:

kube-proxy:
kubelet:
容器;

2.1 kubelet

功能:

  • 首先它需要想API server创建一个Node资源,来注册改节点。这样API Server中有事件来的话就会通知到Kubelet。
  • kubelet要持续监听API Server的事件,如果API Server通知有pod被调度到了本节点,它就要去创建pod
  • 创建pod,并在pod中运行容器
  • 监控pod的状态,并行API Server报告这些状态
  • 运行容器的存活探针,当探针报错,则重启容器
  • 当API server通知pod要被删除的时候,kubectl会干掉pod,并告知Api Server pod已经被干掉了。

2.2 kube-proxy

kube-proxy的作用是用来确保客户端的请求(客户端通过service的IP+端口)可以顺利到达对应的pod。
之前说过,service创建后,对应会创建endpoint。客户端的请求过来后,kube-proxy会根据endpoint中的ip+port列表选择一个,然后转发请求。

kube-proxy有2种模式:
userspace代理模式
iptables代理模式(性能更好)

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

推荐阅读更多精彩内容