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
22 changes: 8 additions & 14 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,28 +34,22 @@ git から建て直して restic から戻し、全部のアプリが動いて

## Phase 3 — Talos 定常運用

- [ ] **etcd の日次スナップショットが R2 に入ることを見る。** [apps/k8up/etcd-snapshot.yaml](apps/k8up/etcd-snapshot.yaml) を
置いた(2026-10-17)。マージされたら 1 回手で回す(`kubectl -n k8up create job --from=cronjob/etcd-snapshot etcd-snapshot-first`)。
Talos API への権限は **`os:etcd:backup` だけ**を k8up の namespace に渡している(`talos/patches/etcd-backup.yaml`)
- [ ] **前のホストのスナップショット(`host=main`)をどうするか決める。** 保持を回していたのはホストのスクリプト自身だったので、
**もう誰も forget しない**(k8up の prune は自分の namespace のホストにしか届かない)。移行前の最後の退避でもあるので、
要らないと決めたら `restic forget` する(やり方は [apps/k8up/README.md](apps/k8up/README.md)「やめたアプリの残り」)。
通知は 8 日の学習窓が閉じる 2026-10-25 ごろに鳴りやむ
- [ ] **R2 の容量をもう一度見る**(`host=main` を消したあと)。数字は `pulumi` ワークフローの週次の Summary に出る。
ホストのスクリプトが PV の置き場を丸ごと取っていたので、k8up の per-PVC の保持設計
([apps/k8up/denpa-encoded-forget.yaml](apps/k8up/denpa-encoded-forget.yaml) を含む)は、あちらが消えて初めて効く
([docs/decisions.md](docs/decisions.md)「バックアップに何を含めるか」)
- [ ] **R2 の容量が下がり切るのを見る。** `host=main` を消した直後の restic の実データは **5.60 GiB**(圧縮前 8.52 GiB、
480 スナップショット。2026-10-17)。denpa の録画の forget([apps/k8up/denpa-encoded-forget.yaml](apps/k8up/denpa-encoded-forget.yaml))は
ホストのスナップショットが同じ中身を抱えていたので効いていなかった。日曜の prune のあと、`pulumi` ワークフローの週次の Summary で見る
- [ ] **復元のリハーサルを四半期ごとに。** ノードにシェルが無いので、前のように本番の上の QEMU では回せない。
回す場所(手元の PC の VM か、Z440 に移す前の空き)を決める。手順は [recovery/README.md](recovery/README.md) そのもの
- [ ] **Talos 1.15.0 の正式版が出たら乗り換える**(Renovate の PR)。PT3 のモジュールの読み順を守る上流の修正(PR 中)が入ったら
[apps/pt3/rebind.yaml](apps/pt3/rebind.yaml) を外せるか見る
- [ ] `bootstrap/argocd/helmchart.yaml`(SOPS)のコメントが消した `docs/restore-drill.md` を指している。次に `sops edit` するときに直す
- [ ] **Talos 1.15.0 の正式版が出たら乗り換える**(Renovate の PR)。PT3 のモジュールの読み順を守る上流の修正
([siderolabs/talos#14652](https://github.com/siderolabs/talos/pull/14652))が入ったら、[apps/pt3/rebind.yaml](apps/pt3/rebind.yaml) を外して
`talos/patches/main.yaml` の並び順だけにする。入ったら dvb-pt3 の extension の README も直す(上流)

## 済んだこと(記録)

1 行ずつ。詳しいことはリンク先にある。

- **Talos へ移した(2026-10-17)。** git から建て直し、PV を restic から戻した。踏んだ穴は直した場所と [recovery/README.md](recovery/README.md) に
- **後片付け(2026-10-17)。** Ubuntu 期のホストのスナップショット(`host=main` 10 本)を forget + prune。etcd の日次スナップショットを
R2 へ([apps/k8up/etcd-snapshot.yaml](apps/k8up/etcd-snapshot.yaml)、最初の 1 本 `dacc947b` を手で回して確認)
- **バックアップを restic + k8up に(2026-09-06〜09-08)。** R2 の `doany-restic` へ日次、論理バックアップと PVC の注釈、失敗通知、`restic check`([apps/k8up/README.md](apps/k8up/README.md))。R2 のずれ検知(2026-10-05)
- **Cilium + Gateway API に(2026-09-06〜07)。** **Talos で後から替えるのが高いのは CNI だけ**なので先に。decisions.md「ルーティングの選定」
- **Talos の検証(2026-09-06〜10-17)。** QEMU で 7 回([docs/talos.md](docs/talos.md)「VM ブートドリル」)
Expand Down
10 changes: 10 additions & 0 deletions apps/k8up/etcd-snapshot.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,13 @@ spec:
template:
spec:
restartPolicy: Never
# 2 つのコンテナを同じユーザーで動かす。talosctl のイメージは root で走り、スナップショットを
# 0600 で書くので、k8up のイメージ(65532)の restic が `permission denied` で読めなかった
# (最初の 1 回、2026-10-17)。
securityContext:
runAsUser: 65532
runAsGroup: 65532
runAsNonRoot: true
initContainers:
# talosctl だけのイメージ(シェルが無い)なので、取るだけを init に分ける。
# 版は talos/versions.yaml と揃える(クライアントとノードの版は離れすぎないこと)。
Expand Down Expand Up @@ -71,6 +78,9 @@ spec:
restic backup --host etcd --tag etcd etcd.snapshot
restic forget --host etcd --tag etcd --keep-daily 7 --keep-weekly 4
env:
# HOME が / のままなので、既定の ~/.cache には 65532 で書けない
- name: RESTIC_CACHE_DIR
value: /work/.cache
- name: ENDPOINT
valueFrom: {secretKeyRef: {name: k8up-global, key: endpoint}}
- name: BUCKET
Expand Down
2 changes: 1 addition & 1 deletion bootstrap/argocd/helmchart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ spec:
# Secret は ArgoCD の管理対象から外す。git に平文 Secret は置かない方針なので ArgoCD が Secret を
# 作ることは無く、一方で Infisical operator が作る Secret には CR からコピーされた tracking-id が
# 付くため、ArgoCD が「git に無い管理対象」と見なして sync 時に prune してしまう
# (復元リハーサル 2026-09-06、docs/restore-drill.md の 3)。
# (2026-09-06 の復元リハーサルで踏んだ)。
resource.exclusions: |
- apiGroups: [""]
kinds: ["Secret"]
Expand Down
Loading