Тест Helm не удался из-за отсутствия учетной записи службы по умолчанию.

Вопрос или проблема

Я пытаюсь провести тест, который проверяет, что секрет может быть создан и извлечен с помощью 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, однако он не может его найти.

  1. Контекст пространства имен: Когда вы запускаете helm install deployment-name ./helm --create-namespace -n deployment-namespace, Helm создает указанное пространство имен, но по умолчанию не создает сервисный аккаунт в этом пространстве, если он не был явно указан в манифестах вашего чарта.

  2. Проблема с ресурсами: В Kubernetes все Работающие объекты (Pods, Deployments и т.д.) связаны с сервисными аккаунтами для управления доступом (RBAC). Если сервисный аккаунт не существует, Kubernetes отказывает в доступе к ресурсу.

  3. Причина отличий между установкой и тестированием: Ваша команда установки 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 или сообществу для получения дополнительной помощи.

Оцените материал
Добавить комментарий

Капча загружается...