Как вы интегрировали HashiCorp Vault в Kubernetes?

«Как вы интегрировали HashiCorp Vault в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я интегрировал Vault в Kubernetes для безопасного управления секретами, используя два основных подхода в production-среде.

1. Vault Agent Injector (для статических секретов): Это sidecar-контейнер, который автоматически внедряет секреты в под как файлы или переменные окружения.

  • Установка через Helm:
    helm install vault hashicorp/vault 
    --set "server.ha.enabled=true" 
    --set "injector.enabled=true"
  • Конфигурация через аннотации в манифесте пода:
    apiVersion: v1
    kind: Pod
    metadata:
    name: my-app
    annotations:
    vault.hashicorp.com/agent-inject: 'true'
    vault.hashicorp.com/role: 'myapp-role' # Роль Kubernetes для аутентификации
    vault.hashicorp.com/agent-inject-secret-db-creds: 'database/creds/my-role'
    vault.hashicorp.com/agent-inject-template-db-creds: |
      {{- with secret "database/creds/my-role" -}}
      {{ .Data.username }}
      {{ .Data.password }}
      {{- end }}
    spec:
    serviceAccountName: my-app-sa # ServiceAccount, привязанный к роли Vault
    containers:
    - name: app
    image: my-app:latest

2. CSI Provider (для динамических секретов): Идеально подходит для баз данных, где нужны кратковременные учетные данные. Секреты монтируются как том и автоматически обновляются.

  • Включение CSI Provider:
    helm install vault hashicorp/vault 
    --set "csi.enabled=true"
  • Создание SecretProviderClass:
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
    name: db-dynamic-creds
    spec:
    provider: vault
    parameters:
    vaultAddress: "http://vault-active.vault.svc.cluster.local:8200"
    roleName: "db-admin"
    objects: |
      - objectPath: "database/creds/my-dynamic-role"
        secretKey: "password"

Ключевые настройки для продакшена, которые я выполнял:

  • Аутентификация через Kubernetes ServiceAccount: Настраивал в Vault kubernetes auth method, связывая K8s namespaces и service accounts с политиками Vault.
  • High Availability (HA): Запускал Vault в HA-режиме с Consul или Integrated Storage (Raft).
  • TLS и mTLS: Настраивал внутренний и внешний TLS для всего трафика, включая взаимную аутентификацию между Vault и injector/CSI.
  • Политики с наименьшими привилегиями: Тщательно прорабатывал политики Vault, выдавая приложениям доступ только к конкретным путям секретов.