Skip to content

kubectl / talosctl の資格情報を tools/t.ps1 のコンテナで用意する - #403

Merged
5ym merged 4 commits into
mainfrom
kubeconfig-sops
Oct 17, 2026
Merged

5ym merged 4 commits into
mainfrom
kubeconfig-sops

Conversation

@5ym

@5ym 5ym commented Oct 17, 2026

Copy link
Copy Markdown
Collaborator

Talos に移って ssh で入るノードが無くなったので、手元の tools/t.ps1 から kubectl / talosctl / helm で直接繋げるようにする。

仕組み

tools/creds.sh が kubectl・talosctl・helm の名前で呼ばれ(本物は /usr/local/libexec/gitops/)、クラスタに繋ぐときだけ資格情報をコンテナの /dev/shm(tmpfs)に用意して KUBECONFIG / TALOSCONFIG で渡す。平文は手元のディスクにも .home/ にも残らない。

読み取り用(既定) 管理者(tools/t.ps1 --admin …)
kubectl / helm talos/secrets.yaml の Kubernetes の CA で entra:viewer の証明書をその場で作る(1 日) SOPS 済みの talos/kubeconfig.yaml を復号
talosctl Talos の CA で os:reader の証明書をその場で作る(1 日) 同じく os:admin
  • 読み取り用の権限は bootstrap/apiserver/rbac.yaml にある entra:viewer のバインディング(view + readonly-extra。Secret は読めない)をそのまま使う。新しいマニフェストは足していない
  • talosconfig は今までどおり保存しない(docs/decisions.md)
  • --client・kustomize・helm template・talosctl gen など繋がないものや、--kubeconfig などを自分で渡したときは素通し(tools.yml の CI もこれ)
  • talos/kubeconfig.yaml が無い・暗号化されていない・age 鍵が無いときは、それぞれ分かるメッセージで止まる
  • .sops.yaml に talos/kubeconfig.yaml の規則、.gitignore に平文の kubeconfig / talosconfig

管理者の kubeconfig の入れ方(マージ後に手で)

tools/t.ps1 --admin sh -c 'talosctl kubeconfig /dev/shm/k && sops -e --filename-override talos/kubeconfig.yaml /dev/shm/k > talos/kubeconfig.yaml'
tools/t.ps1 --admin kubectl get nodes
git add talos/kubeconfig.yaml

確かめたこと(クラスタには繋いでいない)

  • wslc でイメージを作り、ファイルや age 鍵が無いときのメッセージ、--client などの素通し
  • コンテナの中で使い捨ての age 鍵と talosctl gen secrets を使い、talosconfig(talosctl config info で os:reader / os:admin、23 時間)と読み取り用 kubeconfig(openssl verify が CA で通る、O=entra:viewer、clientAuth)ができること。sops -e --filename-override talos/kubeconfig.yaml が .sops.yaml の規則に当たること、平文の talos/kubeconfig.yaml で止まること
  • t.ps1 を Windows PowerShell 5.1 で構文解析・実行(--admin がコンテナに GITOPS_ADMIN=1 で届く、パイプも従来どおり)

🤖 Generated with Claude Code

https://claude.ai/code/session_017wBP4MK6j3oBwqbn95wZ8H

Talos に移って ssh で入るノードが無くなったので、手元の tools/t.ps1 から直接繋ぐ。
平文はコンテナの /dev/shm にだけ置き、手元のディスクにも .home にも残さない。

- 既定は読み取り用。kubectl / helm は talos/secrets.yaml の Kubernetes の CA で
  entra:viewer の証明書を、talosctl は Talos の CA で os:reader の証明書をその場で作る(1 日で切れる)
- 管理者は tools/t.ps1 --admin のときだけ。kubectl は SOPS で暗号化した talos/kubeconfig.yaml を復号し、
  talosctl は os:admin の証明書を作る。talosconfig は今までどおり保存しない
- .sops.yaml に talos/kubeconfig.yaml の規則、.gitignore に平文の kubeconfig / talosconfig
- tools/README.md に仕組みと管理者の kubeconfig の入れ方

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017wBP4MK6j3oBwqbn95wZ8H
@claude

claude Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 42s —— View job


