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

Closed
hermes wants to merge 1 commits from feat/storage-vault into main
Collaborator

Зачем

  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.ruenvoy-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 ```
hermes added 1 commit 2026-09-16 21:17:24 +00:00
feat(storage,security): openebs localpv (default StorageClass) + vault
Flate / Flate - Filter (pull_request) Successful in 15s
Flate / Flate (pull_request) Failing after 1m55s
Flate / Flate - Success (pull_request) Canceled after 0s
8c14178bd9
hermes closed this pull request 2026-09-16 23:22:38 +00:00
hermes deleted branch feat/storage-vault 2026-09-16 23:22:38 +00:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: grachevko/home-ops#1