开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程:集群创建 Pod 的过程 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/913/detail/14556
集群创建 Pod 的过程
本讲目录:
Ÿ 控制器模型
Ÿ 集群架构
Ÿ Pod 创建过程
一、控制器模型
1. 控制器 Controller
控制器 Controller 旨在保证集群中各种资源的状态和用户定义( yaml ) 的状态一致,如果出现偏差,则修正资源的状态。
2. 控制器模型
下图展示了控制器的一般模型架构:
Informer 负责监听 kube-apiserver,同时会注册很多 Handler,worker 从 queue中取出事件,根据事件类型触发对应的 Handler 处理,Informer 的主要作用是从 apiserver 获取数据放到本地缓存,根据对应的事件类型触发已经注册好的 result event handler。
for {
desired:= getDesiredState()
current:= getCurrentState()
makeChanges(desired, current)
}
二、集群架构
集群是由 master 和 worker 两种节点组成,master 节点运行各种控制器,统一通过 apiserver 与 etcd 存储进行交互。
目前在云上使用的集群中推荐使用托管版集群,以减少 Master 组件的维护成本。
三、Pod 创建过程
1. Pod 创建过程简化版
Pod 的创建过程如下图所示:
Ÿ 首先是通过 API Server 将 yaml 中的信息写入 etcd;
Ÿ 写入完成后 API Server 触发 watch 机制准备创建 Pod,信息会转发给调度器;
Ÿ 调度器通过其算法(如预选机制、优选机制),将需要调度的 Pod 以及调度到哪个节点上的信息写入 API Server;
Ÿ API Server 将绑定的 node 重新写入 etcd,Kubelet 收到信息后触发 docker;
Ÿ docker run 创建容器,Kubelet 负责上报 Pod 的状态信息;
Ÿ 最后 API Server 将这些状态信息写入 etcd,完成 Pod 创建。
2. Pod 创建中各组件的作用
以 Kuberctl 创建 deployment 为例,阐述资源创建的过程。
a. Kubectl
Ÿ 验证请求是否合法(例如创建不支持的资源、 yaml 格式错误);
Ÿ 封装 https 请求,然后发送给 kube-apiserver;
Ÿ 客户端身份认证:kubectl 查找 kubeconfig 的顺序:
ž --kubeconfig 参数
ž $KUBECONFIG 环境变量
ž $HOME/.kube/config
Ÿ 认证方式:CA 证书认证、bearer token 认证;
b. Kube-apiserver
Ÿ kube-apiserver 对用户进行认证,直到某一种认证成功:
ž x509 处理程序验证 http 请求是否是由 CA 根证书签名的 TLS 密钥进行编码的;
ž bearer token 程序验证 token 文件是否存在;
Ÿ kube-apiserver 对用户进行鉴权,包括:
ž webhook:与集群外的 http 服务进行交互;
ž ABAC: 执行静态文件中的策略;
ž RBAC: 动态配置策略;
ž Node: 它确保节点只能访问自己节点上的资源;
Ÿ 将 deployment 对象保存到 etcd 中;
c. Deployment controller
Ÿ 此时 etcd 中的 deployment 对象已经对 deploymentcontroller 可见,它会检查到当前 deployment 对象并无任何关联的 Replicaset 对象;
Ÿ 创建 Replicaset 对象并与当前 deployment 对象相关联;
Ÿ 将 Replicaset 对象保存到 etcd 中;
d. Replicaset controller
Ÿ 此时 deployment 已经创建处关联的 Replicaset,但是相关 Pod 还没创建。Replicaset controller 通过 apiserver 从 etcd 中检查到 Replicaset ,会去创建对应数量的 Pod,以达到 Replicaset 预期结果;
Ÿ 将 Pod 相关信息存入 etcd;
e. Scheduler
Ÿ 此时 Pod 信息虽然存到 etcd 里,但是 Pod 仍然是 pending 状态;
Ÿ scheduler 开始调度,通过预选策略链对节点进行评估,以初步筛选可以调度到的节点;
Ÿ 通过优选策略链对节点进行打分,选择最合适的节点,将 Pod 与节点关联;
Ÿ 将 Pod 相关信息更新到 etcd 中;
f. Kubelet
Ÿ kubelet 从 etc 中获取自己节点上需要运行的 Pod 的列表,然后与缓存中的列表进行比较;
Ÿ 新增 Pod 以修复列表差异;
Ÿ 调用 docker 拉取镜像;
Ÿ 启动容器;
Ÿ 更新 Pod 状态到 etcd。
所有以上组件都运行完成后,Pod 创建完成。
注意事项:在创建 Pod 时要设置好健康检查。
3. Pod 创建相关问题场景
场景:遇到 Pod 调度不符合预期
可能产生的因素:
Ÿ Limit 很大,而 Request 初始很小,对节点性能打分的差异就不会太大,可能造成调度不一致;
Ÿ 如果 Pod 频繁 crash 也会影响调度;
解决方案:
Ÿ 将 Scheduler 的日志级别调高,根据日志对节点进行打分;
Ÿ 通过设置调度器参数来优化调度策略。
本讲小结
1. 集群控制器的基本原理、集群架构;
2. 以 Pod 创建的过程阐述各个控制器之间的配合方式;
思考:
1. deployment 是如何与 Replicaset 和 Pod 关联起来的?
2. deployment 伸缩副本失败,要怎么排查?