レビュー結果

  • 差分の確認(creds.sh / Dockerfile / t.ps1 / .sops.yaml / .gitignore)
  • 不具合・セキュリティ・設計・テストの観点で確認

設計(平文をディスクに残さず tmpfs だけに置く、読み取り用は既存の entra:viewer を流用、--admin で明示的に切り替える)は良いと思います。Dockerfile、.sops.yaml、.gitignore、t.ps1 の --admin 処理に問題は見つかりませんでした。指摘は tools/creds.sh の 2 点で、どちらもインラインコメントに書きました。

指摘

  1. mint の失敗が検知されない(tools/creds.sh 55–72 行): ( … ) || … の左辺ではサブシェル内の set -e が効きません。sops -d や openssl が失敗しても「証明書を作れなかった」にならず、空の証明書入りの kubeconfig / talosconfig が書かれます。最後に出力ファイルが空でないことを確認すると簡単に直せます。
  2. helm の素通し判定が逆に倒れる(同 18–20 行 / 36 行): helm -n ns upgrade … では -n の値 ns がサブコマンドとして拾われ、資格情報なしで素通しになります。kubectl / talosctl は「繋ぐ側」に倒れるので問題ありません。

要確認

  • 読み取り用の entra:viewer は Secret を読めません。helm はリリース情報を Secret に持つので、既定(読み取り用)の helm list/status/history/get は権限エラーになる可能性があります。意図どおりなら README に「helm は --admin が必要」と書いておくと親切です。
  • -h や --client を引数のどこにあっても素通しにしています。kubectl exec pod -- cmd -h のような -- 以降の引数でも素通しになり、資格情報なしで実行されます。実害は小さいですが、意図どおりか確認してください。

テスト

自動テストはありません。PR 本文にある手動確認(openssl verify、talosctl config info など)は妥当です。上の 1 は「secrets.yaml が暗号化されていない」「age 鍵が違う」場合の手動確認でも見つけられるはずなので、その経路も確認してください。

Comment thread tools/creds.sh Outdated
Comment on lines +55 to +72
(
umask 077
for k in crt key; do
sops -d --extract "[\"certs\"][\"$1\"][\"$k\"]" talos/secrets.yaml | base64 -d >"$w/ca.$k"
done
# Talos は ed25519 の鍵に独自の見出しを付けている。中身は PKCS#8 なので見出しだけ直せば openssl が読める
sed -i 's/ED25519 PRIVATE KEY/PRIVATE KEY/' "$w/ca.key"
case $4 in
ed25519) openssl genpkey -algorithm ed25519 -out "$w/c.key" ;;
*) openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out "$w/c.key" ;;
esac
printf 'keyUsage=critical,digitalSignature\nextendedKeyUsage=clientAuth\n' >"$w/ext"
openssl req -new -key "$w/c.key" -subj "$2" 2>/dev/null |
openssl x509 -req -CA "$w/ca.crt" -CAkey "$w/ca.key" -extfile "$w/ext" \
-not_before "$(date -u -d '-5 min' +%Y%m%d%H%M%SZ)" -days 1 -out "$w/c.crt" 2>/dev/null
for k in crt key; do base64 -w0 "$w/c.$k" >"$3.$k"; done
base64 -w0 "$w/ca.crt" >"$3.ca"
) || { rm -rf "$w"; die "証明書を作れなかった"; }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不具合(確度高): ( … ) || { …; die } の左辺では、サブシェルの中の set -e が無効になります(|| の左側は errexit が効かない、という POSIX の仕様)。そのため途中で失敗しても止まりません。

例: sops -d が失敗(鍵が違う・secrets.yaml が暗号化されていない等)しても、sops … | base64 -d のパイプは base64 -d の終了コード(0)になり、ca.crt は空のまま進みます。openssl x509 が落ちても c.crt が無いまま base64 -w0 のループに入り、最後の base64 -w0 "$w/ca.crt" >"$3.ca" が成功するのでサブシェルは 0 で終わります。結果「証明書を作れなかった」が出ず、空の証明書を埋めた kubeconfig / talosconfig が書かれ、後段で分かりにくい TLS エラーになります。

