State也就是状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。
在Kubernetes 中,DeploymentController 作为控制器之一,主要负责维护 Deployment 对象的状态,即根据用户定义的 Deployment 规范,创建、更新、删除 ReplicaSet 和 Pod 等资源,确保应用的正确运行。
1 | // pkg/apis/apps/types.go |
下面这段代码是 DeploymentController 在检测 Deployment 的部署状态时,使用状态模式进行状态转换的一个例子。该控制器使用 DeploymentCondition 对象来跟踪 Deployment 的状态。在这里,根据 Deployment 是否已经完成(DeploymentComplete)、是否在进行中(DeploymentProgressing)以及是否已经超时(DeploymentTimedOut)等三种状态,来执行不同的操作。
首先,如果 Deployment 已经完成,则会创建一个新的 DeploymentCondition 对象,将其状态设置为 True,原因设置为 NewReplicaSetAvailable,具体是哪个取决于新创建的 ReplicaSet 是否存在。然后,使用 SetDeploymentCondition 方法将其设置为Deployment 的新状态。
其次,如果 Deployment 正在进行中,则会创建一个的 DeploymentCondition 对象。如果currentCond不为nil且该对象的状态为 True,则将其上次转换时间 condition.LastTransitionTime设置为currentCond.LastTransitionTime。然后使用 SetDeploymentCondition 方法更新。
最后,如果 Deployment 已经超时,则会创建一个新的 DeploymentCondition 对象,将其状态设置为 False,原因设置为 TimedOutReason,并使用 SetDeploymentCondition 方法将其设置为 Deployment 的新状态。
1 | // pkg/controller/deployment/progress.go |
这种方式可以将状态转换的逻辑从主控制器中分离出来,这样做可以使代码更加清晰、易于维护。
REF:
1.pkg/controller/deployment/progress.go
2.hpkg/apis/apps/types.go