5

我正在使用 golang lib client-go连接到正在运行的本地 kubrenets。首先,我从示例中获取代码: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/

我不太确定我缺少配置的哪一部分。我研究了以下链接:

但没有运气。我想我需要让客户端知道要使用哪个令牌/服务帐户,或者以每个人都可以连接到它的 api 的方式配置 kubectl。

这是我的 kubectl 的状态,虽然有一些命令结果:

$ kubectl 配置视图

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 获取服务帐户

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

$ kubectl 描述 serviceaccount 测试用户

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 获取秘密 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
4

2 回答 2

1

这个答案可能有点过时,但我会尝试为未来遇到相同/类似问题的读者提供更多视角/基线。

TL;博士

以下错误:

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

很可能与使用时缺少位置token有关。此外,它可能与使用集群外部代码的事实有关(例如,直接在笔记本电脑上或在纯 Docker 容器中运行此代码)。/var/run/secrets/kubernetes.io/serviceaccountin-cluster-client-configurationin-cluster-client-configuration

您可以检查以下命令以进一步解决您的问题(假设此代码在 a 中运行Pod):

  • $ kubectl get serviceaccount X -o yaml
    • 寻找:automountServiceAccountToken: false
  • $ kubectl describe pod XYZ
    • 寻找:containers.mounts以及安装volumeMounts在哪里Secret

引用官方文档:

在集群内进行身份验证

此示例向您展示如何使用 client-go 配置客户端,以从Kubernetes 集群内运行的应用程序向 Kubernetes API 进行身份验证。

client-go 在使用时使用挂载在Pod 内的Service Account 令牌/var/run/secrets/kubernetes.io/serviceaccountrest.InClusterConfig()

-- Github.com:Kubernetes:client-go:示例:在集群客户端配置中

如果您使用 Kubernetes API 进行身份验证,则~/.kube/config应该使用out-of-cluster-client-configuration.


附加信息:

当代码在Pod.

  • automountServiceAccountToken: false

在 1.6+ 版本中,您可以通过在服务帐户上设置 automountServiceAccountToken: false 来选择不为服务帐户自动挂载 API 凭据:

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

在 1.6+ 版本中,您还可以选择不为特定 pod 自动挂载 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>

其他资源:

于 2021-03-29T10:42:31.217 回答
0

只是说清楚,以防它帮助您进一步调试它:问题与 Go 或您的代码无关,而与 Kubernetes 节点无法从 Kubernetes 主节点获取令牌有关。

kubectl config view中,clusters.cluster.server应该可能指向节点可以到达的 IP 地址。
它需要访问 CA,即主服务器,才能提供该令牌,我猜它因此而失败。
kubectl describe <your_pod_name>可能会告诉您获取令牌的问题所在。

由于您认为问题出在 Go/您的代码上并专注于该问题,因此您忽略了提供有关 Kubernetes 设置的更多信息,这使我更难为您提供比我上面的猜测更好的答案 ;-)

但我希望它有所帮助!

于 2018-09-25T14:30:33.607 回答