CAEP: Machine health checking a.k.a node auto repair proposal を読む
ClusterAPI v0.3.0で対応予定のMachine Health CheckingについてのCAEP(ClusterAPI Enhancement Proposal)を読んでみます。
- CAEP: Machine health checking a.k.a node auto repair proposal #1684
- Machine Health Checking tracking issue #1990
このCAEPは、端的にいうと「異常なノードを検出してそれを復旧する」機能を追加するものです。2019年10月30日にPRが作成され、2019年12月19日にマージされています。
モチベーションとして、以下の2点が挙げられています。
- クラスターを実行するための管理オーバーヘッドを減らす
- マシン障害への対応能を高め、クラスターノードを正常に保つ
何らかの要因によってノードが正常に動作しなくなった場合、自動的に正常な状態に戻ってくれると管理コストは下がります。かなり嬉しい機能ですよね。gardener/machine-controller-managerは似たような機能を持っているのだけど、ClusterAPIにはなかったので、追いついた?形になります。
ゴールは以下の3点。
- マシンやノードのグループの自動化された改善を有効にする
- ノードグループごとに健全性の基準をユーザが定義できるようにする
- 同時に複数のノードが異常な状態になった時、自動復旧を無効にする閾値を設定できるようにする
単に異常を検知して作り直す、というだけではなく、健全性の基準をユーザが定義できたり過剰に反応して逆にトラブルにならないよう考えられています。
プロポーザル
このプロポーザルでは、Machine Health Checker(MHC)を提案しています。これは不健全なノードを削除することでクラスタのノードを極力健全に保つためのものとあります。
さて、不健全なマシンを自動復旧するためには不健全とは何かの基準が必要です。プロポーザルは基準として3点挙げています。
- マシンに関連づけられたノードが定義された異常なノードコンディションとなっている
- マシンがnodeRefを持っていない
- マシンがnodeRefを持っているが、そのノードがない
MachineHealthCheck CRD
どういうマシンを監視し、どういう場合に異常とみなすかはカスタムリソースを作ることで定義します。 プロポーザルに記載されているサンプルの場合、ノードが ready=Unknown
かready=False
の状態で5分経過したら修復されます。また、マッチするノード群のうち40%が異常状態の場合、自動修復を無効にします。
apiVersion: cluster.x-k8s.io/v1alpha3
kind: MachineHealthCheck
metadata:
name: example
namespace: machine-api
spec:
selector:
matchLabels:
role: worker
unhealthyConditions:
- type: "Ready"
status: "Unknown"
timeout: "5m"
- type: "Ready"
status: "False"
timeout: "5m"
maxUnhealthy: "40%"
status:
currentHealthy: 5
expectedMachines: 5
Machine Health Check はコントローラーとして実装されており、machineHealthCheckリソース、Machineリソース、Nodeリソースを監視します。あとはReconcileLoopでMachineやNodeの状態に応じてオペレーションを行うだけ。Machine Health Check コントローラはMachineリソースを削除するまでを行い、残りはMachineControllerやMachineSetControllerに任せています。
代替案
他の方法との比較についてもプロポーザル内で触れられています。MachineSetに組み込んだり、ラベルセレクターを使わずにMachineSetをターゲットにしたり、Pod Distributed Budgetのような物を検討したようですが、それぞれいまいちな点があり今回のプロポーザルの設計になったようです(英語力の問題で、却下した理由を理解できなかった)。
MachineHealthCheckリソースを作らなければ自動修復機能が動くこともないので、ClusterAPIをアップグレードしたら突然動いてびっくりする、ということもなく安心。やることがシンプルで、うまい設計だなあと思いました。