Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion tools/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 の入れ方**(作り直すときも同じ。切れる前に):
Expand Down
17 changes: 11 additions & 6 deletions tools/creds.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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" "$@"
Loading