Status 子资源管理
Status 子资源的意义
将 spec(期望状态)和 status(实际状态)分离:
spec由用户写入status由 Controller 写入- 通过子资源 API 分别更新,避免冲突
定义 Status
go
type MyAppStatus struct {
// +kubebuilder:validation:Enum=Pending;Running;Failed;Succeeded
Phase string `json:"phase,omitempty"`
ReadyReplicas int32 `json:"readyReplicas,omitempty"`
// 使用标准 Condition 类型
Conditions []metav1.Condition `json:"conditions,omitempty"`
ObservedGeneration int64 `json:"observedGeneration,omitempty"`
Message string `json:"message,omitempty"`
}更新 Status
go
func (r *MyAppReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
myApp := &appsv1alpha1.MyApp{}
if err := r.Get(ctx, req.NamespacedName, myApp); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
// 业务逻辑...
// 更新 Status(使用 Status().Update,不影响 spec)
myApp.Status.Phase = "Running"
myApp.Status.ReadyReplicas = 3
myApp.Status.ObservedGeneration = myApp.Generation
// 设置标准 Condition
meta.SetStatusCondition(&myApp.Status.Conditions, metav1.Condition{
Type: "Ready",
Status: metav1.ConditionTrue,
ObservedGeneration: myApp.Generation,
Reason: "DeploymentReady",
Message: "所有副本已就绪",
})
if err := r.Status().Update(ctx, myApp); err != nil {
return ctrl.Result{}, err
}
return ctrl.Result{}, nil
}标准 Condition 类型
go
// 常用 Condition Type
const (
ConditionReady = "Ready"
ConditionAvailable = "Available"
ConditionProgressing = "Progressing"
ConditionDegraded = "Degraded"
)
// Condition Status
// metav1.ConditionTrue
// metav1.ConditionFalse
// metav1.ConditionUnknown在 CRD 中启用 Status 子资源
go
// +kubebuilder:subresource:status
type MyApp struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec MyAppSpec `json:"spec,omitempty"`
Status MyAppStatus `json:"status,omitempty"`
}yaml
# 生成的 CRD 中
subresources:
status: {}查看 Status
bash
# 查看 Status
kubectl get myapp my-app -o jsonpath='{.status}'
# 查看 Conditions
kubectl get myapp my-app -o jsonpath='{.status.conditions[*]}'
# 等待 Ready
kubectl wait myapp/my-app --for=condition=Ready --timeout=120s