Вопрос или проблема
Я пытаюсь провести тест, который проверяет, что секрет может быть создан и извлечен с помощью helm. Однако я получаю следующую ошибку:
pods “secret-creation-and-retrieval” запрещен: ошибка при попытке
найти сервисный аккаунт deployment-namespace/default: сервисный аккаунт “default” не найден
Я не уверен, почему это происходит, и не нашел много информации, искал ошибку в интернете. Конфигурация теста в yaml выглядит следующим образом:
apiVersion: v1
kind: Pod
metadata:
name: "secret-creation-and-retrieval"
annotations:
"helm.sh/hook": test
spec:
containers:
- name: kubectl
image: "k8s.gcr.io/hyperkube:latest"
imagePullPolicy: "IfNotPresent"
command:
- /bin/sh
- -c
- >
kubectl create secret generic test-secret --from-literal=hello=world -n deployment-namespace
kubectl describe secret test-secret -n deployment-namespace
restartPolicy: Never
Команды, используемые для запуска развертывания и теста, выглядят следующим образом:
helm install deployment-name ./helm --create-namespace -n deployment-namespace
helm test deployment-name -n deployment-namespace
Команда helm install выполняется успешно и не сообщает об ошибках, связанных с сервисным аккаунтом. Почему эта ошибка возникает, когда тестовый pod развертывается, а не когда само развертывание устанавливается?
Надеюсь на помощь/информацию о том, что я делаю не так и/или какие-либо ресурсы по этой теме.
Окружение:
k3s version v1.29.4+k3s1
helm version v3.15.1
Вы в конечном итоге поняли, откуда была ошибка? Получил то же сообщение в аналогичном контексте 🙂
Ответ или решение
Причины ошибки: "service account not found" при запуске Helm тестов
Когда вы сталкиваетесь с ошибкой serviceaccount "default" not found
во время выполнения теста Helm, важно понимать, что проблема связана с отсутствием сервисного аккаунта в указанном пространстве имен. Давайте рассмотрим, как это влияет на ваши тесты и что можно сделать для решения проблемы.
Понимание проблемы
Ваша конфигурация теста Helm создает Pod с именем secret-creation-and-retrieval
, который пытается выполнить команды для создания и описания секрета. Ошибка, которую вы получаете, указывает на то, что Helm пытается использовать сервисный аккаунт по умолчанию (default
) в пространстве имен deployment-namespace
, однако он не может его найти.
-
Контекст пространства имен: Когда вы запускаете
helm install deployment-name ./helm --create-namespace -n deployment-namespace
, Helm создает указанное пространство имен, но по умолчанию не создает сервисный аккаунт в этом пространстве, если он не был явно указан в манифестах вашего чарта. -
Проблема с ресурсами: В Kubernetes все Работающие объекты (Pods, Deployments и т.д.) связаны с сервисными аккаунтами для управления доступом (RBAC). Если сервисный аккаунт не существует, Kubernetes отказывает в доступе к ресурсу.
-
Причина отличий между установкой и тестированием: Ваша команда установки Helm может не требовать сервисного аккаунта, если она не выполняет операции, требующие дополнительных прав. Однако тестирование, запускаемое через
helm test
, пытается создать и управлять секретами, что требует подходящих разрешений.
Решение проблемы
Шаг 1: Создайте сервисный аккаунт
Вам нужно создать сервисный аккаунт в вашем пространстве имен deployment-namespace
. Это можно сделать, добавив следующий YAML в ваш Helm чарт:
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: deployment-namespace
Шаг 2: Назначьте права доступа (RBAC)
После создания сервисного аккаунта вам нужно будет создать Role или ClusterRole и RoleBinding или ClusterRoleBinding для управления доступом. Например:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: deployment-namespace
name: secret-manager
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["create", "get", "list", "watch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: secret-manager-binding
namespace: deployment-namespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: secret-manager
subjects:
- kind: ServiceAccount
name: default
namespace: deployment-namespace
Шаг 3: Обновите конфигурацию Pod
Убедитесь, что ваш Pod использует этот сервисный аккаунт, добавив к вашему YAML следующую секцию:
spec:
serviceAccountName: default
Шаг 4: Повторите попытку тестирования
После внесения вышеуказанных изменений выполните команды:
helm install deployment-name ./helm --create-namespace -n deployment-namespace
helm test deployment-name -n deployment-namespace
Заключение
Ошибка serviceaccount "default" not found
является распространенной проблемой, которая возникает из-за отсутствия необходимого сервисного аккаунта в Kubernetes. Следуя приведенным рекомендациям, вы сможете успешно решить эту проблему и выполнить тесты Helm без дополнительных ошибок. Если у вас возникли трудности, всегда полезно обратиться к документации Kubernetes и Helm или сообществу для получения дополнительной помощи.