Skip to content

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

本站内容由 褚成志 整理编写,仅供学习参考