天天看點

圖解 K8S 源碼 - Deployment Controller 篇

圖解 K8S 源碼 - 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

圖解 K8S 源碼 - 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。

圖解 K8S 源碼 - Deployment Controller 篇

核心邏輯 syncHandler

Deployment Controller 在初始化時指定了

dc.syncHandler = dc.syncDeployment

,是以核心邏輯就是圍繞

syncDeployment()

來展開的。

圖解 K8S 源碼 - Deployment Controller 篇

從源碼可以看出,删除、暫停、復原、擴縮容、更新政策的優先級為

delete > pause > rollback > scale > rollout

。而最終都不是直接更新或修改對應資源,而是通過

dc.client.AppsV1().Deployments().UpdateStatus()

更新 Deployment Status。

結語

以上就是 Deployment Controller 代碼邏輯,通過流程圖,希望能描述的更加清晰。因為是第一次嘗試圖解,可能有遺漏和不足,歡迎留言指正。圖解 Kubernetes 源碼将作為一個系列繼續下去,後續會帶來更多的源碼圖解。

圖解 K8S 源碼 - Deployment Controller 篇

繼續閱讀