Диагностика Secrets Store
В этом разделе описаны типичные проблемы при использовании Secrets Injector и способы их решения.
Секреты не подставляются в переменные окружения
Симптом
Под запускается, но переменные окружения содержат исходные значения-ссылки (secrets:secret/data/...) вместо реальных значений.
Причины и решения
Аннотации не попали в шаблон пода
Основное место настройки инъекции — аннотации в шаблоне пода. Для Deployment, StatefulSet, DaemonSet и Job рекомендуется указывать аннотации в spec.template.metadata.annotations. Для CronJob используйте spec.jobTemplate.spec.template.metadata.annotations.
Для Deployment, StatefulSet, DaemonSet и Job вебхук также может скопировать аннотации из metadata.annotations ресурса, если они не заданы в шаблоне пода. Если одна и та же аннотация задана в обоих местах, используется значение из шаблона пода. Но шаблон пода остается самым понятным и переносимым местом для настройки инъекции.
Примеры:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
metadata:
annotations:
secrets.stackland.yandex.cloud/render-env: "true"
secrets.stackland.yandex.cloud/role: "myapp"
Пространство имен исключено из инъекции
Проверьте метки пространства имен:
kubectl get namespace <имя_пространства_имен> --show-labels
Если на пространство имен установлена метка secrets.stackland.yandex.cloud/injection=disabled, вебхук не мутирует поды в нем. Удалите метку:
kubectl label namespace <имя_пространства_имен> secrets.stackland.yandex.cloud/injection-
Не задана аннотация role
Аннотация secrets.stackland.yandex.cloud/role обязательна. Без нее инжектор не сможет аутентифицироваться в Secrets Store.
Неправильный формат ссылки на секрет
Проверьте формат: secrets:<путь>#<ключ>. Слеш перед # не нужен, символ # обязателен.
Примеры:
- Правильно:
secrets:secret/data/myapp/database#password. - Неправильно:
vault:secret/data/myapp/database#password(устаревший префиксvault:). - Неправильно:
secrets:secret/data/myapp/database(нет#ключ).
Под не запускается: no command is given
Симптом
level=ERROR msg="no command is given, stackland-secrets-injector can't determine the entrypoint"
Основной контейнер не стартует. В Env mode инжектор подменяет команду контейнера на себя, получает секреты, а затем заменяет себя процессом приложения. Если не заданы ни command, ни args, инжектор не знает, что запускать.
Решение
Явно задайте command в спецификации контейнера или args, где первый элемент — исполняемый файл. ENTRYPOINT из Docker-образа автоматически не используется.
Пример для Java-приложения:
containers:
- name: app
image: myapp:latest
command:
- /bin/sh
- -c
- "java -jar app.jar"
env:
- name: DB_PASSWORD
value: "secrets:secret/data/myapp/database#password"
Пример для Go/бинарного приложения:
containers:
- name: app
image: myapp:latest
command:
- /app/myapp
args:
- --config=/config/app.yaml
env:
- name: API_KEY
value: "secrets:secret/data/myapp/api#key"
Инъекция не происходит для некоторых контейнеров
Симптом
В поде несколько контейнеров, но мутация не применяется ни к одному из них.
Решение
Если в поде несколько контейнеров и аннотация containers не задана, вебхук отклоняет создание пода, Deployment завершается ошибкой. Укажите явный список контейнеров:
annotations:
secrets.stackland.yandex.cloud/render-env: "true"
secrets.stackland.yandex.cloud/role: "myapp"
secrets.stackland.yandex.cloud/containers: "app,worker"
Секрет не найден в Secrets Store
Симптом
В ConfigMap mode: инжектор (init-контейнер) завершается с ошибкой о том, что секрет не найден, под переходит в Init:Error.
В Env mode: основной контейнер завершается с ошибкой, под переходит в Error или CrashLoopBackOff.
Причины и решения
Путь к секрету указан неверно
Проверьте путь. В Secrets Store KV v2 данные находятся по пути secret/data/<имя>, а не secret/<имя>:
- KV v2:
secrets:secret/data/myapp/database#password. - KV v1:
secrets:secret/myapp/database#password.
Роль не имеет доступа к этому пути
Проверьте policy, привязанную к роли. Она должна разрешать read для нужного пути:
path "secret/data/myapp/*" {
capabilities = ["read"]
}
Роль не привязана к ServiceAccount пода
Проверьте привязку роли:
bao read auth/kubernetes/role/myapp
В выводе должны быть ServiceAccount и пространство имен пода.
Продолжить работу при отсутствующих секретах
Если часть секретов может отсутствовать и это допустимо, используйте:
annotations:
secrets.stackland.yandex.cloud/ignore-missing-secrets: "true"
Проверка работы вебхука
Убедитесь, что вебхук работает и обрабатывает запросы:
# Проверить наличие подов webhook
kubectl get pods -n stackland-secrets-store -l app.kubernetes.io/name=stackland-secrets-webhook
# Проверить логи webhook при создании пода
kubectl logs -n stackland-secrets-store -l app.kubernetes.io/name=stackland-secrets-webhook --tail=50
В логах вебхука при успешной обработке должна быть строка:
level=INFO msg="Admission review request handled" ... duration=...ms
Если вебхук недоступен и failurePolicy: Fail (значение по умолчанию), поды в пространствах имен с включенной инъекцией не запустятся. Проверьте статус вебхука и подов в пространстве имен stackland-secrets-store.
Ошибка TLS при подключении к Secrets Store
Симптом
level=ERROR msg="failed to connect to vault" error="x509: certificate signed by unknown authority"
Решение
Если сертификат Secrets Store не входит в доверенные, используйте аннотацию skip-tls-verify:
annotations:
secrets.stackland.yandex.cloud/skip-tls-verify: "true"
Важно
Использование skip-tls-verify: "true" в production небезопасно.