使用Kubernetes Python客户端加载kube配置报无效kube-config文件错误
问题根因
你遇到的报错是Kubernetes Python客户端的配置加载逻辑不匹配导致的:
config.load_kube_config()是用于加载本地kubeconfig配置文件(默认路径~/.kube/config)的方法,仅适用于本地开发、从集群外部访问Kubernetes的场景,运行在集群内的容器默认不存在这个配置文件,因此会抛出配置不存在的异常。- 容器内执行
kubectl get pods能正常返回结果,是因为Kubernetes会自动给绑定了ServiceAccount的Pod注入集群访问凭证到/var/run/secrets/kubernetes.io/serviceaccount/路径下,kubectl默认会优先读取该路径下的凭证访问集群,不需要依赖kubeconfig文件。
解决方法
修改kubernetes_service.py中配置加载的逻辑,优先尝试加载集群内凭证,加载失败时再回退到本地kubeconfig配置,兼容本地开发和集群内运行两种场景:
from kubernetes.client.rest import ApiException from kubernetes import client, config from exceptions.logs_not_found_exceptions import LogsNotFound import logging log = logging.getLogger("services/kubernetes_service.py") class KubernetesService: def __init__(self): super().__init__() # 优先加载集群内配置(容器运行场景) try: config.load_incluster_config() # 加载失败则回退到本地kubeconfig(本地开发场景) except config.config_exception.ConfigException: config.load_kube_config() self.api_instance = client.CoreV1Api() # 后续get_pods、get_logs方法无需修改,保持原有逻辑即可
额外校验点
你当前的ClusterRoleBinding配置中,ServiceAccount的namespace指定为ind-iv,需要确保你的pyhelper应用也部署在ind-iv命名空间下,否则ServiceAccount的权限绑定不会生效。如果需要部署到其他命名空间,修改ClusterRoleBinding中subjects字段下的namespace值为对应命名空间即可。
内容的提问来源于stack exchange,提问作者Lucas Scheepers
相关产品推荐
相关产品推荐

