Kubernetes python客户端:身份验证问题

kre*_*lst 6 kubernetes google-kubernetes-engine kubernetes-python-client

我们正在使用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))
Run Code Online (Sandbox Code Playgroud)

一切都很好,但是我们遇到了一些身份验证问题.身份验证通过默认的gcp身份验证提供程序进行,我通过kubectl container cluster get-credentials在调度程序上手动运行来获取初始访问令牌.在某些随机时间范围内,某些API调用会导致API服务器发出401响应.我的猜测是,只要访问令牌过期,脚本就会尝试获取新的访问令牌.但是,在调度程序上并发运行多个脚本,导致多次获取新的API密钥,其中只有一个仍然有效.我尝试了多种方法来解决问题(使用persist_config=True,重新加载配置后重试401,...)没有任何成功.由于我不完全清楚gcp身份验证和kubernetes python客户端配置是如何工作的(并且两者的文档都相当稀缺),所以我有点不知所措.

我们应该使用其他身份验证方法而不是gcpauth-provider吗?这是kubernetes python客户端中的错误吗?我们应该使用多个配置文件吗?

kre*_*lst 15

最后,我们通过使用承载令牌身份验证解决了这个问题,而不是依赖于默认的gcloud身份验证方法.

以下是我为实现这一目标所采取的措施.

首先,通过创建具有以下内容的文件,在所需的命名空间中创建服务帐户.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: <name_of_service_account>
Run Code Online (Sandbox Code Playgroud)

然后使用此文件创建服务帐户

kubectl create -f <path_to_file> --namespace=<namespace_name>
Run Code Online (Sandbox Code Playgroud)

每个服务帐户都有一个链接到它的承载令牌,可用于身份验证.此承载令牌将作为机密自动挂载到命名空间中.要找出此令牌是什么,首先找到秘密的名称(是表单的<service_account_name>-token-<random_string>名称),然后使用该名称来获取内容.

# To search for out service account's token name
kubectl get secrets --namespace=<namespace_name>

# To find the token name
kubectl describe secret/<secret_name>
Run Code Online (Sandbox Code Playgroud)

在此之后,您应该找到API服务器的IP地址,以及kubernetes集群的集群CA证书.这可以通过访问谷歌云控制台上的kubernetes引擎详细信息页面来完成.将证书的内容复制到本地文件中.

您现在可以使用持有者令牌通过kubernetes python客户端进行身份验证,如下所示:

from kubernetes import client

configuration = client.Configuration()
configuration.api_key["authorization"] = '<bearer_token>'
configuration.api_key_prefix['authorization'] = 'Bearer'
configuration.host = 'https://<ip_of_api_server>'
configuration.ssl_ca_cert = '<path_to_cluster_ca_certificate>'

v1 = client.CoreV1Api(client.ApiClient(configuration))
Run Code Online (Sandbox Code Playgroud)


spo*_*wer 7

我有一个使用 Kubernetes 客户端的 python 容器,并且正在寻找一种在集群中执行时让它使用服务帐户的方法,但在本地执行时加载一个挂载的 kube 配置。找了好久才找到load_incluster_config(),在集群中执行的时候会根据容器的service account自动配置。我现在在本地运行时打开 env var。这可能对您有帮助:

https://github.com/kubernetes-client/python/blob/master/examples/in_cluster_config.py