直し方の案: サブシェルの先頭で set -e し直しても || の中では効かないので、サブシェルを関数にせず mint 本体で && 連結にするか、各コマンドに || exit 1 を付ける。パイプは set -o pipefail(dash では不可)の代わりに一度ファイルへ出してから base64 -d する、など。最後に [ -s "$3.crt" ] && [ -s "$3.key" ] && [ -s "$3.ca" ] を確認するのが一番簡単です。

Comment thread tools/creds.sh Outdated
Comment on lines +18 to +20
# 最初の引数らしいもの(フラグを飛ばす)。`kubectl -n x get` だと x を拾うが、そのときは「繋ぐ」側に倒れるだけ
sub=
for a in "$@"; do case $a in -*) ;; *) sub=$a; break ;; esac; done

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不具合: コメントの「別の語を拾っても繋ぐ側に倒れるだけ」は kubectl / talosctl では成り立ちますが、helm では逆に倒れます(36 行目は一覧に無い語は pass)。helm -n monitoring upgrade … や helm --namespace x install … だと sub は monitoring / x になり、資格情報なしで素通し → localhost:8080 に繋ごうとして失敗します。値を取るフラグ(-n/--namespace/--kube-context 等)を飛ばすか、helm は「繋がないと分かっているもの(template, repo, pull, lint, package, show, dependency, version …)以外は繋ぐ」に反転させると安全です。

レビューの指摘。`( … ) || …` の中では set -e が効かず、sops や openssl が落ちても
空の証明書で設定を書いていた。終了コードを受けて見る形にし、パイプはファイル経由にした。
helm は `helm -n x upgrade` で x を拾って素通しになっていたので、判定を逆にした。
`--` より後ろの -h などは見ない。helm の list / status は Secret が要るので --admin と README に書いた。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017wBP4MK6j3oBwqbn95wZ8H
@claude

claude Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 24s —— View job


レビュー結果(最新コミット 5885360 を含む)

前回の指摘 2 点は直っています。大きな問題は見つかりませんでした。

  • mint の失敗検知: set +e の下でサブシェルを実行し、終了コードを受けてから見る形になりました。sops -d はパイプにせずファイルへ出しています。最後に .crt / .key / .ca が空でないことも確認していて、creds.sh:54-85 は意図どおり動くはずです。失敗時は $w(CA の鍵が入る)を消して $3.* も消しています。
  • helm の判定: 「繋がないと分かっているもの」以外は繋ぐ側に倒れるので、helm -n ns upgrade は資格情報が付きます(creds.sh:38)。-- 以降を見なくなったので、kubectl exec pod -- cmd -h も素通しになりません。
  • helm の権限: tools/README.md:64 に「helm list なども --admin が必要」と書かれていて、前回の要確認も解消しています。

軽微(要確認、直さなくてもよい)

  • 並行実行での衝突: creds.sh:92 と creds.sh:105 の中間ファイル $out.c.* は PID を含みません。同じコンテナで kubectl … | kubectl … のように 2 つが同時に初回の証明書づくりに入ると、互いの $out.c.* を上書きしたり rm -f で消したりします。その場合は「証明書を作れなかった」で止まるだけで、壊れた kubeconfig は残りません(mv は原子的)。気になるなら $out.c.$$ にしてください。
  • サブコマンド判定の取りこぼし: helm -n template upgrade のように、フラグの値がたまたま「繋がない語」と同じだと素通しします。実際にはまず起きません。

テスト

自動テストはありません。PR 本文の手動確認は妥当です。今回の修正に対しては、secrets.yaml が暗号化されていない場合と age 鍵が違う場合に「証明書を作れなかった」で止まることを、一度手で確かめてください。

@claude

claude Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 23s —— View job


レビュー結果(最新コミット 12f9d5d まで)

