Skip to content

Node Maintenance Operator — 專案總覽

分析版本

本文件基於 commit d1a537be 進行分析。

  • operator-sdk: v1.37.0
  • controller-runtime: v0.22.5
  • Kubernetes: 1.34

專案簡介

Node Maintenance Operator (NMO) 是由 medik8s 社群維護的 Kubernetes/OpenShift Operator(前身隸屬於 KubeVirt 專案)。其 Go module 為 github.com/medik8s/node-maintenance-operator,程式進入點為單一的 main.go

核心職責:監看 NodeMaintenance Custom Resource(CR),自動執行等同 kubectl drain 的節點排空流程:

事件Operator 行為
CR 建立封鎖(cordon)節點、套用 taint、驅逐所有 Pod
CR 刪除取消封鎖(uncordon)節點、移除 taint

額外協調機制

  • Lease:與同屬 medik8s 的 Node Health Check (NHC) 等 operator 協調,避免同時維護多個節點。

  • OpenShift etcd quorum 保護:在允許 control-plane 節點進入維護前,驗證 etcd quorum 是否健全。

  • GitHub: medik8s/node-maintenance-operator

  • License: Apache 2.0

  • 語言: Go (operator-sdk / controller-runtime)

運作流程

Node Maintenance Operator 運作流程

快速開始

建立 NodeMaintenance CR

yaml
apiVersion: nodemaintenance.medik8s.io/v1beta1
kind: NodeMaintenance
metadata:
  name: nodemaintenance-sample
spec:
  nodeName: node02
  reason: "Test node maintenance"
bash
# 套用 CR,開始節點維護
kubectl apply -f nodemaintenance-sample.yaml

# 觀察維護進度
kubectl get nodemaintenance nodemaintenance-sample -o yaml

# 完成後刪除 CR,解除節點封鎖
kubectl delete nodemaintenance nodemaintenance-sample

狀態欄位說明

套用 CR 後,可透過 status 欄位追蹤進度:

欄位說明
phase目前階段:Running / Succeeded / Failed
drainProgress驅逐進度百分比(0–100)
pendingPods尚未驅逐的 Pod 名稱清單
lastError最新錯誤訊息
totalPods開始時的 Pod 總數
evictionPods需要驅逐的 Pod 數量

文件導覽

系統架構

頁面說明
系統架構系統元件、Reconcile 流程、狀態機
部署與設定OLM bundle、kustomize、設定參數

核心功能

頁面說明
NodeMaintenance CRD 規格Spec/Status 所有欄位、Phase 列舉
節點排空工作流程kubectl drain 整合、Pod 驅逐邏輯
Admission ValidationWebhook 檢查邏輯、錯誤訊息
Lease 分散式協調多實例協調、AlreadyHeldError
Taint 管理與 Cordoning兩種 taint、JSON Patch 策略

維運進階

頁面說明
RBAC 與權限ClusterRole 清單、各權限用途
故障排除常見失敗模式、must-gather
事件與可觀測性Kubernetes Events、健康探針

相關章節

依使用情境快速跳轉:

基於 Apache 2.0 授權