Inside Kubernetes controller-01
【摘要】 前言一文详解Kubernetes controller 一 高层架构 1.1 K8s架构Api-server:api-server 负责接收来自客户端的对资源对象的CRUD请求,并去执行。controller-manager:控制管理资源(deployment,service,replicaset,daemonset,job,cronjob,endpoint,statefulset)是控制...
前言
一文详解Kubernetes controller
一 高层架构
1.1 K8s架构
- Api-server:api-server 负责接收来自客户端的对资源对象的CRUD请求,并去执行。
- controller-manager:
- 控制管理资源(deployment,service,replicaset,daemonset,job,cronjob,endpoint,statefulset)
- 是控制器的集合组,打包到同一个二进制文件中。
1.2 Controller 相关
1.2.1 控制循环
A. 控制循环概念:也称为调谐,通过资源的期望状态和真实状态通过一些了的观测、分析、执行对应动作,使得真实状态往期望状态逼近。
B. 控制循环流程:
- 获取当前资源的真实状态。
- 改变资源状态到期望状态。
- 更新资源状态。
1.2.2 ReplicaSet Control 循环示例
如图replicaset 控制器查看期望为3个副本,目前2个,所以执行动作增加一个副本。
1.2.2.1 POD 创建
- 用户通过kubect应用了一个replicaset 资源清单,api-server将其存储到etcd中,replicaset 资源创建。
- Replicates 控制器检测到replicaset资源创建,没有spec.nodeName 的空pod开始创建,kubelet检测到pod但是目前还不知道该pod被调度到那个node上面执行。通过schedule开始调度。
- 调度器检测到pod被创建,由于pod.spec.nodeName为空,调度器将其添加到调度队列中,后期进行调度算法进行调度。
- kubelet检测到pod创建事件,由于pod.specc.nodeName为空,先跳过处理。
- 调度器从调度队列中弹出pod,开始为pod分配node节点,之前更新pod的pod.Spec.nodeName字段
- Kubelet 检测到pod更新,选择到podName 的node节点,开始启动容器。
- kubelet 发送请求给api-server, api-server 更新pod的字段 pod.status到etcd中。
1.2.2.2 POD 销毁
现在由于某种情况POD开始销毁。
- kubelet 发送请求到api-server 上,api-server 更新etcd中pod.Status 字段。
- ReplicaSet Controller 检测到Pod更新,开始执行Pod删除。
- replicaset controller 调谐Pod到期望状态,开始循环2-10步骤。
api-server负责资源crud,schedule负责资源调度,kubelet负责容器创建,controller负责调谐资源,每个组件都专注于自己的职责,组成一个有机的统一体。
1.3 事件
什么时候控制器开始执行控制循环呢,Event是非常关键的因素,例如:Added、Modifie、Deleted,Error…
对于Kubeernetes,这种有分布式组件组成的系统,Event是非常的重要,通过他去联系其他的组件。
事件触发在k8s中被分为两类,一个是Edge-driven Triggers(边缘触发),Level-driven Triggers(水平触发)。
1.3.1 边缘触发
边缘触发就是当资源副本数量的增加或缩减。
但是仅仅有边缘触发会存在一定问题,假设由于网络原因或程序bug,边缘事件发生丢失,那么调谐就没有发生,资源副本数量也就未发生变化。
1.3.2 水平触发
垂直触发会遇到这种丢失的问题,控制器在每次重新同步间隔时进行协调,这样控制器可以使状态更接近期望状态。
1.4 控制器的组件
1.4.1 术语表
- Kind:API 对象的种类,例如deployment,service。
- Resource:kind中资源的实体,被作为http endpoint,以小写或复数形式表示。
- Object:API 对象的实体,被持久化存储在etcd中。
1.4.2 控制器的库
- Client-go:
- informer
- lister
- workQueue
- api-machinery:
- runtime.Object
- scheme
- Code-generator
1.4.3 自定义控制器SDK
- 框架:kubebuilder、Operator SDK
- 高级库:controller-runtime、controller-tools
- 低级库:client-go、api-machinery
- 组件:informer、lister、workqueue、scheme、runtime.Object
1.4.4 控制器的库
- Client-go:
- kubernetes 官方client库。
- 这个是kubernetes开发工具。
- Api-machinery:
- kubernetes API 对象 & kubernetes API 对象库
- 控制器管理API 对象使用。
- Code-generator:
- informer,lister,clientset,deepcopy 源码生成,使用这个进行控制器开发。
1.4.5 控制器下的组件
- Informer:watch 对象事件和超难吃数据在内存缓存中。
- Lister:吸收对象数据在内存缓存中。
- WorkQueue:队列存储控制循环item。
- runtime.Object:API 对象接口。
- Scheme:联系go type 和kubernetes API。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)