Skip to content

Node Maintenance Operator — NodeMaintenance CRD 規格

對象: Operators、Developers|章節: 核心功能


CRD 基本資訊

屬性
KindNodeMaintenance
Groupnodemaintenance.medik8s.io
Versionv1beta1
ScopeCluster-scoped
Short namenm
FinalizerforegroundDeleteNodeMaintenance

Spec 欄位

來源:api/v1beta1/nodemaintenance_types.go lines 43–54

欄位類型必填說明
nodeNamestring要進行維護的節點名稱(建立後不可修改)
reasonstring維護原因說明

Status 欄位

來源:api/v1beta1/nodemaintenance_types.go lines 67–99

欄位類型說明可能值
phaseMaintenancePhase維護進度狀態RunningSucceededFailed
drainProgressint排空完成百分比0100
lastUpdatemetav1.Time最後狀態更新時間RFC3339 timestamp
lastErrorstring最近一次 reconcile 錯誤訊息任意錯誤字串
pendingPods[]string尚未驅逐的 Pod 名稱清單Pod name strings
pendingPodsRefs[]PodReference尚未驅逐的 Pod 參照清單PodReference 陣列
totalPodsint維護開始時節點上的總 Pod 數整數
evictionPodsint需要驅逐的 Pod 總數整數
errorOnLeaseCountint連續 lease 取得失敗次數(上限 3)03+

Phase 列舉

go
// 檔案: api/v1beta1/nodemaintenance_types.go
const (
    MaintenanceRunning   MaintenancePhase = "Running"   // 維護進行中
    MaintenanceSucceeded MaintenancePhase = "Succeeded" // 維護完成,所有 Pod 已驅逐
    MaintenanceFailed    MaintenancePhase = "Failed"    // 維護失敗
)

PodReference 結構

go
// 檔案: api/v1beta1/nodemaintenance_types.go
type PodReference struct {
    Namespace string `json:"namespace,omitempty"`
    Name      string `json:"name,omitempty"`
}

完整範例 CR

最小配置

yaml
# 建立維護請求
apiVersion: nodemaintenance.medik8s.io/v1beta1
kind: NodeMaintenance
metadata:
  name: maintain-node02
spec:
  nodeName: node02
  reason: "硬體更換 - RAM 升級"

維護進行中的 Status 範例

yaml
apiVersion: nodemaintenance.medik8s.io/v1beta1
kind: NodeMaintenance
metadata:
  name: maintain-node02
spec:
  nodeName: node02
  reason: "硬體更換 - RAM 升級"
status:
  phase: Running
  drainProgress: 60
  lastUpdate: "2024-05-10T08:23:41Z"
  lastError: ""
  totalPods: 10
  evictionPods: 6
  pendingPods:
    - coredns-7db6d8ff4d-xkpqz
    - my-app-5f9b8c6d4-rlmwt
  pendingPodsRefs:
    - namespace: kube-system
      name: coredns-7db6d8ff4d-xkpqz
    - namespace: default
      name: my-app-5f9b8c6d4-rlmwt
  errorOnLeaseCount: 0

不可變欄位

spec.nodeName 建立後不可修改

Webhook 的 ValidateUpdate 會拒絕任何修改 spec.nodeName 的請求,錯誤訊息:

"updating spec.NodeName isn't allowed"

若需要對不同節點進行維護,請刪除現有的 NodeMaintenance 資源並重新建立。


kubectl 常用操作

bash
# 列出所有維護請求
kubectl get nm

# 查看詳細狀態
kubectl describe nm maintain-node02

# 刪除(觸發節點恢復)
kubectl delete nm maintain-node02

使用 -o wide 取得更多資訊

bash
kubectl get nm -o wide

輸出中可見 PHASENODENAME 等欄位,方便快速掌握各節點維護狀態。


相關章節

基於 Apache 2.0 授權