Forceful Fallback — シナリオ O
この検証の対象
ウィンドウ有界の forceful fallback(#156)、earliest-deadline ソート(#157)、do-not-disrupt 除外(#170)を同一デッドライン上で同時に走らせた実 EKS Auto Mode 検証。
上記 3 機能を同時に行使した実 EKS 検証。この検証が validated に切り替える前提は §7.2 を、noderotation_forceful_fallback_total メトリクスと ForcefulFallback Warning イベントの運用上の意味は ランブック を参照。
Scenario O · EKS Auto Mode · 2026-07-12 UTC
共有デッドライン上の 12 ノード rotation — graceful → forceful fallback の分岐
12 ノードは同時生成で同一 creationTimestamp(デッドライン)を共有。serial(maxUnavailable=1)で 1 本ずつ処理され、その番が来た時刻がデッドラインまで t_rot(12m)以上残っているかだけで graceful か forceful かが決まる。expireAfter は終始 2h 固定(trick-free)。
forceful_fallback_total
0 → 3
completed{success}
12 9 graceful + 3 forceful
expireAfter backstop
0 expired
controller restarts
0 counter 無リセット
タイムライン(2h 比例軸)
判定ロジック(pick 時点の残り時間で分岐)
Case A graceful
残り ≥ t_rot(12m)
デッドラインまで surge を完了する余裕がある。placeholder Pod → 新ノード Ready → 旧ノードを voluntary drain(PDB 適用)。mode は空。番号 1–9。
Case B forceful
残り < t_rot(12m)
graceful surge が間に合わない。in-window かつ opt-in なので placeholder なしで NodeClaim を削除(voluntary・PDB 適用)。mode=forceful-fallback、Warning event、counter +1。番号 10–12。
Case C backstop
age = 2h に到達
forceful すら間に合わず期限到達 → Karpenter が強制失効(outcome=expired)。「fallback の fallback」。今回は forceful が 10:33 までに全て処理し 0 件。
時系列(実測ログ)
| 時刻 UTC | age | フェーズ | NodeClaim | 挙動・証拠 |
|---|---|---|---|---|
| 08:38:20 | 0 | ▸ 12ノード同期バッチ生成 — 共有デッドライン 10:38:20Z。schedule が意図的 warn(ThroughputBurstShortfall N=12>K·C=6 / ThroughputBelowArrival) | ||
| 09:26:20 | 48m | ▸ eligible 境界(ageThreshold A=48m) — ここから候補が rotation 対象に | ||
| 09:26:24 | 48m | graceful | 152t8h | placeholder surge → make-before-break(total 1m2s) |
| 09:33:41 | 55m | graceful | 25rp47 | placeholder Pending→Running、mode 空 |
| 09:41:29 | 1h03m | graceful | 394f5n | 同上(cooldown 6m で間隔 ~7m) |
| 09:48:45 | 1h10m | graceful | 4fvd7p | 同上 |
| 09:56:34 | 1h18m | graceful | 5gjgg8 | 同上 |
| 10:04:50 | 1h26m | graceful | 6n8zqt | 同上 |
| 10:12:40 | 1h34m | graceful | 7p2vdk | 同上 |
| 10:19:54 | 1h41m | graceful | 8phmms | 同上 |
| 10:24:21 | 1h46m | graceful | 9rnwb7 | 最後の graceful(age 1h46m、境界 1h48m の直前) |
| 10:26:20 | 1h48m | ▸ forceful 境界通過(deadline − t_rot) — 直前 10:24:00 に cooldown 6m→1m。以降の pick は全て Case B | ||
| 10:26:55 | 1h48m | forceful | 10sgh57 | 最初の forceful(age 1h48m35s)、mode=forceful-fallback、placeholder NotFound、counter 0→1 |
| 10:30:59 | 1h52m | forceful | 11t7sb5 | surge-less、Warning event、counter →2 |
| 10:33:16 | 1h54m | forceful | 12tkkf7 | counter →3 完成、全12本 rotate 完了(deadline 10:38 の ~5m 前) |
| 10:38:20 | 2h | ▸ expireAfter backstop — 未到達(Case C 0件) | ||
シナリオカバレッジ
以下のマトリクスは、これまでの EKS Auto Mode PoC 各シナリオを仕様書のロードマップおよび未決事項に対して追跡したもの。各シナリオは実クラスターで再実行・観測されるまで「計画中」のまま — コードカバレッジ(unit / envtest / KWOK)は必要条件だが十分ではない。
EKS Auto Mode PoC · SCENARIOS.md × VALIDATION.md
シナリオ・カバレッジ・マトリクス
縦 = 検証される能力(挙動レイヤ)、横 = シナリオ 0〜O。● = そのシナリオの主眼、◯ = 副次的に通過。同じ能力を ● が2つ持つ行が重複、☁ 行はKarpenter/AWS 自体の保証(自コントローラのロジックではない)。
シナリオ
17 0, A–O
検証される能力
17 レイヤ
重複している能力行
2 backstop · rollback
Karpenter/AWS 寄り
2 N · A(一部)
| 能力 / シナリオ → | 状態 | 0 | A | B | C | D | E | F | G | H | I | J | K | L | M-A | M-B | N | O |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Surge & 配置 | ||||||||||||||||||
| Surge — 新規プロビジョニングmake-before-break | ✓ | |||||||||||||||||
| Surge — capacity-absorb既存 spare へ bin-pack(新ノード無し) | ✓ | |||||||||||||||||
| 配置 — NodePool 閉じ込め別プールの spare へ漏れない | ✓ | |||||||||||||||||
| ゲート(開始しない / 境界) | ||||||||||||||||||
ゲート — NodePool limits余地無しなら surge しない | ✓ | |||||||||||||||||
| ゲート — メンテナンス窓 / 境界in-flight 完了・境界後は開始せず | ✓ | |||||||||||||||||
| Backstop・失敗・outcome | ||||||||||||||||||
expireAfter backstop (R6)⚠ D⊂Ilead time が勝ち切る | ✓ | |||||||||||||||||
readyTimeout rollback + cleanup⚠ C≈M-Bstate=failed / retry++ / uncordon | ✓ | |||||||||||||||||
強制失効の expired outcomepending 中に捕捉 | ✓ | |||||||||||||||||
| PDB 尊重の voluntary drainminAvailable が実際にブロック | ✓ | |||||||||||||||||
| do-not-disrupt(同一キー・3面) | ||||||||||||||||||
| ① コントローラが書くsurge ペア保護 + owned marker | ✓ | |||||||||||||||||
| ② 候補選択から除外(読む)#170 | ✓ | |||||||||||||||||
| ③ Karpenter が honor(Drift)☁ 外部 | ✓ | |||||||||||||||||
| 堅牢性・その他 | ||||||||||||||||||
| leader 交代の再開annotation のみから継続 | ✓ | |||||||||||||||||
| placeholder の preemption被害者 / preemptionPolicy=Never | ✓ | |||||||||||||||||
| zonal-EBS(PV) 再アタッチ☁ 一部ステートフル・CSI/AWS | ✓ | |||||||||||||||||
| Forceful fallback(v0.4+ / #156・#157・#170) | ||||||||||||||||||
| surge-less forceful fallback#156 | ✓ | |||||||||||||||||
| earliest-deadline 順序#157 | ✓ | |||||||||||||||||
列凡例 — 0 core surge · A zonal-EBS · B limits · C readyTimeout · D backstop · E expired · F confinement · G PDB · H dnd-write · I R6 soak · J absorb · K leader · L window · M-A preemption · M-B rollback · N dnd-honor · O forceful-fallback(+#157/#170)
重複・包含サマリ
D ⊂ I backstop
I が D を包含。D は backstop メトリクスの静的スナップショット、I は連続 rotation で動的に同じ性質を実証。R6 の実証は I 単体で足りる。
再検証は I を残し D を畳む(静的値は I の 1 行に併記)。
C ≈ M-B rollback
両者とも同じ rollback クリーンアップ(state=failed・retry++・uncordon・surge 破棄)を検証。違いは引き金だけ(C=ノード未 Ready/M-B=placeholder が Pending)。
rollback アサーションはどちらか一方で足りる(M-A の preemption は固有なので残す)。
N · A(一部) 外部保証
N(Karpenter が do-not-disrupt を honor)と A の EBS 再アタッチは、自コントローラのロジックというより Karpenter/AWS の保証の確認(de-risking)。
コスト削減時は優先度を下げられる(ドキュメント信頼が前提)。