簡體   English   中英

K8s 自定義資源的更新狀態

[英]Update Status for K8s Custom Resource

我正在嘗試更新自定義資源的狀態,但我無法弄清楚為什么它不起作用..

這是_types.go

// ScoringServerStatus defines the observed state of ScoringServer
type ScoringServerStatus struct {
    // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
    // Important: Run "make" to regenerate code after modifying this file
    Reason     string             `json:"reason"`
    Message    string             `json:"message"`
    Conditions []metav1.Condition `json:"conditions"`
}

//+kubebuilder:object:root=true
//+kubebuilder:subresource:status

// ScoringServer is the Schema for the scoringservers API
type ScoringServer struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty"`

    Spec   ScoringServerSpec   `json:"spec,omitempty"`
    Status ScoringServerStatus `json:"status,omitempty"`
}

我正在嘗試在此狀態下設置 Reason 和 Message 的值:

if !isProjectAvailable {
        infoMessage = "Unable to find requested project, can't deploy scoring server"
        log.Log.Info(infoMessage)
        statusUpdate := scoringv1.ScoringServerStatus{Reason: "Unable to verify project in Machinify", Message: infoMessage}
        log.Log.Info(statusUpdate.Reason)
        scoringServer.Status = statusUpdate
        if err := r.Status().Update(ctx, scoringServer); err != nil {
            log.Log.Info(err.Error())
        }
        return ctrl.Result{Requeue: false, RequeueAfter: 0}, nil
    }

但是當我運行它時沒有任何變化。 我沒有收到任何錯誤,如果我描述了資源,我沒有看到更新的狀態...

我只是遇到了同樣的問題並瀏覽了答案,不知何故你的代碼給了我一個提示。

對我來說這很好用:

err := r.Client.Status().Update(ctx, k8sproj)
if err != nil {
  fmt.Printf("Could not update project id: \n%s\n ", err)
}

注意Client() ...

希望能幫助到你!

成功更新 CR 的狀態后,您應該通過返回reconcile.Result以下列方式強制再次調用Reconcile func:

if err := r.Status().Update(ctx, scoringServer); err != nil {
  log.Log.Info(err.Error())
}

if err != nil {
  return reconcile.Result{}, err
}

嘗試替換此代碼片段:

return ctrl.Result{Requeue: false, RequeueAfter: 0}, nil

if err != nil {
  return reconcile.Result{}, err
}

為避免不必要的協調循環,您可以檢查狀態的變化:

if !reflect.DeepEqual(oldStatus, newStatus) {
  if err := r.Status().Update(ctx, scoringServer); err != nil {
    log.Log.Info(err.Error())
  }

  if err != nil {
    return reconcile.Result{}, err
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM