指定kubeconfig时kubectl可查节点,无参数时连接被拒问题求助
问题分析:kubectl带--kubeconfig参数与不带参数执行结果不一致
问题描述
执行带指定配置文件的命令时:
sudo kubectl get node --kubeconfig /etc/kubernetes/admin.conf
能正常返回节点信息:
NAME STATUS ROLES AGE VERSION master NotReady control-plane 42m v1.26.1
但执行不带参数的命令时:
sudo kubectl get node
却出现连接拒绝错误:
E0126 08:58:10.293496 32223 memcache.go:238] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused E0126 08:58:10.294046 32223 memcache.go:238] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused E0126 08:58:10.295501 32223 memcache.go:238] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused E0126 08:58:10.297011 32223 memcache.go:238] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused E0126 08:58:10.298647 32223 memcache.go:238] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused The connection to the server localhost:8080 was refused - did you specify the right host or port?
已导出KUBECONFIG环境变量,且kubectl config view返回非空结果,为何两条命令执行结果不一致?
核心原因
sudo执行命令时不会默认继承当前用户的环境变量,包括你导出的KUBECONFIG:
- 直接执行
kubectl config view时,用的是当前用户身份,能读取到KUBECONFIG指向的配置文件; - 加上
sudo后切换到root身份,root的环境变量里没有KUBECONFIG,kubectl会默认读取/root/.kube/config,这个文件要么不存在,要么配置的是localhost:8080的无效连接,因此报错; - 而带
--kubeconfig参数时,直接指定了配置文件路径,跳过了环境变量和默认路径的读取逻辑,所以能正常执行。
解决办法
方式一:sudo执行时保留环境变量
用-E参数让sudo继承当前用户的环境变量:
sudo -E kubectl get node
方式二:给root配置默认kubeconfig
将有效配置文件复制到root的默认kubeconfig路径,并设置正确权限:
sudo mkdir -p /root/.kube sudo cp /etc/kubernetes/admin.conf /root/.kube/config sudo chmod 600 /root/.kube/config
之后直接执行sudo kubectl get node即可正常运行。
方式三:全局配置sudo保留KUBECONFIG
编辑/etc/sudoers文件(建议用visudo命令编辑,避免语法错误),添加一行:
Defaults env_keep += "KUBECONFIG"
这样所有sudo命令都会保留KUBECONFIG环境变量。
内容的提问来源于stack exchange,提问作者Ali Shehab
相关产品推荐
相关产品推荐

