feat(storage,security): OpenEBS localpv как StorageClass по умолчанию + Vault #1

Closed
hermes wants to merge 1 commit from refs/pull/1/head into main
hermes commented 2026-09-16 21:17:24 +00:00 (Migrated from git.grachevko.ru)

Зачем

  1. В кластере не было ни одного StorageClass — любой PVC оставался Pending, то есть персистентных приложений быть не могло.
  2. Под секреты приложений выбираем Vault (self-hosted, без интернет-зависимости) + External Secrets Operator; Vault'у под integrated storage (raft) нужен PVC.

Что добавлено

kubernetes/apps/storage/ — OpenEBS Dynamic Local PV Provisorer (ns storage):

  • openebs-hostpath становится StorageClass по умолчанию, тома в /var/openebs/local на ноде пода;
  • chart localpv-provisioner 4.6.0 из https://openebs.github.io/dynamic-localpv-provisioner.

kubernetes/apps/security/ — HashiCorp Vault (ns security):

  • chart vault 0.34.1 (Vault 2.0.4) из https://helm.releases.hashicorp.com;
  • режим standalone + raft на PVC 5 Gi (storageClass: openebs-hostpath), UI включён, Service ClusterIP;
  • authDelegator включён — нужен для auth-метода kubernetes, через который external-secrets будет получать токен;
  • injector и csi-provider выключены (не нужны);
  • HTTPRoute vault.grachevko.ru → envoy-internal, сервис vault-ui:8200.

vault зависит от localpv-provisioner через dependsOn (кросс-namespace).

Примечания

  • HTTPRoute цепляется к https-листенеру: http-листенер envoy-internal принимает маршруты только из ns network (from: Same). Сертификат подписан ClusterIssuer internal-ca (самоподписанный CA) — его нужно импортировать в доверенные на клиенте, иначе браузер будет ругаться.
  • После рестарта пода Vault остаётся sealed: распечатывается вручную ключами Shamir (5 долей, порог 3). Ключи и root token кладём в sops-секрет в репе (отдельным PR) + офлайн-копия.
  • TLS на листенере Vault пока выключен (внутрикластерный трафик, ClusterIP). Включим отдельным шагом сертификатом от internal-ca + caBundle в ClusterSecretStore.

Что НЕ входит в этот MR

  • external-secrets + ClusterSecretStore + первый ExternalSecret (следующий шаг);
  • init/unseal Vault и настройка kv-v2 + kubernetes-auth (руками после мёржа);
  • flux-вебхук (Receiver + секрет + маршрут).

После мёржа

just kube reconcile
KUBECONFIG=./kubeconfig kubectl -n storage get sc,deploy
KUBECONFIG=./kubeconfig kubectl -n security get sts,pvc,svc,httproute
KUBECONFIG=./kubeconfig kubectl -n security exec -it vault-0 -- vault operator init -key-shares=5 -key-threshold=3
## Зачем 1. В кластере **не было ни одного StorageClass** — любой PVC оставался `Pending`, то есть персистентных приложений быть не могло. 2. Под секреты приложений выбираем Vault (self-hosted, без интернет-зависимости) + External Secrets Operator; Vault'у под integrated storage (raft) нужен PVC. ## Что добавлено **`kubernetes/apps/storage/`** — OpenEBS Dynamic Local PV Provisorer (ns `storage`): - `openebs-hostpath` становится StorageClass **по умолчанию**, тома в `/var/openebs/local` на ноде пода; - chart `localpv-provisioner` 4.6.0 из `https://openebs.github.io/dynamic-localpv-provisioner`. **`kubernetes/apps/security/`** — HashiCorp Vault (ns `security`): - chart `vault` 0.34.1 (Vault 2.0.4) из `https://helm.releases.hashicorp.com`; - режим standalone + raft на PVC 5 Gi (`storageClass: openebs-hostpath`), UI включён, Service ClusterIP; - `authDelegator` включён — нужен для auth-метода `kubernetes`, через который external-secrets будет получать токен; - injector и csi-provider выключены (не нужны); - HTTPRoute `vault.grachevko.ru` → `envoy-internal`, сервис `vault-ui:8200`. `vault` зависит от `localpv-provisioner` через `dependsOn` (кросс-namespace). ## Примечания - HTTPRoute цепляется к **https**-листенеру: http-листенер `envoy-internal` принимает маршруты только из ns `network` (`from: Same`). Сертификат подписан ClusterIssuer `internal-ca` (самоподписанный CA) — его нужно импортировать в доверенные на клиенте, иначе браузер будет ругаться. - После рестарта пода Vault остаётся sealed: распечатывается вручную ключами Shamir (5 долей, порог 3). Ключи и root token кладём в sops-секрет в репе (отдельным PR) + офлайн-копия. - TLS на листенере Vault пока выключен (внутрикластерный трафик, ClusterIP). Включим отдельным шагом сертификатом от `internal-ca` + `caBundle` в ClusterSecretStore. ## Что НЕ входит в этот MR - external-secrets + ClusterSecretStore + первый ExternalSecret (следующий шаг); - init/unseal Vault и настройка kv-v2 + kubernetes-auth (руками после мёржа); - flux-вебхук (Receiver + секрет + маршрут). ## После мёржа ```sh just kube reconcile KUBECONFIG=./kubeconfig kubectl -n storage get sc,deploy KUBECONFIG=./kubeconfig kubectl -n security get sts,pvc,svc,httproute KUBECONFIG=./kubeconfig kubectl -n security exec -it vault-0 -- vault operator init -key-shares=5 -key-threshold=3 ```

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
grachevko/home-ops!1
No description provided.