From b727a4d4d27daa46f0051ccc9dc61912bdccae18 Mon Sep 17 00:00:00 2001 From: Ruk Doe Date: Sat, 31 Oct 2026 12:49:35 +0900 Subject: [PATCH] =?UTF-8?q?chore(storage):=20PVC=20=E3=82=92=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E9=87=8F=E3=81=AB=E5=90=88=E3=82=8F=E3=81=9B=E3=81=A6?= =?UTF-8?q?=E7=B8=AE=E3=82=81=E3=80=81=E5=90=88=E8=A8=88=E3=82=92=20thin?= =?UTF-8?q?=20=E3=83=97=E3=83=BC=E3=83=AB=E3=81=AB=E5=8F=8E=E3=82=81?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LVM の thin プール(約 340Gi)では PVC の合計がプールを超えると、残量の 見張りが鳴る前にプールが埋まって全部の書き込みが止まる。録画(denpa)に 回す分を空けるため、使用量に比べて大きすぎる PVC を縮める。 - forgejo-repos 50Gi → 20Gi(使用 2.4 GB) - tuwunel-data 20Gi → 10Gi(使用 46 MB) - clickhouse-data 20Gi → 5Gi(使用 36 MB) - adguardhome-work 30Gi → 10Gi(1 日 10 GB は 53 番の攻撃のぶんで、閉じた) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01T9PbUfqG4pPxus99UeLiJs --- apps/adguardhome/pvc.yaml | 6 ++++-- apps/forgejo/forgejo.yaml | 2 +- apps/matrix/tuwunel.yaml | 2 +- apps/rybbit/clickhouse.yaml | 2 +- bootstrap/lvm-localpv-values.yaml | 7 +++++-- docs/decisions.md | 4 +++- docs/z440-migration.md | 6 +++--- 7 files changed, 18 insertions(+), 11 deletions(-) diff --git a/apps/adguardhome/pvc.yaml b/apps/adguardhome/pvc.yaml index 99b49095..24d3e10d 100644 --- a/apps/adguardhome/pvc.yaml +++ b/apps/adguardhome/pvc.yaml @@ -28,5 +28,7 @@ spec: storageClassName: local-path resources: requests: - # クエリログ(deployment.yaml の querylog.interval)の 2 本ぶん。LVM なのでこれが本当の上限になる - storage: 30Gi + # クエリログ(deployment.yaml の querylog.interval)の 2 本ぶん。LVM なのでこれが本当の上限になる。 + # 1 日 10 GB は外からの 53 番の増幅攻撃のぶんで、network-policy.yaml で閉じてからはふだんの量に戻った。 + # 合計を thin プールに収めるため小さめにしている(bootstrap/lvm-localpv-values.yaml) + storage: 10Gi diff --git a/apps/forgejo/forgejo.yaml b/apps/forgejo/forgejo.yaml index fcb24186..52999293 100644 --- a/apps/forgejo/forgejo.yaml +++ b/apps/forgejo/forgejo.yaml @@ -24,7 +24,7 @@ spec: storageClassName: local-path resources: requests: - storage: 50Gi + storage: 20Gi --- apiVersion: v1 kind: Service diff --git a/apps/matrix/tuwunel.yaml b/apps/matrix/tuwunel.yaml index 4cf00c0f..4e49394f 100644 --- a/apps/matrix/tuwunel.yaml +++ b/apps/matrix/tuwunel.yaml @@ -107,7 +107,7 @@ spec: storageClassName: local-path resources: requests: - storage: 20Gi + storage: 10Gi --- apiVersion: apps/v1 kind: StatefulSet diff --git a/apps/rybbit/clickhouse.yaml b/apps/rybbit/clickhouse.yaml index 38b8095c..6cd8e586 100644 --- a/apps/rybbit/clickhouse.yaml +++ b/apps/rybbit/clickhouse.yaml @@ -31,7 +31,7 @@ spec: storageClassName: local-path resources: requests: - storage: 20Gi + storage: 5Gi --- apiVersion: v1 kind: ConfigMap diff --git a/bootstrap/lvm-localpv-values.yaml b/bootstrap/lvm-localpv-values.yaml index 6432a090..70c6e016 100644 --- a/bootstrap/lvm-localpv-values.yaml +++ b/bootstrap/lvm-localpv-values.yaml @@ -5,8 +5,11 @@ # StorageClass・VolumeSnapshotClass・thin プールを作る DaemonSet は storage.yaml、 # snapshot-controller と VolumeSnapshot の CRD は render.sh が URL で入れる(版は talos.sops.yaml の先頭)。 # -# 容量で Pod の置き場を絞らせない。thin なので PVC の大きさは上限でしかなく、合計がプールを超えてよい -# (denpa は 1Ti と 300Gi)。true だと kube-scheduler が「プールの空き < PVC」のものを置けずに Pending にする。 +# 容量で Pod の置き場を絞らせない。thin なので PVC の大きさは上限でしかなく、合計がプールを超えても作れる。 +# true だと kube-scheduler が「プールの空き < PVC」のものを置けずに Pending にする。 +# ただし**全部の PVC の合計はプール(約 340Gi)に収める。** 超えて実際に埋まると、PVC の中の残量の見張り +# (denpa の disk.ts など)が鳴る前にプールが埋まり、全部の PVC の書き込みが止まる。 +# 残りは録画(danything/denpa の deploy/application.yaml の encoded)に回してあるので、ほかの PVC を増やしたらそこを減らす。 storageCapacity: false # 匿名の利用統計(Google Analytics)を送らない analytics: diff --git a/docs/decisions.md b/docs/decisions.md index e7e2cb57..bc00f299 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -311,8 +311,10 @@ StorageClass を変えた PVC を作り直すだけで中身が埋まるので `dm-snapshot` は組み込み。起動時の VG の有効化は Talos がする(`thin_check` が無いのは lvm2 が飛ばす)。Talos は知らない LV を消さない - **StorageClass の名前は `local-path` のまま**(既定)。各リポジトリの PVC は書き換えない。`thinProvision: "yes"`(スナップショットから戻せるのは thin だけ)、 xfs(ext4 は `lost+found` を作り、PGDATA がボリュームの直下の Postgres の initdb が落ちる) -- **`storageCapacity: false`。** thin なので PVC の大きさの合計はプールを超えてよい(denpa は 1Ti と 300Gi)。true だと kube-scheduler が +- **`storageCapacity: false`。** thin なので PVC の大きさの合計がプールを超えても作れる(ただし合計はプールに収める。下の項目)。true だと kube-scheduler が プールの空きより大きい PVC を Pending にする +- **PVC の合計はプールに収める。** 超えて実際に埋まると、PVC の中の残量の見張り(denpa の `disk.ts` など)が鳴る前にプールが埋まり、 + 全部の PVC の書き込みが止まる。使用量に比べて大きすぎた PVC(Forgejo・Matrix・Rybbit・AdGuard)を縮め、残りを録画(denpa の encoded)に回した - **snapshot-controller と VolumeSnapshot の CRD は chart の同梱を使わず**、external-snapshotter のタグの URL で入れる(版は `talos.sops.yaml` の先頭)。 クラスタに 1 つのもので、VolSync も使う - **talos-boot が確かめていること**: VG と thin プール(VG の 9 割)、PVC が xfs で bind、VolumeSnapshot が readyToUse、 diff --git a/docs/z440-migration.md b/docs/z440-migration.md index 3594c3cf..d4a426c9 100644 --- a/docs/z440-migration.md +++ b/docs/z440-migration.md @@ -72,7 +72,7 @@ local-path との違いで気を付けること: - **PVC の requests が本当の上限になる。** local-path はディスクの残り全部が使えたので、`adguardhome-work`(5Gi)に 68 GB 入っていた。 戻す前に `recovery/pv.sh - plan-all` が PVC に入るかを見る(`fit`。入らなければ止まる) -- **thin なので合計はプールを超えてよい**(denpa は 1Ti と 300Gi)。代わりに**プールが溢れると全部の PVC の書き込みが止まる。** +- **PVC の合計はプール(約 340Gi)に収める。** thin なので超えても作れるが、**プールが溢れると全部の PVC の書き込みが止まる。** 残りは denpa の encoded に回している(bootstrap/lvm-localpv-values.yaml)。 `kubectl -n kube-system get pods -l app=lvm-thinpool` が 90% で NotReady になる(ログに 1 時間ごとの使用率)。 denpa の残量の表示(statfs)は PVC の大きさで見るので、プールの空きより多く出る - **新しい PVC の直下は root の 0755**(local-path は 0777 だった)。root 以外で書くアプリは `fsGroup` が要る(worklog に足した。ほかは付いているか root) @@ -135,11 +135,11 @@ AMT の SOL は、OS からは PCI のシリアルポート(「Intel … KT Cont ## 4. 移す直前(DL360 で) コマンドは全部 `tools/t.ps1 --admin` のシェルで打つ([../recovery/README.md](../recovery/README.md)「道具と経路」)。 -LVM への切り替えは main に入っていること(入れたあと DL360 の Argo CD は `adguardhome-work` を 30Gi に広げられずに同期のエラーを出すが、 +LVM への切り替えは main に入っていること(入れたあと DL360 の Argo CD は `adguardhome-work` を 10Gi に広げられず、denpa などの縮めた PVC も縮められずに同期のエラーを出すが、 local-path が広げられないだけで、入れ直せば消える)。worklog の `fsGroup`(fj.doany.io の doa/worklog-cloud#179)も入っていること。 1. **AdGuard のクエリログを消す**(Web の「設定 → 一般設定 → クエリログを消去」)。`querylog.json` が 68 GB あり、 - 最後のバックアップに乗ると、戻すときに `adguardhome-work`(30Gi)に入らず `plan-all` が止まる。 + 最後のバックアップに乗ると、戻すときに `adguardhome-work`(10Gi)に入らず `plan-all` が止まる。 消す前に、どの端末が 1 日 10 GB も引いているかを見ておく(2026-10 末から。前は 1 日 0.3 GB ほど) 2. **Z440 の MAC を `LinkAliasConfig` に足して main にマージ**(「2. NIC と bond0」)。talos-boot が通ること 3. machine config を描く: `./bootstrap/render.sh bootstrap/clusterconfig`(`valid for metal mode` まで出ること)。