Kubectl可正常使用的kubeconfig在Python Kubernetes SDK中加载后授权失败
这种kubectl能正常工作但Python SDK却报授权失败的情况确实挺让人头疼的,我帮你梳理几个最可能的原因和调试方向,你可以一步步排查:
1. 优先检查exec命令的路径问题
你的kubeconfig里用的是相对路径./mycustom_token_generator_cmd,kubectl是在你执行命令的当前工作目录下找这个工具,但Python脚本的工作目录可能和你运行kubectl的目录不一样(比如你在~/work下跑kubectl,但Python脚本是在~/scripts下执行的),导致SDK找不到这个token生成工具。
解决办法:把kubeconfig里的command改成绝对路径,比如:
command: /home/your-user/path/to/mycustom_token_generator_cmd
2. 确认Python Kubernetes SDK版本兼容
你的exec认证用的API版本是client.authentication.k8s.io/v1beta1,如果你的Python SDK版本太老,可能对这个版本的exec认证支持有问题。
解决办法:
- 先检查当前SDK版本:
pip show kubernetes - 如果版本低于25.x,建议升级到最新稳定版:
pip install --upgrade kubernetes
3. 验证token生成命令的输出是否符合要求
kubectl能正确解析exec命令的输出,但Python SDK对输出格式的要求可能更严格。你可以手动执行这个token生成命令,看返回的JSON是否符合Kubernetes exec认证的规范:
./mycustom_token_generator_cmd token_gen_args
正常的输出应该是类似这样的结构:
{ "apiVersion": "client.authentication.k8s.io/v1beta1", "kind": "ExecCredential", "status": { "token": "eyJhbGciOiJSUzI1NiIsImtpZCI6..." } }
如果输出格式不对,SDK就无法正确提取token,导致授权失败。
4. 检查执行上下文的权限和环境变量
Python脚本的运行用户和你执行kubectl的用户是否一致?比如你用普通用户跑kubectl,但Python脚本是用root或者其他用户执行的,可能没有权限访问token生成工具,或者缺少必要的环境变量(比如工具依赖的环境变量在Python进程里没设置)。
调试方法:在Python脚本里打印当前工作目录和环境变量,看看和kubectl的执行环境是否一致:
import os print("Current working directory:", os.getcwd()) print("Environment variables:", os.environ)
5. 开启更详细的日志排查
只设置config.debug = True可能不够,你可以开启Python的全局日志,查看SDK执行exec命令的详细过程,比如有没有调用命令、命令的输出是什么、有没有报错:
import os import logging from kubernetes import client, config # 开启DEBUG级别的日志 logging.basicConfig(level=logging.DEBUG) HOME_DIR = os.path.expanduser("~") config.load_kube_config( config_file=HOME_DIR + "/.kube/myk8sconfig.yaml", context="mycluster-context" ) v1 = client.CoreV1Api() try: ret = v1.list_pod_for_all_namespaces(watch=False) print("Success! Found", len(ret.items), "pods") except Exception as e: print(f"Error details: {e}")
从日志里你能看到SDK是否执行了exec命令,以及命令的返回结果,这能帮你快速定位问题。
备注:内容来源于stack exchange,提问作者Valmik Roy

