问题描述
我想调用openshift机器api(/apis/machine.openshift.io/v1beta1/machines
)。是否可以使用kubernetes
python模块来执行此操作?我可以这样创建一个api对象:
>>> from kubernetes import client,config
>>> config.load_incluster_config()
>>> api = client.CoreV1API()
当然,这是一个核心API客户端,其中不包括对machine
API的本地支持。但是对象具有所有端点和身份验证信息。有一种看起来很api.api_client.call_api
的方法,但是它似乎没有利用api_client对象中嵌入的auth信息:
>>> api.api_client.call_api('/apis/machine.openshift.io/v1beta1/machines','GET')
[...]
kubernetes.client.rest.ApiException: (403)
Reason: Forbidden
我可以显式传递身份验证信息,但随后似乎未返回任何内容:
>>> >>> api.api_client.call_api('/apis/machine.openshift.io/v1beta1/machines','GET',auth_settings=api.api_client.configuration.auth_settings())
(None,200,HTTPHeaderDict({'Audit-Id': '6f6965b5-1ad7-4c5e-ab61-343e38718ff8','Cache-Control': 'no-cache,private','Content-Type': 'application/json','X-Kubernetes-Pf-Flowschema-Uid': '9
5848e47-b51c-46eb-aa4f-e25130d61e09','X-Kubernetes-Pf-Prioritylevel-Uid': '39391d77-7b32-4aa2-93c3-9915a302d361','Date': 'Fri,04 Sep 2020 19:43:59 GMT','transfer-encoding': 'chunked'}))
我当然可以使用requests
:
>>> requests.get(f'{api.api_client.configuration.host}/apis/machine.openshift.io/v1beta1/machines',verify=False,headers=api.api_client.configuration.api_key)
<Response [200]>
那很好,但是闻起来好像我在以错误的方式处理事情。使用Python kubernetes
模块发出任意API请求的正确方法是什么?
解决方法
从here开始引用,您可以通过传递有效的api_client.call_api
(可以是服务帐户令牌)来使用BearerToken
如下调用任意API。
api_client.call_api('/apis/machine.openshift.io/v1beta1/machines','GET',auth_settings = ['BearerToken'],response_type='json',_preload_content=False)