Inside Kubernetes controller-01

举报
kaliarch 发表于 2022/04/04 20:31:24 2022/04/04
【摘要】 前言一文详解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 创建

  1. 用户通过kubect应用了一个replicaset 资源清单,api-server将其存储到etcd中,replicaset 资源创建。

  1. Replicates 控制器检测到replicaset资源创建,没有spec.nodeName 的空pod开始创建,kubelet检测到pod但是目前还不知道该pod被调度到那个node上面执行。通过schedule开始调度。

  1. 调度器检测到pod被创建,由于pod.spec.nodeName为空,调度器将其添加到调度队列中,后期进行调度算法进行调度。

  1. kubelet检测到pod创建事件,由于pod.specc.nodeName为空,先跳过处理。

  1. 调度器从调度队列中弹出pod,开始为pod分配node节点,之前更新pod的pod.Spec.nodeName字段

  1. Kubelet 检测到pod更新,选择到podName 的node节点,开始启动容器。

  1. kubelet 发送请求给api-server, api-server 更新pod的字段 pod.status到etcd中。

1.2.2.2 POD 销毁

现在由于某种情况POD开始销毁。

  1. kubelet 发送请求到api-server 上,api-server 更新etcd中pod.Status 字段。

  1. ReplicaSet Controller 检测到Pod更新,开始执行Pod删除。

  1. 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。