Не удалось подключиться к 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/
Я не совсем уверен, какая часть конфигурации мне не хватает. Я исследовал следующие ссылки:
https://kubernetes.io/docs/reference/access-authn-authz/authentication/
https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/
Но без удачи. Думаю, мне нужно либо сообщить клиенту, какой токен / 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, что затрудняет мне дать вам лучший ответ, чем мое предположение выше;-)
Но я надеюсь, что это поможет!