Получение Service Account Token

Service Account Token — один из способов авторизации в Kubernetes API, альтернатива Static Token File и клиентским сертификатам.

Для получения токена необходимо создать сервис-аккаунт (ServiceAccount) и связать его с кластерной ролью. Каждый созданный сервис-аккаунт будет иметь токен, хранящийся в Kubernetes API-секрете.

Чтобы получить Service Account Token:

  1. Создайте ServiceAccount:

    kubectl -n kube-system create serviceaccount <service-account-name>
  2. Создайте ClusterRoleBinding и добавьте роль с правами администратора (cluster-admin):

    kubectl create clusterrolebinding <clusterrolebinding-name> --clusterrole=cluster-admin --serviceaccount=kube-system:<service-account-name>
  3. Получите имя секрета созданного ServiceAccount, в котором хранится токен:

    export TOKENNAME=$(kubectl -n kube-system get serviceaccount/<service-account-name> -o jsonpath='{.secrets[0].name}')
  4. Получите токен из секрета в base64, декодируйте и добавьте в переменную окружения TOKEN:

    export TOKEN=$(kubectl -n kube-system get secret $TOKENNAME -o jsonpath='{.data.token}' | base64 --decode)
  5. Проверьте работоспособность токена, сделайте запрос в Kubernetes API с токеном в заголовке "Authorization: Bearer <TOKEN-HERE>":

    curl -k -H "Authorization: Bearer $TOKEN" -X GET "https://<KUBE-API-IP>:6443/api/v1/nodes" | json_pp
  6. Добавьте сервис-аккаунт в kubeconfig:

    kubectl config set-credentials <service-account-name> --token=$TOKEN
  7. Переключите контекст:

    kubectl config set-context --current --user=<service-account-name>
  8. Проверьте работоспособность:

    kubectl get no                                                                                                      
    NAME                  STATUS   ROLES    AGE   VERSION
    test-psp-node-tv9rb   Ready    <none>   33d   v1.16.9

Обновленный kubeconfig будет находиться в домашней директории $HOME/.kube/config