VK Cloud logo
Обновлена 15 апреля 2024 г. в 08:50

Создание файла kubeconfig для сервисного аккаунта

При подключении с помощью kubectl к кластеру Cloud Containers используется kubeconfig, файл конфигурации кластера. Обычно для работы с кластером используется kubeconfig из личного кабинета VK Cloud, который настроен на использование технологии единого входа. Поэтому при работе с kubectl периодически нужно вводить пароль пользователя.

Такой процесс аутентификации неудобен при работе с автоматизированными инструментами, которым нужен доступ к кластеру. Для работы с ними удобнее использовать файл kubeconfig для сервисного аккаунта. Этот kubeconfig позволяет аутентифицироваться с помощью токена с бесконечным временем жизни, без ввода пароля.

Подготовительные шаги

  1. Создайте кластер Cloud Containers самой актуальной версии.

    При создании кластера выберите опцию Назначить внешний IP. Прочие параметры кластера выберите на свое усмотрение.

  2. Убедитесь, что вы можете подключиться к созданному кластеру с помощью kubectl.

    При этом будет использоваться kubeconfig, загруженный из личного кабинета VK Cloud.

  3. Задайте переменные среды окружения, указывающие на kubeconfig:

    • VKCLOUD_KUBECONFIG: путь к kubeconfig, загруженному из личного кабинета VK Cloud.
    • SA_KUBECONFIG: путь к kubeconfig для сервисного аккаунта (сам файл будет создан позднее).

    Это упростит дальнейшую работу с kubectl.

    export VKCLOUD_KUBECONFIG="/home/user/.kube/kubernetes-cluster-1234_kubeconfig.yaml"export SA_KUBECONFIG="/home/user/.kube/sa_kubeconfig.yaml"
  4. Убедитесь, что после подключения к кластеру есть права на создание необходимых ресурсов Kubernetes:

    kubectl --kubeconfig $VKCLOUD_KUBECONFIG auth can-i create serviceaccountkubectl --kubeconfig $VKCLOUD_KUBECONFIG auth can-i create secretkubectl --kubeconfig $VKCLOUD_KUBECONFIG auth can-i create clusterrolebinding

    Для каждой из команд должен быть выведен ответ yes.

    Если нет прав на создание любого из этих ресурсов (ответ no), скорректируйте роль пользователя VK Cloud, от имени которого выполняется подключение к кластеру.

    Подробнее о ролевой модели и доступных ролях читайте в разделе Управление доступом.

1. Создайте сервисный аккаунт и свяжите его с ролью

  1. Создайте сервисный аккаунт example-sa в пространстве имен kube-system:

    kubectl --kubeconfig $VKCLOUD_KUBECONFIG \  create serviceaccount example-sa -n kube-system

    Пример вывода команды:

    serviceaccount/example-sa created
  2. Выберите кластерную роль, которую нужно назначить сервисному аккаунту.

    Чтобы получить список всех кластерных ролей с подробным описанием, выполните команду:

    kubectl --kubeconfig $VKCLOUD_KUBECONFIG describe clusterroles

    При выборе роли следуйте принципу наименьших привилегий, чтобы повысить безопасность при работе с кластером. Подробнее о ролевой модели читайте в официальной документации Kubernetes.

    В качестве примера далее будет назначена роль edit. Она соответствует роли Оператор Kubernetes в личном кабинете.

  3. Свяжите созданный сервисный аккаунт с выбранной кластерной ролью. Для этого создайте ресурс ClusterRoleBinding с именем example-binding.

    Сервисный аккаунт должен указываться вместе с пространством имен, к которому он принадлежит.

    kubectl --kubeconfig $VKCLOUD_KUBECONFIG \  create clusterrolebinding example-binding \    --serviceaccount=kube-system:example-sa \    --clusterrole=edit

    Пример вывода команды:

    clusterrolebinding.rbac.authorization.k8s.io/example-binding created

2. Получите токен для сервисного аккаунта

  1. Создайте секрет example-token, содержащий токен для сервисного аккаунта:

    1. Создайте файл манифеста:

      Пояснения к полям манифеста:

      • type: специальный тип секрета kubernetes.io/service-account-token. Такой секрет хранит в себе токен для сервисного аккаунта.
      • metadata.namespace: пространство имен для секрета. Секрет должен размещаться в том же пространстве имен, что и сервисный аккаунт.
      • metadata.annotations: специальная аннотация kubernetes.io/service-account.name с именем сервисного аккаунта. Токен из созданного секрета будет связан с этим аккаунтом.
    2. Примените файл манифеста:

      kubectl --kubeconfig $VKCLOUD_KUBECONFIG apply -f example-token.yaml

      Будет создан секрет с заданными параметрами. Пример вывода команды:

      secret/example-token created
  2. Убедитесь, что сервисному аккаунту был назначен токен из созданного секрета:

    kubectl --kubeconfig $VKCLOUD_KUBECONFIG \  describe serviceaccount example-sa -n kube-system

    В выводе должно содержаться указание на секрет в поле Tokens.

  3. Получите значение токена.

    Секрет хранит в себе токен в закодированном виде (схема кодирования Base64). Токен необходимо декодировать, чтобы его можно было использовать в kubeconfig:

    kubectl --kubeconfig $VKCLOUD_KUBECONFIG \  get secret example-token -n kube-system \  --template={{.data.token}} | base64 --decode

    Будет выведено значение токена. Сохраните его.

