Skip to content

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 無リセット

pre-thresholdgraceful windowforceful window09:26:20Zage 48m · eligible10:26:20Zage 1h48m · forceful 境界10:38:20Zage 2h · backstop(未到達)08:3809:0809:3810:0810:38batch123456789101112
graceful surge(placeholder あり)× 9 forceful fallback(surge-less)× 3 expireAfter backstop(今回 0)
9

Case A graceful

残り ≥ t_rot(12m)

デッドラインまで surge を完了する余裕がある。placeholder Pod → 新ノード Ready → 旧ノードを voluntary drain(PDB 適用)。mode は空。番号 1–9

3

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

0

Case C backstop

age = 2h に到達

forceful すら間に合わず期限到達 → Karpenter が強制失効(outcome=expired)。「fallback の fallback」。今回は forceful が 10:33 までに全て処理し 0 件。

時刻 UTCageフェーズNodeClaim挙動・証拠
08:38:200▸ 12ノード同期バッチ生成共有デッドライン 10:38:20Z。schedule が意図的 warn(ThroughputBurstShortfall N=12>K·C=6 / ThroughputBelowArrival
09:26:2048m▸ eligible 境界(ageThreshold A=48m)ここから候補が rotation 対象に
09:26:2448mgraceful152t8hplaceholder surge → make-before-break(total 1m2s)
09:33:4155mgraceful25rp47placeholder Pending→Runningmode
09:41:291h03mgraceful394f5n同上(cooldown 6m で間隔 ~7m)
09:48:451h10mgraceful4fvd7p同上
09:56:341h18mgraceful5gjgg8同上
10:04:501h26mgraceful6n8zqt同上
10:12:401h34mgraceful7p2vdk同上
10:19:541h41mgraceful8phmms同上
10:24:211h46mgraceful9rnwb7最後の graceful(age 1h46m、境界 1h48m の直前)
10:26:201h48m▸ forceful 境界通過(deadline − t_rot)直前 10:24:00 に cooldown 6m→1m。以降の pick は全て Case B
10:26:551h48mforceful10sgh57最初の forceful(age 1h48m35s)、mode=forceful-fallback、placeholder NotFoundcounter 0→1
10:30:591h52mforceful11t7sb5surge-less、Warning event、counter →2
10:33:161h54mforceful12tkkf7counter →3 完成、全12本 rotate 完了(deadline 10:38 の ~5m 前)
10:38:202h▸ expireAfter backstop — 未到達(Case C 0件)

#157(earliest-deadline order): 12本は creationTimestamp を共有するため順序は Name tiebreak に縮退し、正確に昇順で消費 — 52t8h < 5rp47 < 94f5n < fvd7p < gjgg8 < n8zqt < p2vdk < phmms < rnwb7 < sgh57 < t7sb5 < tkkf7

mix は cooldown 調整で成形: 実 graceful は ~1 分(46s–1m51s)で終わるため放置すると serial surge が全部さばき forceful が出ない。前半 cooldownAfter=6m で surplus をデッドラインまで残し、境界直前 10:24 に 1m に落として backstop 前に forceful を出し切った。expireAfter は不変なのでトリックではない。

t_rot = readyTimeout 5m + tGP 5m + Buffer 2m = 12m(Buffer は #215 で 15m→2m)。分岐点は純粋に「pick 時刻が 10:26:20Z より前か後か」だけで、共有デッドラインゆえ境界をまたいだ瞬間に残り全部が forceful へ一斉に切り替わった。

シナリオカバレッジ

以下のマトリクスは、これまでの 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(一部)

主眼(primary) 副次的に通過(secondary) 対象外 validated(実 EKS で観測) planned(コードのみ)⚠ 重複 同一能力を2シナリオが主眼に☁ 外部 Karpenter/AWS の保証
能力 / シナリオ →状態0ABCDEFGHIJKLM-AM-BNO
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)。

コスト削減時は優先度を下げられる(ドキュメント信頼が前提)。

do-not-disrupt は「重複」ではなく 3 面: ①書く(H) / ②読んで除外(#170, O) / ③Karpenter が honor(N) は別レイヤなので冗長ではない。ただし同一キーに集中するので、まとめて把握しておくと変更時の影響範囲が読みやすい。

最小カバー集合の目安: 固有 = 0, A, B, E, F, G, J, K, L, M-A, O。重複を畳むなら I(D 内包) + C か M-B のどちらか、N はオプション。O は多能力(#156 本体 + #157 + #170、backstop/expired/PDB/surge も副次的に通過)。

出典: test/e2e/eks-automode/SCENARIOS.md(手順)と VALIDATION.md(各シナリオの観測証拠)、spec §7.2●/◯ は「主眼か副次か」の判断であり、副次通過を網羅列挙したものではない。