Python脚本执行kubectl命令报错,但手动执行正常求助
问题详情
在Python中执行以下代码调用kubectl命令:
process = subprocess.run(["kubectl", "get", "pods", "-n", "argocd"])
执行后抛出连接拒绝错误:
E0328 08:18:04.126243 25976 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0328 08:18:04.126801 25976 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0328 08:18:04.129854 25976 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0328 08:18:04.130344 25976 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0328 08:18:04.131804 25976 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
The connection to the server localhost:8080 was refused - did you specify the right host or port?
main - ERROR - Failed to get po.
NoneType: None
但在主节点手动执行相同命令时能正常输出结果。
问题原因
手动执行正常但Python调用失败,核心是subprocess启动的kubectl进程没有获取到正确的集群配置:
- 要么Python进程运行的用户和手动执行kubectl的用户不一致,缺少对应的kubeconfig文件
- 要么Python进程的环境变量中没有
KUBECONFIG配置,导致kubectl默认尝试连接localhost:8080
解决办法
1. 显式指定kubeconfig路径
直接在调用kubectl时指定配置文件路径,两种方式任选:
方式一:通过环境变量传递
import subprocess import os # 复制当前环境变量并添加KUBECONFIG配置 env = os.environ.copy() # 替换为你的kubeconfig实际路径,比如主节点用户的~/.kube/config env["KUBECONFIG"] = "/root/.kube/config" # 执行命令,同时捕获输出方便排查 process = subprocess.run( ["kubectl", "get", "pods", "-n", "argocd"], env=env, capture_output=True, text=True ) # 打印结果和错误信息 print("输出结果:", process.stdout) print("错误信息:", process.stderr)
方式二:通过kubectl命令参数指定
import subprocess process = subprocess.run( ["kubectl", "get", "pods", "-n", "argocd", "--kubeconfig=/root/.kube/config"], capture_output=True, text=True ) print("输出结果:", process.stdout) print("错误信息:", process.stderr)
2. 统一运行用户权限
如果Python脚本是用其他用户运行的(比如nginx、www-data),需要给该用户配置kubeconfig:
- 复制主节点用户的
.kube/config到目标用户的家目录:cp /root/.kube/config /home/目标用户名/.kube/config - 修改文件权限,确保目标用户能读取:
chown 目标用户名:目标用户名 /home/目标用户名/.kube/config chmod 600 /home/目标用户名/.kube/config
3. 检查进程环境变量
如果Python脚本是通过systemd等服务启动的,默认环境变量会被清空,必须在服务配置中添加KUBECONFIG环境变量,或者在代码中显式传递完整环境。
内容的提问来源于stack exchange,提问作者Vijaya Shree