4. Создайте kubeconfig для сервисного аккаунта

  1. Создайте основу для этого kubeconfig путем копирования kubeconfig, загруженного из личного кабинета VK Cloud.

    cp $VKCLOUD_KUBECONFIG $SA_KUBECONFIG
  2. (Опционально) Познакомьтесь со структурой kubeconfig:

    kubectl --kubeconfig $SA_KUBECONFIG config view

    Будет выведено содержимое kubeconfig в сжатом виде: значения некоторых полей будут опущены.

    Kubeconfig содержит в себе все параметры, необходимые для работы с кластером:

    • clusters: перечень кластеров и данных для подключения к ним.

      Kubeconfig для кластера Cloud Containers содержит запись о единственном кластере.

    • users: перечень пользователей и данных для их аутентификации в кластере.

      Kubeconfig для кластера Cloud Containers содержит запись о единственном пользователе, который аутентифицируется с помощью keystone-auth.

    • contexts: контекст, в рамках которого работает kubectl. В самом простом случае контекст — это комбинация имени кластера и имени пользователя.

      Kubeconfig для кластера Cloud Containers содержит запись о единственном контексте. Этот контекст использует запись о кластере и пользователе, которые уже определены в kubeconfig.

    Когда kubectl работает в указанном контексте, он работает с заданным в контексте кластером от имени указанного пользователя.

  3. Измените содержимое kubeconfig для сервисного аккаунта, чтобы этот файл содержал в себе параметры, связанные с настроенным ранее сервисным аккаунтом:

    1. Удалите существующего пользователя.

      Этот пользователь соответствует пользователю VK Cloud и не должен фигурировать в kubeconfig, который будет использоваться автоматизированными инструментами.

      1. Получите список пользователей:

        kubectl --kubeconfig $SA_KUBECONFIG \  config get-users
      2. Удалите пользователя, используя нужное имя из списка:

        kubectl --kubeconfig $SA_KUBECONFIG \  config delete-user <имя пользователя>

        Пример частичного вывода команды:

        deleted user kubernetes-cluster-1234 from ...sa_kubeconfig.yaml
    2. Добавьте нового пользователя example-sa.

      Этот пользователь соответствует созданному ранее сервисному аккаунту. Для аутентификации будет использоваться полученный ранее токен.

      kubectl --kubeconfig $SA_KUBECONFIG \  config set-credentials example-sa --token="<значение токена>"

      Пример вывода команды:

      User "example-sa" set.
    3. Настройте текущий контекст на использование добавленного пользователя:

      kubectl --kubeconfig $SA_KUBECONFIG \  config set-context --current --user="example-sa"

      Пример вывода:

      Context "default/kubernetes-cluster-1234" modified.
  4. (Опционально) Проверьте обновленное содержимое kubeconfig для сервисного аккаунта:

    kubectl --kubeconfig $SA_KUBECONFIG config view

    Этот kubeconfig не должен содержать других пользователей, кроме добавленного ранее example-sa. Единственный контекст должен использовать этого пользователя.

5. Проверьте работу созданного kubeconfig

Используйте команды kubectl и созданный ранее kubeconfig для сервисного аккаунта, чтобы получить информацию о кластере и его ресурсах, например:

  1. Получите информацию о кластере:

    kubectl --kubeconfig $SA_KUBECONFIG cluster-info
  2. Получите список основных ресурсов в пространстве имен default:

    kubectl --kubeconfig $SA_KUBECONFIG get all -n default

Если при выполнении команд пароль не был запрошен, то полученный kubeconfig можно использовать в комбинации с автоматизированными инструментами для доступа к кластеру Cloud Containers.

Отзовите скомпрометированный токен

Если созданный ранее токен или содержащий его kubeconfig были скомпрометированы, отзовите токен, чтобы предотвратить несанкционированный доступ к кластеру.

Для этого удалите секрет, который используется для хранения токена:

kubectl --kubeconfig $VKCLOUD_KUBECONFIG delete secret example-token -n kube-system

Удалите неиспользуемые ресурсы

  1. Если созданные ресурсы Kubernetes вам больше не нужны, удалите их:

    kubectl --kubeconfig $VKCLOUD_KUBECONFIG \  delete clusterrolebinding example-bindingkubectl --kubeconfig $VKCLOUD_KUBECONFIG \  delete secret example-token -n kube-systemkubectl --kubeconfig $VKCLOUD_KUBECONFIG \  delete serviceaccount example-sa -n kube-system
  2. Работающий кластер Cloud Containers тарифицируется и потребляет вычислительные ресурсы. Если он вам больше не нужен: