Kubernetes
中的Deployment Controller
是一个负责管理Pod
副本集的控制器。它在Kubernetes
集群中负责确保Pod
的副本数始终符合用户指定的期望值。Deployment Controller
能够对Pod
进行滚动更新(默认的更新策略),通过逐步替换Pod
的方式更新应用程序,以确保服务的高可用性和零停机时间。Deployment Controller
使用控制循环对目标状态和当前状态进行比较,并对任何不同之处进行调整,以确保集群中的Pod
数始终符合用户指定的期望值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// DeploymentController启动入口
// cmd/kube-controller-manager/app/apps.go
func startDeploymentController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) {
dc, err := deployment.NewDeploymentController(
ctx,
controllerContext.InformerFactory.Apps().V1().Deployments(),
controllerContext.InformerFactory.Apps().V1().ReplicaSets(),
controllerContext.InformerFactory.Core().V1().Pods(),
controllerContext.ClientBuilder.ClientOrDie("deployment-controller"),
)
if err != nil {
return nil, true, fmt.Errorf("error creating Deployment controller: %v", err)
}
go dc.Run(ctx, int(controllerContext.ComponentConfig.DeploymentController.ConcurrentDeploymentSyncs))
return nil, true, nil
}
// 完成Controller注册
// cmd/kube-controller-manager/app/controllermanager.go
func NewControllerInitializers(loopMode ControllerLoopMode) map[string]InitFunc {
controllers := map[string]InitFunc{}
// All of the controllers must have unique names, or else we will explode.
register := func(name string, fn InitFunc) {
if _, found := controllers[name]; found {
panic(fmt.Sprintf("controller name %q was registered twice", name))
}
controllers[name] = fn
}
...
register("deployment", startDeploymentController)
...
}
// 最后会在Run方法中调用
func Run(ctx context.Context, c *config.CompletedConfig) error {
run := func(ctx context.Context, startSATokenController InitFunc, initializersFunc ControllerInitializersFunc) {
controllerContext, err := CreateControllerContext(logger, c, rootClientBuilder, clientBuilder, ctx.Done())
if err != nil {
logger.Error(err, "Error building controller context")
klog.FlushAndExit(klog.ExitFlushTimeout, 1)
}
controllerInitializers := initializersFunc(controllerContext.LoopMode)
if err := StartControllers(ctx, controllerContext, startSATokenController, controllerInitializers, unsecuredMux, healthzHandler); err != nil {
logger.Error(err, "Error starting controllers")
klog.FlushAndExit(klog.ExitFlushTimeout, 1)
}
controllerContext.InformerFactory.Start(stopCh)
controllerContext.ObjectOrMetadataInformerFactory.Start(stopCh)
close(controllerContext.InformersStarted)
<-ctx.Done()
}
// No leader election, run directly
if !c.ComponentConfig.Generic.LeaderElection.LeaderElect {
// 启动NewControllerInitializers注册的controller
run(ctx, saTokenControllerInitFunc, NewControllerInitializers)
return nil
}
...
}
1 | // DeploymentController启动入口 |
1 | // pkg/controller/deployment/deployment_controller.go |
1 | // pkg/controller/deployment/rolling.go |
REF:
1.cmd/kube-controller-manager/app/apps.go
2.pkg/controller/deployment/deployment_controller.go
3.pkg/controller/deployment/rolling.go