Назад к вопросам
Middle+
69
questionbank
Какой у вас опыт работы с сайдкарами для хранения секретов?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Работал с паттерном сайдкара для инъекции секретов в контейнеризированные приложения. Основные решения, с которыми сталкивался:
-
Vault Agent Injector (HashiCorp Vault):
- Разворачивается как контроллер в Kubernetes, который перехватывает создание подов, ищет аннотации Vault.
- Автоматически добавляет к поду Volume и сайдкар-контейнер Vault Agent.
- Vault Agent отвечает за аутентификацию в Vault, получение секретов и их запись в файловую систему пода (через Volume).
- Приложение внутри пода читает секреты из смонтированного Volume.
- Преимущества: централизованное управление секретами, динамическое получение, автоматическая ротация, интеграция с различными аутентификационными бэкендами Vault.
-
Kubernetes Secrets Store CSI Driver:
- Позволяет приложениям в Kubernetes получать доступ к секретам, хранящимся во внешних хранилищах секретов (Azure Key Vault, GCP Secret Manager, AWS Secrets Manager, HashiCorp Vault и др.) как к томам (Volume).
- Сайдкар-контейнер (Specific Provider) запускается как часть того же пода или как отдельный агент и взаимодействует с внешним хранилищем посредством gRPC.
- Полученные секреты монтируются в под как временное файловое хранилище (Secrets Store CSI Driver Volume).
- Приложение читает секреты из файловой системы.
- Преимущества: единый интерфейс для доступа к разным хранилищам секретов в Kubernetes, возможность монтировать не только Secrets/Configs, но и сертификаты, ключи.
Общий подход заключается в минимизации хранения секретов непосредственно в образе приложения или в манифестах Kubernetes, делегируя задачу их получения и обновления сайдкару. Это повышает безопасность за счет отделения логики работы с секретами от логики приложения и облегчает управление секретами в динамических средах вроде Kubernetes.
# Пример использования Vault Agent Injector аннотаций в манифесте Pod
apiVersion: v1
kind: Pod
metadata:
name: my-app
annotations:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/role: "internal-app"
vault.hashicorp.com/agent-inject-template-db-config: |
{{- with secret "database/creds/my-app" -}}
DB_USERNAME="{{ .Data.username }}"
DB_PASSWORD="{{ .Data.password }}"
{{- end -}}
spec:
containers:
- name: app
image: my-app-image
# Приложение будет читать секреты из /vault/secrets/db-config
volumeMounts:
- name: injected-secrets
mountPath: "/vault/secrets"
volumes:
- name: injected-secrets
# Volume, который будет создан и заполнен Vault Agent
emptyDir:
# Используется tmpfs для хранения секретов в памяти
medium: Memory
# Пример использования Secrets Store CSI Driver
apiVersion: v1
kind: Pod
metadata:
name: my-app-csi
spec:
serviceAccountName: workload-identity-sa # Пример для облачных провайдеров
containers:
- name: app
image: my-app-image
volumeMounts:
- name: secret-volume
mountPath: "/mnt/secrets-store"
readOnly: true
volumes:
- name: secret-volume
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "azure-keyvault-csi" # Ссылка на SecretProviderClass
---
apiVersion: secrets-store.csi.k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-keyvault-csi
spec:
provider: azure # Указание провайдера
parameters:
usePodIdentity: "false" # Использование управляемых удостоверений Azure AD
useVMManagedIdentity: "true"
userAssignedIdentityID: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # ID управляемого удостоверения
keyvaultName: "my-keyvault" # Имя Azure Key Vault
tenantId: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # ID тенанта Azure AD
objects: |
array:
- |
objectName: my-database-password # Имя секрета в Key Vault
objectType: secret
objectVersion: "" # Опциональная версия секрета
fieldName: DB_PASSWORD # Имя файла, куда будет записан секрет в Volume
Использование сайдкара для секретов обеспечиваетseparation of concerns и упрощает интеграцию с системами управления секретами.