Ubuntu20.04下Python Kubernetes客户端连接被拒,kubectl异常求助
环境
- Ubuntu 20.04 LTS
- Django应用中使用kubernetes-client/python库
- 集群环境为microk8s
问题现象
- 运行Kubernetes Python客户端代码(仅修改YAML文件路径)时,持续触发连接拒绝错误:
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='192.168.139.242', port=6443):
Max retries exceeded with /apis/apps/v1/namespaces/default/deployments
(Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fef64215430>:
Failed to establish a new connection: [Errno 111] Connection refused'))
错误发生在create_from_yaml函数调用处,已确认集群IP和端口正确。
- 终端执行
microk8s kubectl apply -f video_capturer.yaml可正常部署资源,但直接使用原生kubectl命令报错:
~$ kubectl get all
The connection to the server 192.168.139.242:6443 was refused -
did you specify the right host or port?
代码片段
from kubernetes import client, config, utils def main(): config.load_kube_config() k8s_client = client.ApiClient() yaml_file = 'video_capturer.yaml' utils.create_from_yaml(k8s_client, yaml_file, verbose=True) if __name__ == "__main__": main()
原因分析及解决办法
核心原因
原生kubectl和Python Kubernetes客户端默认读取~/.kube/config配置文件,但该文件与microk8s自带kubectl使用的配置不一致,导致连接失败:
- microk8s的kubectl使用内部专属配置(路径通常为
/var/snap/microk8s/current/credentials/client.config) - 用户目录下的
~/.kube/config要么不存在,要么配置的集群地址不可访问,或者权限不符合要求。
解决步骤
同步microk8s配置到默认路径
将microk8s的kubeconfig导出到用户默认配置位置:# 先备份原有配置(如有) cp ~/.kube/config ~/.kube/config.bak # 导出microk8s配置覆盖默认文件 microk8s config > ~/.kube/config修复配置文件权限
kubeconfig需要严格的权限设置(禁止其他用户读写),执行:chmod 600 ~/.kube/config验证配置有效性
执行原生kubectl命令测试连接:kubectl get all若能正常返回集群资源,再运行Python代码即可正常连接Kubernetes集群。
可选:临时指定配置路径
若不想覆盖默认配置,可在Python代码中直接指定microk8s的配置文件路径:config.load_kube_config(config_file='/var/snap/microk8s/current/credentials/client.config')或通过环境变量指定:
export KUBECONFIG=/var/snap/microk8s/current/credentials/client.config python your_script.py
内容的提问来源于stack exchange,提问作者Francisco

