图解 K8S 源码 - Deployment Controller 篇

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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
300 1
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
2766 0
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
633 0
|
Kubernetes 容器 Perl
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
|
存储 Kubernetes 网络协议
在K8S中,Deployment和Statefulset有何区别?
在K8S中,Deployment和Statefulset有何区别?
|
Kubernetes API 开发工具
在K8S中,Deployment的升级过程是什么?
在K8S中,Deployment的升级过程是什么?
|
存储 Kubernetes 调度
在K8S中,deployment的创建过程包括什么?
在K8S中,deployment的创建过程包括什么?
|
Kubernetes API 容器
在K8S中,deployment的yaml文件如何编写呢?
在K8S中,deployment的yaml文件如何编写呢?
|
Kubernetes 容器 Perl
在k8S中,deployment升级策略是什么?
在k8S中,deployment升级策略是什么?
|
Kubernetes API Perl
在k8S中,deployment升级过程是什么?
在k8S中,deployment升级过程是什么?

推荐镜像

更多