Не удалось подключиться к kubectl из client-go - /serviceaccount/token: такого файла нет

Я использую golang lib client-go для подключения к работающему локальному кубренцу. Для начала я взял код из примера: out-of-cluster-client-configuration.

Выполнение кода как это:$ KUBERNETES_SERVICE_HOST=localhost KUBERNETES_SERVICE_PORT=6443 go run ./main.go приводит к следующей ошибке:

panic: open /var/run/secrets/kubernetes.io/serviceaccount/token: no such file or directory

goroutine 1 [running]:

/var/run/secrets/kubernetes.io/serviceaccount/

Я не совсем уверен, какая часть конфигурации мне не хватает. Я исследовал следующие ссылки:

Но без удачи. Думаю, мне нужно либо сообщить клиенту, какой токен / serviceAccount использовать, либо настроить kubectl таким образом, чтобы каждый мог подключиться к его API.

Вот состояние моего kubectl, хотя результаты некоторых команд:

$ kubectl config view

apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://localhost:6443
  name: docker-for-desktop-cluster
contexts:
- context:
    cluster: docker-for-desktop-cluster
    user: docker-for-desktop
  name: docker-for-desktop
current-context: docker-for-desktop
kind: Config
preferences: {}
users:
- name: docker-for-desktop
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

$ kubectl get serviceAccounts

NAME        SECRETS   AGE
default     1         3d
test-user   1         1d

$ kubectl описывает сервис-аккаунт тест-пользователя

Name:                test-user
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   test-user-token-hxcsk
Tokens:              test-user-token-hxcsk
Events:              <none>

$ kubectl get secret test-user-token-hxcsk -o yaml

apiVersion: v1
data:
  ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0......=
  namespace: ZGVmYXVsdA==
  token: ZXlKaGJHY2lPaUpTVXpJMU5pSX......=
kind: Secret
metadata:
  annotations:
    kubernetes.io/service-account.name: test-user
    kubernetes.io/service-account.uid: 984b359a-6bd3-11e8-8600-XXXXXXX
  creationTimestamp: 2018-06-09T10:55:17Z
  name: test-user-token-hxcsk
  namespace: default
  resourceVersion: "110618"
  selfLink: /api/v1/namespaces/default/secrets/test-user-token-hxcsk
  uid: 98550de5-6bd3-11e8-8600-XXXXXX
type: kubernetes.io/service-account-token

2 ответа

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

TL;DR

Следующая ошибка:

      panic: open /var/run/secrets/kubernetes.io/serviceaccount/token: no such file or directory

скорее всего связано с отсутствием tokenна месте при использовании. Также это может быть связано с фактом использования in-cluster-client-configurationкод вне кластера (например, запуск этого кода непосредственно на ноутбуке или в чистом контейнере Docker).

Вы можете проверить следующие команды для дальнейшего устранения вашей проблемы (при условии, что этот код работает внутри):

  • $ kubectl get serviceaccount X -o yaml:
    • Ищу:
    • Ищу: containers.mountsа также volumeMountsкуда Secretустановлен

Ссылаясь на официальную документацию:

Аутентификация внутри кластера

В этом примере показано, как настроить клиент с помощью client-go для аутентификации в Kubernetes API из приложения, работающего внутри кластера Kubernetes.

client-go использует токен служебной учетной записи , установленный внутри модуля в /var/run/secrets/kubernetes.io/serviceaccountпуть, когда rest.InClusterConfig()используется.

-- Github.com: Kubernetes: client-go: Примеры: в конфигурации клиента кластера

Если вы выполняете аутентификацию в Kubernetes API с помощью ~/.kube/configвы должны использовать out-of-cluster-client-configuration.


Дополнительная информация:

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

  • automountServiceAccountToken: false

В версии 1.6+ вы можете отказаться от автоматического подключения учетных данных API для учетной записи службы, установив automountServiceAccountToken: false в учетной записи службы:

       apiVersion: v1
kind: ServiceAccount
metadata:
  name: go-serviceaccount
automountServiceAccountToken: false

В версии 1.6+ вы также можете отказаться от автомонтирования учетных данных API для определенного модуля:

       apiVersion: v1
kind: Pod
metadata:
  name: sdk
spec:
 serviceAccountName: go-serviceaccount
 automountServiceAccountToken: false

-- Kubernetes.io: Документы: Задачи: Настройка контейнера pod: Настройка служебной учетной записи

  • $ kubectl describe pod XYZ:

Когда servicAccountтокен смонтирован, Podопределение должно выглядеть так:

      <-- OMITTED --> 
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from go-serviceaccount-token-4rst8 (ro)
<-- OMITTED --> 
Volumes:
  go-serviceaccount-token-4rst8:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  go-serviceaccount-token-4rst8
    Optional:    false

Если это не так:

      <-- OMITTED --> 
    Mounts:         <none>
<-- OMITTED --> 
Volumes:            <none>

Дополнительные ресурсы:

Просто чтобы прояснить это, на случай, если это поможет вам в дальнейшей отладке: проблема не имеет ничего общего с Go или вашим кодом, и все, что связано с тем, что узел Kubernetes не может получить токен от мастера Kubernetes.

В kubectl config view, clusters.cluster.server вероятно, должен указывать на IP-адрес, который может достичь узел.
Он должен получить доступ к ЦС, то есть к мастеру, чтобы предоставить этот токен, и я полагаю, что по этой причине он не работает.
kubectl describe <your_pod_name> вероятно, скажет вам, в чем проблема получения токена.

Поскольку вы предполагали, что проблема связана с Go/ вашим кодом, и сосредоточились на этом, вы забыли предоставить больше информации о вашей настройке Kubernetes, что затрудняет мне дать вам лучший ответ, чем мое предположение выше;-)

Но я надеюсь, что это поможет!

Другие вопросы по тегам