問題は見つかりませんでした。前回までの指摘はすべて解消しています。

  • mint の失敗検知: set +e の下でサブシェルを実行し、終了コードを受けてから見ています。復号結果は一度ファイルに出し、最後に .crt / .key / .ca が空でないことも確認しています。失敗時は $w と $3.* を消します(tools/creds.sh:54-85)。
  • helm の判定: 「繋がないと分かっているもの」以外は繋ぐ側に倒れます。-- より後ろは見ないので、kubectl exec pod -- cmd -h も素通しになりません(creds.sh:21,27,38)。
  • 並行実行: 中間ファイルは $out.c.$$ と $out.$$ で PID ごとに分かれています。最終ファイルは mv で原子的に置くので、壊れた kubeconfig は残りません(creds.sh:92-95,105-108)。
  • helm の権限: tools/README.md:64 に「helm list なども --admin が必要」と書かれています。
  • openssl x509 -not_before: OpenSSL 3.4 以降の機能です。ベースイメージは node:26.12.0-trixie-slim で、apt の openssl は 3.5 系のため問題ありません(tools/Dockerfile:11)。
  • Dockerfile / .sops.yaml / .gitignore / t.ps1: 本物を libexec に移して creds.sh を同名で symlink する形、--admin を先頭だけ受ける処理、.sops.yaml の規則に問題はありません。

軽微(要確認、直さなくてもよい)

  • サブコマンド判定の取りこぼし: helm -n template upgrade のように、フラグの値がたまたま「繋がない語」と同じだと素通しします。実際にはまず起きません。
  • 読み取り用は境界ではない: 読み取り用の証明書も --admin も、同じ age 鍵と talos/secrets.yaml から作れます。そのため --admin は誤操作を防ぐためのもので、権限を分けるものではありません。PR 本文と README の書き方はそのように読めますが、意図どおりか確認してください。

テスト

自動テストはありません。PR 本文の手動確認は妥当です。次の 2 つの失敗経路は、一度手で確かめてください。

  • secrets.yaml が暗号化されていないとき
  • age 鍵が違うとき

どちらも「証明書を作れなかった」で止まり、/dev/shm/gitops に w.* や *.c.* が残らないはずです。

@claude

claude Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 16s —— View job


レビュー結果(最新コミット 977099a まで)

問題は見つかりませんでした。tools/creds.sh を全体読み直しましたが、前回までの指摘はすべて解消しています。

  • mint の失敗検知: set +e の下でサブシェルを実行し、終了コードを受けてから見ています。復号結果は一度ファイルに出し、最後に .crt / .key / .ca が空でないことも確認しています(creds.sh:57-84)。失敗時は $w と $3.* を消します。
  • helm の判定: 「繋がないと分かっているもの」以外は繋ぐ側に倒れます(creds.sh:38)。-- より後ろは見ないので、kubectl exec pod -- cmd -h も素通しになりません(creds.sh:21,27)。
  • 並行実行: 中間ファイルは $out.c.$$ と $out.$$ で PID ごとに分かれ、最終ファイルは mv で原子的に置きます(creds.sh:92-95,105-108)。
  • --admin の位置づけ: tools/README.md に誤操作よけで権限の境界ではないと書かれています。

軽微(要確認、直さなくてもよい)

  • 証明書の鍵が残る場合: creds.sh:93-94 と 106-107 の printf … && mv が失敗すると、set -e でそのまま終了し、$out.c.$$.*(1 日で切れるクライアント鍵)が /dev/shm に残ります。CA の鍵ではなく、tmpfs でコンテナと一緒に消えるので実害は小さいです。
  • サブコマンド判定の取りこぼし: helm -n template upgrade のように、フラグの値がたまたま「繋がない語」と同じだと素通しします。実際にはまず起きません。

テスト

自動テストはありません。PR 本文の手動確認は妥当です。次の 2 つの失敗経路は、まだ手で確かめていなければ一度確認してください。

  • secrets.yaml が暗号化されていないとき
  • age 鍵が違うとき

どちらも「証明書を作れなかった」で止まり、/dev/shm/gitops に w.* や *.c.* が残らないはずです。

@5ym
5ym merged commit 9b83af3 into main Oct 17, 2026
3 checks passed
@5ym
5ym deleted the kubeconfig-sops branch October 17, 2026 06:07
5ym added a commit that referenced this pull request Oct 17, 2026
kubectl / talosctl の資格情報と行き先(10.10.0.4)は t.ps1 が用意するようになったので、
--talosconfig・-n/-e・kubeconfig の取り直しと server の差し替えを手順から外し、
--admin のシェルで打つ形にする。upgrade-k8s は既定でクラスタの endpoint(10.0.0.2)に行くので
--endpoint https://10.10.0.4:6443 を渡す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV
5ym added a commit that referenced this pull request Oct 17, 2026
kubectl / talosctl の資格情報と行き先(10.10.0.4)は t.ps1 が用意するようになったので、
--talosconfig・-n/-e・kubeconfig の取り直しと server の差し替えを手順から外し、
--admin のシェルで打つ形にする。upgrade-k8s は既定でクラスタの endpoint(10.0.0.2)に行くので
--endpoint https://10.10.0.4:6443 を渡す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV
5ym added a commit that referenced this pull request Oct 17, 2026
* bootstrap/ を Talos だけの形にする: CA を 1 枚に、Talos の上書きを正本に畳む、Namespace を先に当てる

