From 20fb353fac0013e06e0a49ae9539e027f48ef4df Mon Sep 17 00:00:00 2001 From: hermes-agent Date: Wed, 16 Sep 2026 23:22:35 +0000 Subject: [PATCH 1/3] =?UTF-8?q?feat(storage):=20proxmox-csi-plugin=20+=20S?= =?UTF-8?q?torageClass=20=D0=BD=D0=B0=20=D0=BF=D1=83=D0=BB=D1=8B=20Proxmox?= =?UTF-8?q?=20(rpool/local-zfs)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kubernetes/apps/storage/kustomization.yaml | 11 ++++ kubernetes/apps/storage/namespace.yaml | 10 +++ .../storage/proxmox-csi/app/helmrelease.yaml | 62 +++++++++++++++++++ .../proxmox-csi/app/kustomization.yaml | 7 +++ .../proxmox-csi/app/ocirepository.yaml | 13 ++++ .../storage/proxmox-csi/app/secret.sops.yaml | 18 ++++++ kubernetes/apps/storage/proxmox-csi/ks.yaml | 20 ++++++ talos/all/32-node-labels.yaml | 7 +++ 8 files changed, 148 insertions(+) create mode 100644 kubernetes/apps/storage/kustomization.yaml create mode 100644 kubernetes/apps/storage/namespace.yaml create mode 100644 kubernetes/apps/storage/proxmox-csi/app/helmrelease.yaml create mode 100644 kubernetes/apps/storage/proxmox-csi/app/kustomization.yaml create mode 100644 kubernetes/apps/storage/proxmox-csi/app/ocirepository.yaml create mode 100644 kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml create mode 100644 kubernetes/apps/storage/proxmox-csi/ks.yaml create mode 100644 talos/all/32-node-labels.yaml diff --git a/kubernetes/apps/storage/kustomization.yaml b/kubernetes/apps/storage/kustomization.yaml new file mode 100644 index 0000000..bcaadc5 --- /dev/null +++ b/kubernetes/apps/storage/kustomization.yaml @@ -0,0 +1,11 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: storage + +components: + - ../../components/sops + +resources: + - ./namespace.yaml + - ./proxmox-csi/ks.yaml diff --git a/kubernetes/apps/storage/namespace.yaml b/kubernetes/apps/storage/namespace.yaml new file mode 100644 index 0000000..f1bcfa1 --- /dev/null +++ b/kubernetes/apps/storage/namespace.yaml @@ -0,0 +1,10 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: storage + annotations: + kustomize.toolkit.fluxcd.io/prune: disabled + # proxmox-csi-plugin ставит привилегированный node-DaemonSet (работа с + # /dev и монтированием дисков), поэтому PSA для этого ns ослаблен. + pod-security.kubernetes.io/enforce: privileged diff --git a/kubernetes/apps/storage/proxmox-csi/app/helmrelease.yaml b/kubernetes/apps/storage/proxmox-csi/app/helmrelease.yaml new file mode 100644 index 0000000..4b69996 --- /dev/null +++ b/kubernetes/apps/storage/proxmox-csi/app/helmrelease.yaml @@ -0,0 +1,62 @@ +--- +apiVersion: helm.toolkit.fluxcd.io/v2 +kind: HelmRelease +metadata: + name: proxmox-csi-plugin +spec: + chartRef: + kind: OCIRepository + name: proxmox-csi-plugin + interval: 1h + maxHistory: 3 + install: + crds: CreateReplace + remediation: + retries: 3 + upgrade: + crds: CreateReplace + cleanupOnFail: true + remediation: + retries: 3 + values: + # Подключение к Proxmox (url/токен/region) и StorageClass'ы: сам конфиг лежит + # в Secret'е proxmox-csi-config (файл secret.sops.yaml рядом, шифруется sops). + existingConfigSecret: proxmox-csi-config + existingConfigSecretKey: config.yaml + storageClass: + # local-zfs = пул rpool (зеркало 2x NVMe) — дефолтный класс: сюда идут + # Vault, базы и всё, что требует избыточности на уровне дисков. + - name: proxmox-local-zfs + storage: local-zfs + fstype: ext4 + ssd: true + reclaimPolicy: Delete + annotations: + storageclass.kubernetes.io/is-default-class: "true" + # ssd = большой пул (2 TB, одиночный NVMe) — под bulk-данные. + - name: proxmox-ssd + storage: ssd + fstype: ext4 + ssd: true + reclaimPolicy: Delete + controller: + # Все три ноды — control-plane, поэтому контроллер цепляем туда же + # (и терпим taint control-plane). + nodeSelector: + node-role.kubernetes.io/control-plane: "" + tolerations: + - key: node-role.kubernetes.io/control-plane + effect: NoSchedule + node: + tolerations: + - key: node-role.kubernetes.io/control-plane + effect: NoSchedule + - key: karpenter.sh/disrupted + operator: Exists + effect: NoSchedule + - key: node.kubernetes.io/unschedulable + operator: Exists + effect: NoSchedule + - key: node.kubernetes.io/disk-pressure + operator: Exists + effect: NoSchedule diff --git a/kubernetes/apps/storage/proxmox-csi/app/kustomization.yaml b/kubernetes/apps/storage/proxmox-csi/app/kustomization.yaml new file mode 100644 index 0000000..f79ce82 --- /dev/null +++ b/kubernetes/apps/storage/proxmox-csi/app/kustomization.yaml @@ -0,0 +1,7 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - ./ocirepository.yaml + - ./helmrelease.yaml + - ./secret.sops.yaml diff --git a/kubernetes/apps/storage/proxmox-csi/app/ocirepository.yaml b/kubernetes/apps/storage/proxmox-csi/app/ocirepository.yaml new file mode 100644 index 0000000..a2307a8 --- /dev/null +++ b/kubernetes/apps/storage/proxmox-csi/app/ocirepository.yaml @@ -0,0 +1,13 @@ +--- +apiVersion: source.toolkit.fluxcd.io/v1 +kind: OCIRepository +metadata: + name: proxmox-csi-plugin +spec: + interval: 12h + layerSelector: + mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip + operation: copy + ref: + tag: 0.20.0 + url: oci://ghcr.io/sergelogvinov/charts/proxmox-csi-plugin diff --git a/kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml b/kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml new file mode 100644 index 0000000..e122ce0 --- /dev/null +++ b/kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: v1 +kind: Secret +metadata: + name: proxmox-csi-config +stringData: + config.yaml: |- + clusters: + - url: https://pve.grachevko.ru:8006/api2/json + # PVE отдаёт самоподписанный сертификат — проверку отключаем. + insecure: true + token_id: kubernetes-csi@pve!csi + # TODO: вписать секрет токена из `pveum user token add kubernetes-csi@pve csi` + # и зашифровать файл: sops -e -i kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml + token_secret: REPLACE_WITH_PVE_TOKEN_SECRET + # region = имя Proxmox-кластера (pvecm create home-ops), + # zone (имя узла PVE) приходит из метки topology.kubernetes.io/zone. + region: home-ops diff --git a/kubernetes/apps/storage/proxmox-csi/ks.yaml b/kubernetes/apps/storage/proxmox-csi/ks.yaml new file mode 100644 index 0000000..e416da1 --- /dev/null +++ b/kubernetes/apps/storage/proxmox-csi/ks.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: proxmox-csi +spec: + interval: 1h + path: ./kubernetes/apps/storage/proxmox-csi/app + prune: true + sourceRef: + kind: GitRepository + name: flux-system + namespace: flux-system + targetNamespace: storage + wait: true + healthChecks: + - apiVersion: helm.toolkit.fluxcd.io/v2 + kind: HelmRelease + name: proxmox-csi-plugin + namespace: storage diff --git a/talos/all/32-node-labels.yaml b/talos/all/32-node-labels.yaml new file mode 100644 index 0000000..3219410 --- /dev/null +++ b/talos/all/32-node-labels.yaml @@ -0,0 +1,7 @@ +# Метки топологии для Proxmox CSI Plugin: region обязан совпадать с именем +# Proxmox-кластера (`pvecm create home-ops`), zone — с именем узла Proxmox. +# Без них CSI не сможет понять, на каком узле создавать том. +machine: + nodeLabels: + topology.kubernetes.io/region: home-ops + topology.kubernetes.io/zone: pve -- 2.54.0 From 2dff7e052d0dc54433d7311777dab889ba37b235 Mon Sep 17 00:00:00 2001 From: hermes-agent Date: Thu, 17 Sep 2026 14:45:32 +0000 Subject: [PATCH 2/3] =?UTF-8?q?fix(storage):=20tag=20=D1=87=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=B0=200.5.10=20(0.20.0=20=E2=80=94=20=D1=8D=D1=82?= =?UTF-8?q?=D0=BE=20appVersion),=20region=20ru-central1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apps/storage/proxmox-csi/app/ocirepository.yaml | 4 +++- kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml | 7 ++++--- talos/all/32-node-labels.yaml | 9 +++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/kubernetes/apps/storage/proxmox-csi/app/ocirepository.yaml b/kubernetes/apps/storage/proxmox-csi/app/ocirepository.yaml index a2307a8..4930701 100644 --- a/kubernetes/apps/storage/proxmox-csi/app/ocirepository.yaml +++ b/kubernetes/apps/storage/proxmox-csi/app/ocirepository.yaml @@ -9,5 +9,7 @@ spec: mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip operation: copy ref: - tag: 0.20.0 + # Версия ЧАРТА, а не приложения: у релиза v0.20.0 (appVersion v0.20.0) + # чарт идёт с version 0.5.10 (см. charts/proxmox-csi-plugin/Chart.yaml). + tag: 0.5.10 url: oci://ghcr.io/sergelogvinov/charts/proxmox-csi-plugin diff --git a/kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml b/kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml index e122ce0..3ec373e 100644 --- a/kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml +++ b/kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml @@ -13,6 +13,7 @@ stringData: # TODO: вписать секрет токена из `pveum user token add kubernetes-csi@pve csi` # и зашифровать файл: sops -e -i kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml token_secret: REPLACE_WITH_PVE_TOKEN_SECRET - # region = имя Proxmox-кластера (pvecm create home-ops), - # zone (имя узла PVE) приходит из метки topology.kubernetes.io/zone. - region: home-ops + # region = имя Proxmox-кластера, создаётся `pvecm create ru-central1` + # (облачный стиль: как в Yandex Cloud/GCE). zone = имя узла PVE и + # приходит из метки topology.kubernetes.io/zone (сейчас `pve`). + region: ru-central1 diff --git a/talos/all/32-node-labels.yaml b/talos/all/32-node-labels.yaml index 3219410..50d8b26 100644 --- a/talos/all/32-node-labels.yaml +++ b/talos/all/32-node-labels.yaml @@ -1,7 +1,8 @@ -# Метки топологии для Proxmox CSI Plugin: region обязан совпадать с именем -# Proxmox-кластера (`pvecm create home-ops`), zone — с именем узла Proxmox. -# Без них CSI не сможет понять, на каком узле создавать том. +# Метки топологии для Proxmox CSI Plugin. +# region — имя Proxmox-кластера (`pvecm create ru-central1`), облачный стиль +# как в Yandex Cloud/GCE; zone — имя узла Proxmox (наш хост называется `pve`). +# Второй узел PVE, если появится, станет отдельной зоной (ru-central1-b и т.д.). machine: nodeLabels: - topology.kubernetes.io/region: home-ops + topology.kubernetes.io/region: ru-central1 topology.kubernetes.io/zone: pve -- 2.54.0 From 09038b4d49a5801972bc230277ac8975503f69d1 Mon Sep 17 00:00:00 2001 From: hermes-agent Date: Thu, 17 Sep 2026 15:11:49 +0000 Subject: [PATCH 3/3] =?UTF-8?q?fix(storage):=20region=20=3D=20home-ops=20(?= =?UTF-8?q?=D0=B8=D0=BC=D1=8F=20=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D1=83=D1=8E=D1=89=D0=B5=D0=B3=D0=BE=20PVE-=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D1=80=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml | 8 ++++---- talos/all/32-node-labels.yaml | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml b/kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml index 3ec373e..72e888e 100644 --- a/kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml +++ b/kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml @@ -13,7 +13,7 @@ stringData: # TODO: вписать секрет токена из `pveum user token add kubernetes-csi@pve csi` # и зашифровать файл: sops -e -i kubernetes/apps/storage/proxmox-csi/app/secret.sops.yaml token_secret: REPLACE_WITH_PVE_TOKEN_SECRET - # region = имя Proxmox-кластера, создаётся `pvecm create ru-central1` - # (облачный стиль: как в Yandex Cloud/GCE). zone = имя узла PVE и - # приходит из метки topology.kubernetes.io/zone (сейчас `pve`). - region: ru-central1 + # region = имя существующего Proxmox-кластера на pve (переименование не + # делаем: PVE не поддерживает смену имени кластера). zone = имя узла PVE + # и приходит из метки topology.kubernetes.io/zone (сейчас `pve`). + region: home-ops diff --git a/talos/all/32-node-labels.yaml b/talos/all/32-node-labels.yaml index 50d8b26..fa3886e 100644 --- a/talos/all/32-node-labels.yaml +++ b/talos/all/32-node-labels.yaml @@ -1,8 +1,7 @@ # Метки топологии для Proxmox CSI Plugin. -# region — имя Proxmox-кластера (`pvecm create ru-central1`), облачный стиль -# как в Yandex Cloud/GCE; zone — имя узла Proxmox (наш хост называется `pve`). -# Второй узел PVE, если появится, станет отдельной зоной (ru-central1-b и т.д.). +# region обязан совпадать с именем Proxmox-кластера (у нас на pve уже создан +# кластер `home-ops`), zone — с именем узла Proxmox (хост называется `pve`). machine: nodeLabels: - topology.kubernetes.io/region: ru-central1 + topology.kubernetes.io/region: home-ops topology.kubernetes.io/zone: pve -- 2.54.0