我们将 kubernetes python 客户端(4.0.0)与 google 的 kubernetes 引擎(master + nodepools 运行 k8s 1.8.4)结合使用,以定期在 kubernetes 上调度工作负载。我们用于创建 pod、附加到日志并报告 pod 结束状态的脚本的简化版本如下所示:
config.load_kube_config(persist_config=False)
v1 = client.CoreV1Api()
v1.create_namespaced_pod(body=pod_specs_dict, namespace=args.namespace)
logging_response = v1.read_namespaced_pod_log(
name=pod_name,
namespace=args.namespace,
follow=True,
_preload_content=False
)
for line in logging_response:
line = line.rstrip()
logging.info(line)
status_response = v1.read_namespaced_pod_status(pod_name, namespace=args.namespace)
print("Pod ended in status: {}".format(status_response.status.phase))
一切正常,但是我们遇到了一些身份验证问题。身份验证通过默认的auth-provider 进行,为此我通过在调度程序上手动gcp
运行来获得初始访问令牌。kubectl container cluster get-credentials
在某些随机时间范围内,某些 API 调用会导致来自 API 服务器的 401 响应。我的猜测是,只要访问令牌过期,就会发生这种情况,并且脚本会尝试获取新的访问令牌。但是,调度程序上会同时运行多个脚本,导致多次获取新的 API 密钥,其中只有一个仍然有效。我尝试了多种方法来解决这个问题(使用persist_config=True
,重新加载配置后重试401,...)没有任何成功。由于我不完全了解 gcp 身份验证和 kubernetes python 客户端配置是如何工作的(两者的文档都相当稀缺),所以我有点不知所措。
我们应该使用另一种身份验证方法而不是gcp
auth-provider 吗?这是 kubernetes python 客户端中的错误吗?我们应该使用多个配置文件吗?