feat: 失敗セッションの調査性を改善(終了Pod保持 + ログAPI + UI)(v2.1.263-d)
Helm Chart Release / release-chart (push) Successful in 7s
Build Session Image / build-push (push) Successful in 2m3s

セッション Pod がブート失敗で Failed になると reaper が即削除し kubectl logs で
死因を追えなかった。「開く」で 502 になるだけで原因不明だった。

- session.reaper.terminatedRetentionSeconds(既定 900): 終了済み Pod を
  finishedAt からこの秒数は回収しない。manager 回収ループと reaper CronJob 両方が尊重
- GET /api/sessions/<id>/log: セッション Pod のログを text で返す(pods/log get のみ、追加権限なし)
- UI: 「ログ」ボタン、状態の色分け、Failed 行に reason/exitCode/message 併記、
  Running 以外は「開く」非表示
- session-entrypoint.sh: URL スキームと identity 型の不一致を警告。
  git clone を --progress ... 2>&1 にして git/ssh の出力を Pod ログへ
- helm lint / template 検証済み
This commit is contained in:
2026-09-08 21:14:56 +09:00
parent 6ec4378047
commit 1b74e230ad
10 changed files with 184 additions and 16 deletions
+38
View File
@@ -0,0 +1,38 @@
# CHANGELOG 2.1.263-d — 手動リリース
## 背景
セッション Pod がブート失敗(`git clone` エラー等)で `Failed` になると、reaper が
即座に削除するため `kubectl logs` で死因を確認できなかった。「開く」で 502 になるだけで
原因が分からない状態だった。
## 追加 / 変更
- **`session.reaper.terminatedRetentionSeconds`(既定 900)**
終了済み(Succeeded / Failed)のセッション Pod を、この秒数が経過するまで回収しない。
Pod の `containerStatuses[].state.terminated.finishedAt` を基準に判定。`0` で旧挙動(即回収)。
manager の回収ループと予備 CronJob の両方が尊重する。
- **`GET /api/sessions/<id>/log`**
セッション Pod(`claude` コンテナ)の直近ログを text/plain で返す。manager は既に
`pods/log` の `get` 権限を持つ(追加権限なし)。
- **Web UI**
- セッション一覧に **「ログ」ボタン**(インラインでログ表示)。
- 状態を色分け表示。`Failed` の行に `reason` / `exit <code>` / `message` を併記。
- `Running` 以外では「開く」を出さない。
- **セッションブートスクリプト(`files/session-entrypoint.sh`)**
- URL のスキーム(`https://` / `git@` / `ssh://`)と選択された identity の型
(`ssh` / `https-token`)の不一致を検出して警告。
- `git clone` を `--progress ... 2>&1` で実行し、git / ssh の出力をそのまま Pod ログへ。
失敗時は代表的な原因(認証不足・権限なし・known_hosts 不一致・NetworkPolicy による
egress 遮断)をメッセージで提示。
## トラブルシューティング追記(README)
- 「開く」で 502 / 一覧が `Failed` → UI の「ログ」ボタンで死因確認。
- clone が 60〜130 秒でタイムアウト → NetworkPolicy(Cilium 等)の egress 遮断を疑い、
`--set networkPolicy.enabled=false` で切り分け。
- URL スキームと identity 型を一致させる(HTTPS ↔ `https-token` / SSH ↔ `ssh`)。
## バージョン
`version` = `2.1.263-d` / `appVersion` = `"2.1.263"`。