企业级运维之云原生与Kubernetes实战课程
第三章第3讲 集群创建Pod的过程
视频地址:https://developer.aliyun.com/learning/course/913/detail/14556
本讲目录:
- 控制器模型
- 集群架构
- 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伸缩副本失败,要怎么排查?