- bootstrap/apiserver/ca.crt から k3s の CA を消す。残る 1 枚は talos/clusterconfig の kubeconfig の
  certificate-authority-data と同じもの(SHA-256 A5:76:EF:…:39:D0 で突き合わせた)
- talos/cilium-values.yaml と talos/cert-manager-values.yaml を bootstrap/ の values.yaml に畳む。
  重ねる相手の k3s が無くなったので 2 枚に分ける意味が無い。CI と同じダミーの秘密で render.sh を
  前後で回し、鍵・証明書と毎回変わる値を除いて生成物が同じことを確かめた
- cilium-drift から k3s の分岐を消す
- bootstrap-apply は Namespace を先に当てる。まっさらなクラスタでは中身と同じ apply に渡すと
  `namespaces "auth" not found` で落ちた(2026-10-17)
- talos-validate を bootstrap/cilium・cert-manager の変更でも走らせる(render.sh が読む)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* etcd の日次スナップショットを有効にする: talos/after-migration/ から apps/k8up/ へ

k3s には talos.dev/v1alpha1 の CRD が無いので寄せてあったもの。Talos に移ったので置く。
時刻は 13:45 UTC から 13:00 UTC にずらす(13:30 に matrix の Schedule が入っていて、forget の
ロックとぶつかる)。talos/patches/etcd-backup.yaml の参照も直す。

マージされたら 1 回手で回して R2 に入ることを見る:
  kubectl -n k8up create job --from=cronjob/etcd-snapshot etcd-snapshot-first

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* k3s / Ubuntu 期のものを消す: ホストのバックアップ・復元スクリプト・drift.sh とコメント

SSD は Talos で上書き済みで、戻る先のホストはもう無い。

- 消す: backup/(k3s-backup と systemd unit)、recovery/restore.sh、talos/drift.sh(Ubuntu の
  ホストと比べる道具)、docs/restore-drill.md(k3s ホストを QEMU で戻すドリル)、
  bootstrap/apiserver/authentication-config.yaml(k3s の /etc/rancher/k3s/ に置いていた写し。
  正本は talos/patches/apiserver.yaml で、理由のコメントはあちらへ移した。YAML の値は変えていない)
- notify.yaml から、ホストのスクリプトの複数経路のスナップショットを見分けるコードを消す
  (k8up も etcd も経路は 1 つなので使われない)
