使用Python远程执行kubectl报localhost连接拒绝该如何解决
问题根因
- SSH调用
exec_command执行的是非交互式shell会话,不会默认加载远程用户的.bashrc、.profile等环境配置文件,kubeconfig的路径配置(默认存放在~/.kube/config)可能在这些配置文件中声明,导致kubectl无法读取配置,默认尝试连接本地8080端口的Kubernetes APIServer - 远程服务器上的kubeconfig文件未放在默认路径,或执行命令的用户没有该文件的读取权限
修复远程执行kubectl命令的方案
方案1:显式指定kubeconfig路径
先确认远程服务器上kubeconfig的实际存放路径,修改代码中执行的命令,显式传入配置路径:
command = 'kubectl get pod -n namespace --kubeconfig /path/to/remote/kubeconfig' stdin,stdout,stderr=ssh.exec_command(command)
将/path/to/remote/kubeconfig替换为远程服务器上kubeconfig的实际绝对路径,默认一般为/root/.kube/config或者对应用户家目录下的.kube/config
方案2:执行命令前先加载环境配置
在kubectl命令前增加加载用户环境配置的逻辑,避免手动指定配置路径:
# 远程用户使用bash的场景 command = 'source ~/.bashrc && kubectl get pod -n namespace' # 远程用户使用zsh的场景替换为 source ~/.zshrc stdin,stdout,stderr=ssh.exec_command(command)
验证提示:如果修改后仍报错,先手动登录远程服务器,执行对应kubectl命令验证是否正常,排查路径、权限类问题。
在Pod内部执行指令的方法
kubectl可以正常执行后,使用kubectl exec命令即可在指定Pod内部执行命令,示例如下:
# 单容器Pod执行单条命令示例:查看Pod内根目录文件 command = 'kubectl exec -n <替换为实际命名空间> <替换为实际Pod名称> -- ls /' # 单容器Pod执行多条命令示例:同时查看当前时间和磁盘占用 command = 'kubectl exec -n <替换为实际命名空间> <替换为实际Pod名称> -- bash -c "date && df -h"' # 多容器Pod需额外指定容器名称 command = 'kubectl exec -n <替换为实际命名空间> <替换为实际Pod名称> -c <替换为实际容器名称> -- <替换为实际要执行的命令>' stdin,stdout,stderr=ssh.exec_command(command)
内容的提问来源于stack exchange,提问作者Param
相关产品推荐
相关产品推荐

