Skip to content

tools: クラスタへの行き先を 10.10.0.4 にする - #405

Merged
5ym merged 1 commit into
mainfrom
tools-endpoint-10-10
Oct 17, 2026
Merged

5ym merged 1 commit into
mainfrom
tools-endpoint-10-10

Conversation

@5ym

@5ym 5ym commented Oct 17, 2026

Copy link
Copy Markdown
Collaborator

tools/t.ps1 の kubectl / talosctl / helm が繋ぐ先を 10.0.0.2 から 10.10.0.4 に替える。

  • 10.0.0.2 はクラスタの LAN で、作業用 PC (10.10.0.0/24) からは届かない
  • NetBird はクラスタの上で動くので、クラスタが落ちたとき (いちばん繋ぎたいとき) に使えない
  • ノードは 10.10.0.0/24 にも NIC があり、作業用 PC と wslc のコンテナから 6443・50000 に届く
  • 10.10.0.4 は apid と kube-apiserver の証明書の SAN にもう入っている (openssl s_client で確かめた)。DNS の名前や certSANs の追加は要らない
  • 管理者の kubeconfig (talosctl kubeconfig の出力) は行き先が 10.0.0.2 なので、復号したあとで server: を替える
  • API は外に開かない。外からは mado で作業用 PC に入って打つ

確かめたこと: sh -n、server: の書き換え。worktree には age の鍵が無いので、クラスタへの接続はマージ後に main の checkout で確かめる。

🤖 Generated with Claude Code

https://claude.ai/code/session_017wBP4MK6j3oBwqbn95wZ8H

10.0.0.2 はクラスタの LAN で手元から届かず、NetBird はクラスタの上で動くので落ちたときに使えない。10.10.0.4 は apid と kube-apiserver の証明書の SAN に入っている (openssl で確かめた)。管理者の 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 17s —— View job


レビュー結果

行き先を ep=10.10.0.4 に一本化した変更で、3 か所 (talosconfig、readonly の kubeconfig、admin の kubeconfig の server:) とも漏れなく置き換わっています。printf の引数の順序も、%s の増えた数と合っています。ブロックする問題はありません。

不具合

  • 要確認: creds.sh の $shm/talosconfig-* と kubeconfig は、[ ! -s "$out" ] のときだけ作り直します。$shm が tmpfs でマージ後に再起動かコンテナの作り直しで消えるなら問題ありません。消えずに残るなら、10.0.0.2 向けの古いファイルが使われ続けます。その場合は、古いファイルを消す手順を README に 1 行足してください。
  • 軽微: admin の kubeconfig の行 (creds.sh の末尾付近) で、sed が失敗しても「$f を復号できなかった」と出ます。紛らわしいだけで、動作は正しいです。
    • 動作が正しい理由は、&& の連鎖が失敗すると rm -f で一時ファイルを消して die するからです。
  • sed の s#^\( *server:\) https://.*#…# は、server: の行が 1 つしかない talosctl kubeconfig の出力に対しては問題ありません。-i は GNU sed 前提です (コンテナ内なら問題ありません)。

セキュリティ

  • 問題ありません。API を外に開かず、証明書の SAN も確認済みで、秘密情報の混入もありません。権限も umask 077 のままです。

設計・ドキュメント

  • ep に一本化したのは良いです。
  • tools/README.md の変更行は、1 文が長くなっています。次の 2 点を分けると読みやすくなります。
    • 理由 (届かない、NetBird が使えない)
    • 例外 (KUBECONFIG などを自分で渡したときは何もしない)

テスト

  • このリポジトリにこのスクリプトを検証するテストはなく、PR 本文に書かれた確認 (sh -n と server: の書き換え) が妥当です。接続の確認はマージ後に行う予定とのことで、それで構いません。

@5ym
5ym merged commit dcacccc into main Oct 17, 2026
2 checks passed
@5ym
5ym deleted the tools-endpoint-10-10 branch October 17, 2026 06:43
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