图解 K8S 源码 - Deployment Controller 篇

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 两张图帮你了解 Deployment Controller 源码

前言

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 操作,来进行状态更新逻辑。

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 源码将作为一个系列继续下去,后续会带来更多的源码图解。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6天前
|
弹性计算 运维 Kubernetes
Kubernetes(K8S) Controller - Deployment 介绍
Kubernetes(K8S) Controller - Deployment 介绍
8 1
|
6天前
|
存储 Kubernetes 关系型数据库
Kubernetes(K8S) Controller - StatefulSet、DaemonSet 介绍
Kubernetes(K8S) Controller - StatefulSet、DaemonSet 介绍
11 0
|
6天前
|
Kubernetes Java Shell
Kubernetes(K8S) Deployment 升级和回滚
Kubernetes(K8S) Deployment 升级和回滚
5 0
|
6天前
|
Kubernetes Java Docker
Kubernetes(K8S) Deployment 拉取阿里云镜像部署
Kubernetes(K8S) Deployment 拉取阿里云镜像部署
16 0
|
3月前
|
Kubernetes Go Perl
k8s 怎么精准获取deployment关联的pods?
该内容是关于Kubernetes中通过标签获取Deployment管理的Pod的流程和代码示例。首先,Deployment创建ReplicaSets,然后ReplicaSets创建Pod。获取Pod的步骤包括:1) 使用标签选择器获取ReplicaSets;2) 过滤出属于特定Deployment的ReplicaSets;3) 通过标签选择器获取Pod;4) 过滤出属于特定ReplicaSets的Pod。提供的Go代码展示了如何实现这一过程。
|
3月前
|
Kubernetes 测试技术 Docker
K8S中Deployment控制器的概念、原理解读以及使用技巧
K8S中Deployment控制器的概念、原理解读以及使用技巧
|
3月前
|
运维 Kubernetes 容灾
kubernetes核心技术之Controller控制器知识总结
kubernetes核心技术之Controller控制器知识总结
39 1
|
3月前
|
Kubernetes 容器
阿里云OpenAPI咋取到ack集群的Deployment呀?
阿里云OpenAPI咋取到ack集群的Deployment呀?【1月更文挑战第17天】【1月更文挑战第84篇】
37 2
|
3月前
|
消息中间件 Kubernetes 监控
kubernetes—Controller详解(二)
kubernetes—Controller详解(二)
58 0
|
11天前
|
canal Kubernetes Docker
基于Kubernetes v1.25.0和Docker部署高可用集群(03部分)
基于Kubernetes v1.25.0和Docker部署高可用集群(03部分)

推荐镜像

更多