无法从客户端go-/serviceaccount/token连接到kubectl:没有这样的文件

无法从客户端go-/serviceaccount/token连接到kubectl:没有这样的文件,go,kubernetes,kubectl,client-go,Go,Kubernetes,Kubectl,Client Go,我正在使用golang lib连接到正在运行的本地kubrenets。首先,我从示例中获取代码: 运行如下代码: $KUBERNETES\u SERVICE\u HOST=localhost KUBERNETES\u SERVICE\u PORT=6443 go run./main.go导致以下错误: panic: open /var/run/secrets/kubernetes.io/serviceaccount/token: no such file or directory gorout

我正在使用golang lib连接到正在运行的本地kubrenets。首先,我从示例中获取代码:

运行如下代码:
$KUBERNETES\u SERVICE\u HOST=localhost KUBERNETES\u SERVICE\u 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>

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

kubectl配置视图中
clusters.cluster.server
可能应该指向节点可以访问的IP地址。
它需要访问CA,即主机,才能提供该令牌,我猜它因此无法访问。
kubectl description
可能会告诉您获取令牌的问题

由于您假设问题是Go/your code,并将重点放在这一点上,因此您忽略了提供有关Kubernetes设置的更多信息,这使得我很难给您提供比上述猜测更好的答案;-)


但我希望这会有帮助

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

TL;DR

出现以下错误:

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

goroutine 1 [running]:

/var/run/secrets/kubernetes.io/serviceaccount/
panic:open/var/run/secrets/kubernetes.io/servicecomport/token:没有这样的文件或目录
在群集客户端配置中使用
时,很可能与
/var/run/secrets/kubernetes.io/serviceaccount
位置中缺少
令牌有关。此外,这可能与在集群客户机配置中使用集群外的代码有关(例如,直接在笔记本电脑或纯Docker容器中运行此代码)

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

  • $kubectl获得服务帐户X-o yaml
    • 查找:
      automountServiceAccountToken:false
  • $kubectl描述pod XYZ
    • 查找:
      containers.mounts
      volumeMounts
      安装了
      Secret
      的位置
引用官方文件:

在集群内进行身份验证 此示例演示如何配置客户端,让客户端通过Kubernetes群集内运行的应用程序对Kubernetes API进行身份验证。

当使用
rest.InClusterConfig()
时,客户机go在
/var/run/secrets/kubernetes.io/serviceCount
路径中使用安装在Pod内部的

--

如果使用
~/.kube/config
对Kubernetes API进行身份验证,则应使用
集群外客户端配置


其他信息: 我已经添加了更多信息,以供在
Pod
内运行代码时进一步排除故障时参考

  • automountServiceAccountToken:false
在版本1.6+中,您可以通过在服务帐户上设置automountServiceAccountToken:false来选择退出服务帐户的自动装载API凭据:

apiVersion:v1 种类:服务帐户 元数据: 姓名:go服务帐户 automountServiceAccountToken:false
在版本1.6+中,您还可以选择退出特定pod的自动装载API凭据:

apiVersion:v1 种类:豆荚 元数据: 名称:sdk 规格: serviceAccountName:转到serviceaccount automountServiceAccountToken:false
--

  • $kubectl描述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

挂载:
/var/run/secrets/kubernetes.io/serviceaccount来自go-serviceaccount-token-4rst8(ro)
卷数:
go-serviceaccount-token-4rst8:
类型:Secret(由Secret填充的卷)
SecretName:go-servicecount-token-4rst8
可选:false
如果不是:

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

挂载:
卷数:

额外资源:


你能调用
go run./main.go--kubeconfig/path/to/your/kubeconfig/file
并告诉结果吗。我应该把什么放在配置文件中?“kubectl配置视图”的输出?我尝试了以下操作:
$kubectl config view>kubeconfig
,然后
KUBERNETES\u SERVICE\u HOST=localhost KUBERNETES\u SERVICE\u PORT=6443运行/main.go--kubeconfig./kubeconfig
并出现相同的错误:
panic:open/var/run/secrets/KUBERNETES.io/servicecomport/token:没有这样的文件或目录
尝试在没有环境变量的情况下准确执行该命令。@NickRak抱歉更正:我正在运行这个示例-
在集群内进行身份验证-
-引用-这是一个失败并出错的示例。示例
集群外客户机配置
-对我来说很好