问问大家关于 k8s 的 deployment 创建过程

2021-04-19 09:47:47 +08:00
 zhoudaiyu

从 yaml 提交 api-server 后到 Pod 被创建出来的流程,网上搜了一些感觉要么太简单,要么讲的太细了,牵扯的代码太多,其实我是为了应付面试的...所以就需要类似:第一步,foo 组件和 bar 组件通信,完成了 xx,第二步,xxx 。大家知道哪里有讲这种东西的嘛?或者大家总结过吗?

2559 次点击
所在节点    Kubernetes
15 条回复
jorneyr
2021-04-19 09:56:16 +08:00
我的理解大概就是:
1. k8s 收到 yaml 内容,验证 yaml 中的属性
2. yaml 通过验证,然后交给 Development Controller,创建 Pod (名字为 dev name + 随机字符串),同时创建 ReplicaSet
3. ReplicaSet 发现 Pod 缺失的时候就会创建新的 Pod 补全 (把 Pod 的 owner reference 设置为 ReplicaSet,Pod 被删除时 ReplicaSet 会收到通知)

我们现在写 Operator 就是这么做的。
zhoudaiyu
2021-04-19 09:58:29 +08:00
@jorneyr 老哥,确实好像大概是这样子。但好像少了一点 kube-scheduler 、etcd 、kubelet 、docker 相关的操作?
jorneyr
2021-04-19 10:10:20 +08:00
ETCD 得看逻辑了,例如 CR 和自定义状态数据就保存到 ETCD 里的,kubelet 是 Node 和 Master 通讯用的,Kube-Scheduler 是创建 Pod 的时候决定要调度到哪个 Node 用的,Docker 的话 yaml 的容器里指定 image 。

上面的主要是关于 Development 的代码流程。
zhoudaiyu
2021-04-19 10:17:27 +08:00
@jorneyr CR 是指?
PiersSoCool
2021-04-19 10:22:50 +08:00
创建 yml 提交到 api server (服务监听 etcd )

deploy controller 监听 api server 发现变更创建 rs 到 api server,并维护到 deploy 最终状态

创建 rs 的时候实际上也是创建 yml,同样的 kube scheduler 在 api server 监听,创建 pod

这里我觉得主要是考虑服务不可用,所以所有东西都创建在 api server 上,通过 listen 和 pull 的方式监听变更
QBS
2021-04-19 10:23:51 +08:00
最近自己也在学 k8s,我推荐楼主可以读下《 k8s in action 》关于 pod 这边大概也就前两三章的内容,大概 1 小时就能读完,可以对理解很多。
zhoudaiyu
2021-04-19 10:36:25 +08:00
@QBS 这个读过~但是觉得可能还是稍微有一点点浅
zhoudaiyu
2021-04-19 10:41:12 +08:00
@PiersSoCool 老哥 我想了解一下和 kubelet 的相关逻辑
Judoon
2021-04-19 11:47:19 +08:00
看起来老哥是在最近的面试中遇到了这个问题吗
salmon5
2021-04-19 11:48:07 +08:00
@zhoudaiyu
方法一:部署 1 个 deployment,各个组件打开 debug 模式,分析日志,顺藤摸瓜倒推;
方法二:读源码,这个性价比最低,一般没必要;
Judoon
2021-04-19 11:52:15 +08:00
1 楼没写完
apiserver 校验权限以及 json,将对应的资源写入 etcd 。
controller 和 scheduler 会 watch api,去调度和创建 rs 等,
最后是某台主机的 kubelet 会 watch 到 api 中相关的变化,调用本机的 docker api,创建容器和 pod,当然,创建时会先挂载 secret,configmap 或者 pvc 等等
dayeye2006199
2021-04-19 11:57:26 +08:00
1. kubectl 提交 yaml 后,首先客户端验证,验证 yaml 的定义是否正确;如果正确的话,生成发给 kube-apiserver 的 request
2. kube-apiserver 收到 client 发来的 request 之后,进行一些列的 client 认证和鉴权,确保 client 有权限创建资源。
3. request 被一些列 adminssion controller 拦截,进行一些额外计算和默认值计算,例如设定初始资源需求(如果 client 没有指明的话)。
4. 创建资源对象,存盘到 etcd
5. 资源对象存盘后,deployment controller 开始控制 loop,创建 replicaset
6. relicaset controller 开始创建 pod 资源; pod 对象存入 etcd,进入 pending 状态
7. scheduler 开始介入,开始检查各种 scheduling 限制(例如 taint,affinity )和资源需求,然后找到可以满足这些条件的 node 。找到 node 后,创建一个 binding 对象,发还给 kube-apiserver,pod 进入 scheduled 状态。
8. node 上的 kubelet 会定时查询 apiserver,收到 pod 创建事件后,开始在 node 上启动 pod 的准备工作。这里过程包括,准备存储,拉去 image pull secret 等。
9. kubelet 通过 CRI 通知容器运行时(例如 docker )启动一个父容器。这里的容器会处于暂停的阶段(直到所有设置完成)
10. kubelet 通过 CNI 设置容器的网络
11. 所有设置完成后,开始创建真正的应用容器,包括 init container 和用户指明的其他容器
12. 完成工作。

我的理解是,这个整个过程有点像是个状态机。

参考文献: https://github.com/jamiehannaford/what-happens-when-k8s
zhoudaiyu
2021-04-19 12:01:32 +08:00
@Judoon 是的啊 一模一样的问题被问了 2 次
zhoudaiyu
2021-04-19 12:01:52 +08:00
@dayeye2006199 老哥这个太赞啦 收藏收藏
zhoudaiyu
2021-04-19 12:02:50 +08:00
@salmon5 11 楼老哥说的这个就挺详细的了 好像不用 debug 了 😂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/771559

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX