【问题标题】:Having problem in authenticating kubernetes python client在验证 kubernetes python 客户端时遇到问题
【发布时间】:2019-07-23 19:53:30
【问题描述】:

我的 lisNamespaces.py 文件

from __future__ import print_function
import time
import kubernetes.client
from kubernetes.client.rest import ApiException

configuration = kubernetes.client.Configuration()
configuration.ssl_ca_cert = 'LS0XXXXXXXXXS0tLQo='
configuration.api_key['authorization'] = 'ZXXXXXXXXXXdw=='
configuration.api_key_prefix['authorization'] = 'Bearer'
configuration.host = 'https://aaaaaaaaaaaaaaa.gr7.us-east-1.eks.amazonaws.com'
#configuration.verify_ssl = False


api_instance = kubernetes.client.CoreV1Api(kubernetes.client.ApiClient(configuration))
api_response = api_instance.list_namespace()
for i in api_response.items:
    print(i.metadata.name)

对于 ssl_ca_cert 值,我做了kubectl edit secret nameofsa-token-xyze -n default 并使用了 ca.crt 值。用户具有集群级别的管理员权限

对于不记名令牌,我使用了相同的用户令牌。

如果我通过设置 configuration.verify_ssl = False 禁用 ssl 验证,我的代码可以正常工作,但会出现警告。

我想知道我在传递 ssl_ca_cert 时犯了什么错误。请帮我解决这个问题。

【问题讨论】:

    标签: kubernetes ssl-client-authentication kubernetes-python-client


    【解决方案1】:

    我犯的错误是将我从kubectl edit secret nameofsa-token-xyze -n default得到的ca.crt的数据直接传递给代码中的configuration.ssl_ca_cert

    应该做的是使用我从上面的命令(kubectl edit secret nameofsa-token-xyze -n default)获得的base64 --decode 解码数据,这就是我的做法。

    kubectl get secrets default-token-nqkdv -n default -o jsonpath='{.data.ca\.crt}' | base64 --decode > ca.crt.

    然后我需要在代码中传递ca.crt文件的路径,所以最终代码如下所示

    from __future__ import print_function
    import time
    import kubernetes.client
    from kubernetes.client.rest import ApiException
    
    configuration = kubernetes.client.Configuration()
    configuration.ssl_ca_cert = 'ca.crt'
    configuration.api_key['authorization'] = 'ZXXXXXXXXXXdw=='
    configuration.api_key_prefix['authorization'] = 'Bearer'
    configuration.host = 'https://aaaaaaaaaaaaaaa.gr7.us-east-1.eks.amazonaws.com'
    
    api_instance = kubernetes.client.CoreV1Api(kubernetes.client.ApiClient(configuration))
    api_response = api_instance.list_namespace()
    for i in api_response.items:
        print(i.metadata.name)
    

    【讨论】:

      【解决方案2】:

      您可以使用基本请求测试令牌:

      import requests
      
      with open('/path/to/token', 'r') as token_file:
          token=token_file.read()
      
      url = 'https://my-kubernetes-cluster'
      
      headers = {"Authorization":"Bearer "+token}
      
      r = requests.get(url, verify='/path/to/ca_chain.crt', headers=headers)
      
      for line in r.iter_lines():
          print line
      

      如果请求通过,您可以测试此代码:

      from kubernetes import client
      from kubernetes.client import Configuration, ApiClient
      config = Configuration()
      config.api_key = {'authorization': 'Bearer <api_key>'}
      config.host = 'https://my-kubernetes-cluster'
      config.ssl_ca_cert = "/path/to/ca_chain.crt"
      
      api_client = ApiClient(configuration=config)
      v1 = client.CoreV1Api(api_client)
      
      v1.list_pod_for_all_namespaces(watch=False)
      

      尝试告诉我它是否适合您。

      【讨论】:

      • 问题已解决,我需要将该 ca.crt 数据解码为 base64 --decode 并将其保存到 ca.crt 文件,然后我需要在 @ 处使用该路径987654323@
      • 请查看我的答案以获取详细说明,感谢您的努力。
      猜你喜欢
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多