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