- apps/・talos/・bootstrap/ のコメントから「k3s 期は…」「Ubuntu 期は…」を外し、
  今も効いている理由だけ残す。talos/patches/*.yaml はコメントだけで、値は変えていない
  (CI と同じダミーの秘密で render.sh が通ることを確かめた)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* 建て直しの手順を Talos → Talos に書き直す: recovery/README.md を入口にし、migration-day.md を畳む

2026-10-17 に実機で通した順をそのまま手順にした。migration-day.md(1 回きりの移行の手順)のうち
今も効くもの(ISO の起動、apply-config の前に見るもの、Argo CD の待ち方、疎通確認の表、
詰まったときに見るところ)はここへ移して消す。

踏んだもの(理由は手順の横と道具の中に書いた):
- J:COM 側の PC からは 10.10.0.4(eno4)にしか届かない。kubeconfig の server を差し替える
- render.sh は出力先を丸ごと消す。kubeconfig は ~/.kube/config に取り直す
- USB は STATE / EPHEMERAL / u-local-path が ready になってから抜く
- bootstrap apply の nodePort は Gateway の Service ができてからでないと当たらない(もう 1 回流す)
- k8up の資格情報が Infisical から来るので、Infisical だけは手元の restic で直接戻す
  (recovery/infisical.sh)。DROP SCHEMA public は max_locks_per_transaction が足りず落ちるので
  old_public に退けて流し、あとで分けて消す
- DB を戻すと Infisical の Kubernetes auth の CA が古いクラスタのものに戻る。PATCH して operator を
  蹴り直す(recovery/infisical.sh ca / infisical-ca.mjs)
- k8up の Restore は root で、数字だけの ID は引用符で。バイナリは kubectl exec -i の標準入力で
  流さない(SQLite の末尾が欠けた)。Argo CD の selfHeal が replicas を戻すので application-controller
  を止めてから。Forgejo を先に。matrix は --restore-backup で 1 回起こす(recovery/pv.sh)

pv.sh と infisical.sh は当日使った道具から namespace とスナップショット ID の決め打ちを外したもの。
引数にした形ではまだ流していない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* 文書を Talos だけの形に圧縮する: 済んだ移行の段取りと k3s 期の比較を落とし、理由だけ残す

- ROADMAP: 済んだ Phase 2 を 1 行の記録にし、残りを Phase 2.5(Z440)と Phase 3 に。
  前のホストのスナップショット(host=main)はもう誰も forget しないことを Phase 3 に足した
- talos/README.md: 入れ方は recovery/ へ寄せ、組み立てと当て直しだけに。描くたびに変わる値
  (Hubble の CA と証明書、infisical の postgres-password)が差分に出ても害が無いことを当て直しの横に書いた
- docs/talos.md: メディアの作り方(移行当日の手順への参照)と、Ubuntu のホストの上で QEMU を回す
  手順を落とす。モジュールが名前の順に読まれる件を作法の表に足した
- docs/decisions.md: k3s 期と Talos 期の比較表、HelmChart CRD から Application への移し方、
  Traefik の切り替えの段取りを落とし、今の形を縛っている理由だけ残す
- bootstrap/README.md・apps/k8up/README.md・router.md・cloudflare-tokens.md・tools/README.md・
  README.md・z440-migration.md から k3s / Ubuntu の手順と /etc/k3s-backup/env を外す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* AdGuard の使われていない PVC adguardhome-ssl を消す

DoT の証明書は cert-manager の Secret(adguard-dot-tls)を同じ名前のボリューム adguardhome-ssl で
マウントしていて、同名の PVC はどの Pod も使っていない(Traefik の acme-watcher が書き出していた頃の残り)。
local-path は使う Pod が付くまで bind しないので、建て直しのあとは Pending のままで、
2026-10-17 の Restore で初めて bind した。中身は古い証明書だけ。

Argo CD の prune で PVC と PV(Delete)が消える。restic の /data/adguardhome-ssl は残る
(通知はスナップショットが途切れてから 8 日鳴る)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* 建て直しの手順を tools/creds.sh(#403・#405)に合わせる

kubectl / talosctl の資格情報と行き先(10.10.0.4)は t.ps1 が用意するようになったので、
--talosconfig・-n/-e・kubeconfig の取り直しと server の差し替えを手順から外し、
--admin のシェルで打つ形にする。upgrade-k8s は既定でクラスタの endpoint(10.0.0.2)に行くので
--endpoint https://10.10.0.4:6443 を渡す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* 建て直し: talos/kubeconfig.yaml が無いときに作る場所を 4 に書く

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* 建て直し: 管理者の kubeconfig もその場で作る形(#407)に合わせる

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* recovery: 流し直しに耐えるようにする(レビューの指摘)

- pv.sh stop は控えがあれば書き直さない(2 回目で「元は 0」を控えてしまう)。start は控えを使ったら消す
- pv.sh pgload は psql が落ちたらダンプを消さずに残す
- infisical.sh db は old_public が残っていれば止まる、流し込んだあと users が 0 なら Infisical を起こさない
- infisical.sh ca は port-forward が /api/status に答えるまで待つ

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* recovery: 道具がまだ引数の形で流していないことを入口に書く

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* bootstrap-apply: Namespace が見つからなければ止める / pv.sh: 経路が無いときに分かるように言う(レビューの指摘)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* infisical.sh db: ダンプを取れてから public を退ける(レビューの指摘)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

* infisical.sh db: 手元のダンプはどこで落ちても消す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbmWyUB9jcBcYCnNyiGBSV

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant