Repository navigation
kubectl / talosctl の資格情報を tools/t.ps1 のコンテナで用意する - #403
Conversation
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 finished @5ym's task in 42s —— View job レビュー結果
設計(平文をディスクに残さず tmpfs だけに置く、読み取り用は既存の 指摘
要確認
テスト自動テストはありません。PR 本文にある手動確認( |
| ( | ||
| 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 "証明書を作れなかった"; } |
There was a problem hiding this comment.
不具合(確度高): ( … ) || { …; 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" ] を確認するのが一番簡単です。
| # 最初の引数らしいもの(フラグを飛ばす)。`kubectl -n x get` だと x を拾うが、そのときは「繋ぐ」側に倒れるだけ | ||
| sub= | ||
| for a in "$@"; do case $a in -*) ;; *) sub=$a; break ;; esac; done |
There was a problem hiding this comment.
不具合: コメントの「別の語を拾っても繋ぐ側に倒れるだけ」は 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 finished @5ym's task in 24s —— View job レビュー結果(最新コミット 5885360 を含む)前回の指摘 2 点は直っています。大きな問題は見つかりませんでした。
軽微(要確認、直さなくてもよい)
テスト自動テストはありません。PR 本文の手動確認は妥当です。今回の修正に対しては、 |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017wBP4MK6j3oBwqbn95wZ8H
|
Claude finished @5ym's task in 23s —— View job レビュー結果(最新コミット 12f9d5d まで)問題は見つかりませんでした。前回までの指摘はすべて解消しています。
軽微(要確認、直さなくてもよい)
テスト自動テストはありません。PR 本文の手動確認は妥当です。次の 2 つの失敗経路は、一度手で確かめてください。
どちらも「証明書を作れなかった」で止まり、 |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017wBP4MK6j3oBwqbn95wZ8H
|
Claude finished @5ym's task in 16s —— View job レビュー結果(最新コミット 977099a まで)問題は見つかりませんでした。
軽微(要確認、直さなくてもよい)
テスト自動テストはありません。PR 本文の手動確認は妥当です。次の 2 つの失敗経路は、まだ手で確かめていなければ一度確認してください。
どちらも「証明書を作れなかった」で止まり、 |
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
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
* 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>
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 …)talos/secrets.yamlの Kubernetes の CA でentra:viewerの証明書をその場で作る(1 日)talos/kubeconfig.yamlを復号os:readerの証明書をその場で作る(1 日)os:adminbootstrap/apiserver/rbac.yamlにあるentra:viewerのバインディング(view + readonly-extra。Secret は読めない)をそのまま使う。新しいマニフェストは足していない--client・kustomize・helm template・talosctl genなど繋がないものや、--kubeconfigなどを自分で渡したときは素通し(tools.yml の CI もこれ)talos/kubeconfig.yamlが無い・暗号化されていない・age 鍵が無いときは、それぞれ分かるメッセージで止まる.sops.yamlにtalos/kubeconfig.yamlの規則、.gitignoreに平文のkubeconfig/talosconfig管理者の kubeconfig の入れ方(マージ後に手で)
確かめたこと(クラスタには繋いでいない)
--clientなどの素通し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