首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >图解 K8S 源码 - Deployment Controller 篇

图解 K8S 源码 - Deployment Controller 篇

作者头像
郭旭东
发布2020-12-30 10:35:55
发布2020-12-30 10:35:55
1.8K00
代码可运行
举报
文章被收录于专栏:云原生工具箱云原生工具箱
运行总次数:0
代码可运行

前言

Kubernetes 最为云原生领域的绝对 leader,可以说是当下最著名开源项目之一,拥有着庞大的贡献者群体以及更庞大的用户群体。作为使用 Go 语言开发的明星项目,其源码也是非常有趣的。笔者在研究 Kubernetes 源码时,常常发现很多让人眼前一亮的设计和拍案叫绝的逻辑。但由于 Kubernetes 的代码量十分庞大,函数间的调用也十分复杂,在阅读源码时常常被绕的找不着北,正好手边有一本《图解算法》,于是就萌生了图解 Kubernetes 源码的想法。本文为本系列第一篇文章,尝试使用流程图来分析 Kubernetes Controller Manager 中 的 Deployment Controller 逻辑。

Deployment Controller

Deployment Controller 是 Kube-Controller-Manager 中最常用的 Controller 之一管理 Deployment 资源。而 Deployment 的本质就是通过管理 ReplicaSet 和 Pod 在 Kubernetes 集群中部署 无状态 Workload。

Deployment、ReplicaSet 和 Pod

deployment-controller

Deployment 通过控制 ReplicaSet,ReplicaSet 再控制 Pod,最终由 Controller 驱动达到期望状态。在控制器模式下,每次操作对象都会触发一次事件,然后 controller 会进行一次 syncLoop 操作,controller 是通过 informer 监听事件以及进行 ListWatch 操作的。

Deployment Controller 会监听 DeploymentInformer、ReplicaSetInformer、PodInformer 三种资源。这三种资源变化时,都会触发 syncLoop 也就是下面代码 dc.Run() 中的 dc.syncDeployment 操作,来进行状态更新逻辑。

代码语言:javascript
代码运行次数:0
运行
复制
func startDeploymentController(ctx ControllerContext) (http.Handler, bool, error) {    if !ctx.AvailableResources[schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}] {      return nil, false, nil    }    dc, err := deployment.NewDeploymentController(      ctx.InformerFactory.Apps().V1().Deployments(),      ctx.InformerFactory.Apps().V1().ReplicaSets(),      ctx.InformerFactory.Core().V1().Pods(),      ctx.ClientBuilder.ClientOrDie("deployment-controller"),    )    if err != nil {      return nil, true, fmt.Errorf("error creating Deployment controller: %v", err)    }    go dc.Run(int(ctx.ComponentConfig.DeploymentController.ConcurrentDeploymentSyncs), ctx.Stop)    return nil, true, nil}

Deployment Controller 启动流程

那么先从启动逻辑开始,Kube-Controller-Manager 中所有的 Controller 的启动逻辑都差不多,都是在 Run() 方法中完成初始化并启动,NewControllerInitializers 会初始化所有 Controller,而 startXXXXController() 则会启动对应的 Controller。

deployment-controller-启动流程

核心逻辑 syncHandler

Deployment Controller 在初始化时指定了 dc.syncHandler = dc.syncDeployment,所以核心逻辑就是围绕 syncDeployment() 来展开的。

deployment-controller-核心逻辑

从源码可以看出,删除、暂停、回滚、扩缩容、更新策略的优先级为 delete > pause > rollback > scale > rollout。而最终都不是直接更新或修改对应资源,而是通过 dc.client.AppsV1().Deployments().UpdateStatus() 更新 Deployment Status。

结语

以上就是 Deployment Controller 代码逻辑,通过流程图,希望能描述的更加清晰。因为是第一次尝试图解,可能有遗漏和不足,欢迎点击右下角阅读原文留言指正。图解 Kubernetes 源码将作为一个系列继续下去,后续会带来更多的源码图解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Deployment Controller
    • Deployment、ReplicaSet 和 Pod
    • Deployment Controller 启动流程
    • 核心逻辑 syncHandler
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档