From 50b49310994adf3798d35351e531c27518ef1551 Mon Sep 17 00:00:00 2001 From: Ruk Doe Date: Sat, 17 Oct 2026 15:42:10 +0900 Subject: [PATCH] =?UTF-8?q?tools:=20=E3=82=AF=E3=83=A9=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=81=B8=E3=81=AE=E8=A1=8C=E3=81=8D=E5=85=88=E3=82=92=E4=BD=9C?= =?UTF-8?q?=E6=A5=AD=E7=94=A8=20PC=20=E3=81=AE=20LAN=20=E5=81=B4=E3=81=AE?= =?UTF-8?q?=E5=8F=A3=2010.10.0.4=20=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) Claude-Session: https://claude.ai/code/session_017wBP4MK6j3oBwqbn95wZ8H --- tools/README.md | 4 +++- tools/creds.sh | 17 +++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/tools/README.md b/tools/README.md index 730477e..e680012 100644 --- a/tools/README.md +++ b/tools/README.md @@ -66,7 +66,9 @@ tools/t.ps1 # 引数なしならシェルに入る - **talosconfig は保存しない**([../docs/decisions.md](../docs/decisions.md)「手で持つもの」)。`secrets.yaml` から毎回作る - 管理者の kubeconfig だけはファイルで持つ。Talos が出す正式なもの(`talosctl kubeconfig`)を使い、証明書は 1 年で切れる。 中身は `secrets.yaml` の CA で作れるものなので、置いても開けられる範囲は今と変わらない -- 行き先はどれも `10.0.0.2`(`talos/render.sh` と同じ)。`KUBECONFIG` / `TALOSCONFIG` や `--kubeconfig` / `--talosconfig` / +- 行き先はどれも `10.10.0.4`(ノードの、作業用 PC の LAN 側の口。`creds.sh` の `ep`)。`talos/render.sh` の `10.0.0.2` は + クラスタの LAN で手元から届かず、NetBird はクラスタの上で動くので落ちたときに使えない。API は外に開かない。 + 外からは mado で作業用 PC に入って打つ。`10.10.0.4` は Talos の証明書の SAN に入っている。`KUBECONFIG` / `TALOSCONFIG` や `--kubeconfig` / `--talosconfig` / `--server` を自分で渡したときは何もしない。繋がないもの(`kubectl kustomize`、`helm template`、`talosctl gen`、`--client` など)も同じ **管理者の kubeconfig の入れ方**(作り直すときも同じ。切れる前に): diff --git a/tools/creds.sh b/tools/creds.sh index 77c2d26..f7abcab 100755 --- a/tools/creds.sh +++ b/tools/creds.sh @@ -84,14 +84,17 @@ mint() { [ $rc = 0 ] || { rm -f "$3".*; die "証明書を作れなかった(talos/secrets.yaml を age の鍵で開けるか)"; } } -# 名前と行き先は talos/render.sh の gen config と同じ(doany、https://10.0.0.2:6443) +# 名前は talos/render.sh の gen config と同じ(doany)。行き先は作業用 PC の LAN にいるノードの口 10.10.0.4。 +# render.sh の 10.0.0.2 はクラスタの LAN で、手元からは届かない。NetBird はクラスタの上で動くので、 +# クラスタが落ちたときに使えない。10.10.0.4 は Talos の証明書(apid・kube-apiserver)の SAN に入っている +ep=10.10.0.4 if [ "$tool" = talosctl ]; then out=$shm/talosconfig-$role if [ ! -s "$out" ]; then if [ $role = admin ]; then os=os:admin; else os=os:reader; fi mint os "/O=$os" "$out.c.$$" ed25519 - (umask 077 && printf 'context: doany\ncontexts:\n doany:\n endpoints: [10.0.0.2]\n nodes: [10.0.0.2]\n ca: %s\n crt: %s\n key: %s\n' \ - "$(cat "$out.c.$$.ca")" "$(cat "$out.c.$$.crt")" "$(cat "$out.c.$$.key")" >"$out.$$" && mv "$out.$$" "$out") + (umask 077 && printf 'context: doany\ncontexts:\n doany:\n endpoints: [%s]\n nodes: [%s]\n ca: %s\n crt: %s\n key: %s\n' \ + "$ep" "$ep" "$(cat "$out.c.$$.ca")" "$(cat "$out.c.$$.crt")" "$(cat "$out.c.$$.key")" >"$out.$$" && mv "$out.$$" "$out") rm -f "$out.c.$$".* fi export TALOSCONFIG="$out" @@ -103,15 +106,17 @@ if [ ! -s "$out" ] && [ $role = readonly ]; then # 読み取り用は bootstrap/apiserver/rbac.yaml の entra:viewer(組み込みの view + readonly-extra。Secret は読めない)。 # Headlamp で Entra の viewer が持つ権限と同じにするため、同じグループ名を使う mint k8s "/O=entra:viewer/CN=tools-readonly" "$out.c.$$" ec - (umask 077 && printf 'apiVersion: v1\nkind: Config\nclusters:\n- name: doany\n cluster:\n server: https://10.0.0.2:6443\n certificate-authority-data: %s\ncontexts:\n- name: readonly@doany\n context:\n cluster: doany\n user: readonly\ncurrent-context: readonly@doany\nusers:\n- name: readonly\n user:\n client-certificate-data: %s\n client-key-data: %s\n' \ - "$(cat "$out.c.$$.ca")" "$(cat "$out.c.$$.crt")" "$(cat "$out.c.$$.key")" >"$out.$$" && mv "$out.$$" "$out") + (umask 077 && printf 'apiVersion: v1\nkind: Config\nclusters:\n- name: doany\n cluster:\n server: https://%s:6443\n certificate-authority-data: %s\ncontexts:\n- name: readonly@doany\n context:\n cluster: doany\n user: readonly\ncurrent-context: readonly@doany\nusers:\n- name: readonly\n user:\n client-certificate-data: %s\n client-key-data: %s\n' \ + "$ep" "$(cat "$out.c.$$.ca")" "$(cat "$out.c.$$.crt")" "$(cat "$out.c.$$.key")" >"$out.$$" && mv "$out.$$" "$out") rm -f "$out.c.$$".* elif [ ! -s "$out" ]; then f=talos/kubeconfig.yaml [ -f $f ] || die "$f が無い。作り方は tools/README.md「クラスタの資格情報」" grep -q '^sops:' $f || die "$f が暗号化されていない。git に入れる前に tools/README.md の手順で暗号化する" nokey - (umask 077 && sops -d $f >"$out.$$" && mv "$out.$$" "$out") || { rm -f "$out.$$"; die "$f を復号できなかった"; } + # talosctl kubeconfig が書く行き先は 10.0.0.2(クラスタの endpoint)なので、手元から届く口に替える + (umask 077 && sops -d $f >"$out.$$" && sed -i "s#^\( *server:\) https://.*#\1 https://$ep:6443#" "$out.$$" && mv "$out.$$" "$out") || + { rm -f "$out.$$"; die "$f を復号できなかった"; } fi export KUBECONFIG="$out" exec "$real" "$@"