Инъекция секретов в переменные окружения (Env mode)
В этом руководстве описано, как настроить подстановку секретов из Secrets Store в переменные окружения пода с помощью Secrets Injector.
Перед началом
- Убедитесь, что компонент Secrets Store установлен и активен в кластере.
- В Secrets Store созданы секреты, к которым должно обращаться приложение.
Создайте ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: myapp-sa
namespace: myapp-namespace
kubectl apply -f serviceaccount.yaml
Настройте роль в Secrets Store
Настройте роль в Secrets Store с доступом к нужным путям и привязкой к созданному ServiceAccount.
Подготовьте Deployment
Разместите аннотации в spec.template.metadata.annotations шаблона пода:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: myapp-namespace
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
annotations:
secrets.stackland.yandex.cloud/render-env: "true"
secrets.stackland.yandex.cloud/role: "myapp"
spec:
serviceAccountName: myapp-sa
containers:
- name: app
image: myapp:latest
# В Env mode задайте command или args с исполняемым файлом первым элементом.
command:
- /app/myapp
args:
- --config=/config/app.yaml
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
env:
- name: DB_PASSWORD
value: "secrets:secret/data/myapp/database#password"
- name: API_KEY
value: "secrets:secret/data/myapp/api#key"
Ключевые требования:
- Аннотация
secrets.stackland.yandex.cloud/render-env: "true"включает Env mode. - Аннотация
secrets.stackland.yandex.cloud/roleзадает роль в Secrets Store. - В контейнере необходимо задать
commandилиargs, где первый элементargs— исполняемый файл. Инжектор использует эти поля для запуска приложения. Если не задано ни одно из этих полей, под не запустится с ошибкойno command is given. - В поле
envссылки на секреты имеют форматsecrets:<путь>#<ключ>.
Примените манифесты
kubectl apply -f deployment.yaml
Проверьте результат
Убедитесь, что под запустился и секреты подставлены:
# Проверить статус пода
kubectl get pods -n myapp-namespace
# Проверить логи основного контейнера (инжектор работает как обёртка процесса, не как init-контейнер)
kubectl logs <имя_пода> -n myapp-namespace -c app
# Проверить переменные окружения внутри пода
kubectl exec -n myapp-namespace <имя_пода> -- env | grep DB_
В логах успешной инъекции в начале вывода должны быть строки:
level=INFO msg="found secret references" count=2
level=INFO msg="successfully injected secrets" count=2
level=INFO msg="spawning process" binary=...
Использование нескольких контейнеров
Если в поде несколько контейнеров и нужно инжектировать секреты только в часть из них, используйте аннотацию containers:
annotations:
secrets.stackland.yandex.cloud/render-env: "true"
secrets.stackland.yandex.cloud/role: "myapp"
secrets.stackland.yandex.cloud/containers: "app,worker"
Если аннотация containers не задана и контейнеров несколько, вебхук отклоняет создание пода, Deployment завершается ошибкой.
Диагностика
Если секреты не подставляются, смотрите раздел Диагностика Secrets Store.