【问题标题】:Using ansible k8s module: how to authenticate with certificates使用 ansible k8s 模块:如何使用证书进行身份验证
【发布时间】:2023-03-24 02:59:01
【问题描述】:

我正在努力部署下面的剧本(向 Openshift 3.11 集群添加命名空间):

---
- hosts: kubernetesmastergfm
  gather_facts: false
  vars:
   name_namespace: testingnamespace
  tasks:
   - name: Create a k8s namespace
     k8s:
      host: "https://{{ cluster.endpoint }}"
      ca_cert: "/etc/origin/master/ca.crt" <--WHERE IS THIS IN OPENSHIFT 3.11?
      api_key: "/etc/origin/master/admin.key"<--WHERE IS THIS IN OPENSHIFT 3.11?
      validate_certs: no
      name: pippo
      api_version: v1
      kind: Namespace
      state: present
      
      

我收到了错误:

      ...
kubernetes.client.rest.ApiException: (401)
Reason: Unauthorized
HTTP response headers: HTTPHeaderDict({'Date': 'Tue, 16 Feb 2021 16:05:03 GMT', 'Content-Length': '129', 'Content-Type': 'application/json', 'Cache-Control': 'no-store'})
HTTP response body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"Unauthorized","reason":"Unauthorized","code":401}

我怀疑以下路径中的证书有误: /etc/origin/master/ca.crt /etc/origin/master/admin.key

欢迎提出任何建议。 吉安·菲利波

【问题讨论】:

    标签: kubernetes ansible


    【解决方案1】:

    api_key 参数是ServiceAccount 令牌的值。 我认为您应该将此令牌直接粘贴为api_key 参数值,因为使用令牌提供文件的路径似乎不起作用。

    我将通过一个简单的例子来描述所需的步骤来说明它是如何工作的。

    要查找与特定 ServiceAccount 关联的令牌名称,您可以使用:

    ###  kubectl describe sa <SERVICE ACCOUNT NAME> | grep "Token"
    
    # kubectl describe sa namespace-creator | grep "Token"
    Tokens:              namespace-creator-token-hs6zn
    

    然后显示这个token的值:

    ### kubectl describe secret <TOKEN NAME> | grep "token:" 
    
    # kubectl describe secret namespace-creator-token-hs6zn | grep "token:"
    token:      ey(...)3Q
    

    最后将此令牌值作为api_key参数值传递:

    ---
    ...
      tasks:
       - name: Create a k8s namespace
         community.kubernetes.k8s:
          ...
          api_key: "ey(...)3Q"
          validate_certs: no
          ...
    

    要了解 CA 证书的位置,您可以查看 API 服务器的 --client-ca-file 参数,例如:

    # kubectl describe pod kube-apiserver-master -n kube-system | grep "client-ca-file"
          --client-ca-file=/etc/kubernetes/ssl/ca.crt
      
    

    注意:如果您使用的是validate_certs: no,则无需提供ca_cert 参数。

    此外,如果您想要代替 api_key,您可以使用 kubeconfig 和现有 Kubernetes 配置文件的路径。

    【讨论】:

      【解决方案2】:

      最后,我发现了另一种通过使用 k8s_auth 而不是 k8s 对 API (Openshift) 进行身份验证的方法。 剧本应如下所示:

      - hosts: localhost
        module_defaults:
          group/k8s:
            host: https://openshift-url:8443
            ca_cert: /etc/origin/master/ca.crt <<===THIS IS THE RIGHT PATH FOR OCP 3.11
        tasks:
           - name: Log in (obtain access token)
             k8s_auth:
                username: xxxx
                password: yyyy
             register: k8s_auth_results
      
      

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 1970-01-01
        • 2017-06-08
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 2018-11-26
        • 2014-08-23
        • 2012-04-24
        相关资源
        最近更新 更多