为 Pinniped 和 Dex 配置和管理 TLS 证书

本主题介绍了如何在 Tanzu Kubernetes Grid 中为 Pinniped 和 Dex 配置自定义 TLS 证书。此外,还介绍了如何更新 Tanzu Kubernetes Grid 中的 Dex 证书。

配置自定义 TLS 证书

默认情况下,Tanzu Kubernetes Grid 使用自签名 Issuer 生成 TLS 证书,以保护流向 Pinniped 和 Dex 的 HTTPS 流量。部署管理集群后,您可以选择更新默认配置,如下所示:

  1. 设置自定义 ClusterIssuer 资源或您自己的 TLS 密钥。请参见下面的设置 ClusterIssuer 资源或 TLS 密钥
  2. 通过为管理集群重新部署 Pinniped 附加项密钥来更新 Pinniped 配置。请参见下面的更新 Pinniped 配置
注意

Tanzu Kubernetes Grid 仅为 LDAP 身份提供程序部署 Dex。如果在创建管理集群或将其配置为创建后步骤时配置 OIDC 身份提供程序,则不会部署 Dex。

设置 ClusterIssuer 资源或 TLS 密钥

如果要使用自定义 ClusterIssuer 资源生成 TLS 证书:

  1. 确认 cert-manager 正在管理集群中运行。默认情况下,此组件在所有管理集群中运行。
  2. 获取管理集群中现有的 ClusterIssuer 资源的名称。有关详细信息,请参见证书管理器文档中的颁发者配置
  3. 在管理集群的 Pinniped 附加项密钥的 values.yaml 部分的 custom_cluster_issuer 字段中指定 ClusterIssuer名称,然后应用更改。有关说明,请参见下面的更新 Pinniped 配置。完成本节中的步骤后,Dex 证书链的 Pinniped 将由 ClusterIssuer 签名。

如果要直接指定自己的 TLS 密钥:

  1. 检索 Pinniped 服务 pinniped-supervisor 的 IP 地址或 DNS 主机名,如果使用的是 LDAP 身份提供程序,则检索 Dex 服务 dexsvc 的 IP 地址或 DNS 主机名:

    • pinniped-supervisor 服务:

      • 如果服务类型设置为 LoadBalancer(具有负载均衡器的 vSphere ,例如,NSX Advanced Load Balancer、Amazon Web Services (AWS) 或 Azure),则通过运行以下命令检索服务的外部地址:

        kubectl get service pinniped-supervisor -n pinniped-supervisor
        
      • 如果服务类型设置为 NodePort(没有负载均衡器的 vSphere),则服务的 IP 地址与 vSphere 控制平面端点相同。要检索 IP 地址,您可以运行以下命令:

        kubectl get configmap cluster-info -n kube-public -o yaml
        
    • 仅 LDAPdexsvc 服务:

      • 如果服务类型设置为 LoadBalancer(具有负载均衡器的 vSphere ,例如,NSX Advanced Load Balancer、Amazon Web Services (AWS) 或 Azure),则通过运行以下命令检索服务的外部地址:

        kubectl get service dexsvc -n tanzu-system-auth
        
      • 如果服务类型设置为 NodePort(没有负载均衡器的 vSphere),则服务的 IP 地址与 vSphere 控制平面端点相同。要检索 IP 地址,您可以运行以下命令:

        kubectl get configmap cluster-info -n kube-public -o yaml
        
  2. 如果使用 OIDC 身份提供程序,请在 pinniped-supervisor 命名空间中创建 kubernetes.io/tls 密钥。如果您使用的是 LDAP 身份提供程序,请创建两个同名的 kubernetes.io/tls 秘钥,一个用于 pinniped-supervisor 命名空间中的 Pinniped 服务,另一个用于 tanzu-system-auth 命名空间中的 Dex 服务。要创建 TLS 密钥,请运行:

    kubectl create secret generic SECRET-NAME -n SECRET-NAMESPACE --type kubernetes.io/tls --from-file tls.crt=FILENAME-1.crt --from-file tls.key=FILENAME-2.pem --from-file ca.crt=FILENAME-3.pem
    

    按如下方式替换占位符文本:

    • SECRET-NAME 是为秘钥选择的名称。例如,my-secret
    • SECRET-NAMESPACE 是要在其中创建密钥的命名空间。这必须为 Pinniped 的 pinniped-supervisor 以及为 Dex 的 tanzu-system-auth
    • FILENAME-*tls.crttls.keyca.crt 的名称。在 Pinniped 的 TLS 密钥中指定的 TLS 证书必须包含上一步中的 Pinniped 服务的 IP 或 DNS 主机名。同样,Dex 的 TLS 证书必须包含您在上面检索到的 Dex 服务的 IP 地址或 DNS 主机名。ca.crt 字段为必填项并包含用于验证 TLS 证书的 CA 包。

    例如,Pinniped 的最终密钥类似于以下内容:

    apiVersion: v1
    kind: Secret
    metadata:
     name: my-secret
     namespace: pinniped-supervisor
    type: kubernetes.io/tls
    data:
     tls.crt: |       MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
     tls.key: |       MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
     ca.crt:  |       MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
    

    如果正确生成密钥,则使用 openssl x509 -in tls.crt -text 解码 tls.crt 会在“主体备用名称”字段中显示 IP 地址或 DNS 主机名。

  3. 在管理集群的 Pinniped 附加项密钥的 values.yaml 部分的 custom_tls_secret 字段中指定密钥名称,然后应用更改。有关说明,请参见下面的更新 Pinniped 配置

  4. 如果要为 Pinniped 服务配置 DNS 主机名,请在管理集群的 Pinniped 附加项密钥的 values.yaml 部分中的 pinniped.supervisor_svc_external_dns 字段内指定与 Pinniped 主管关联的 FQDN。请注意,pinniped.supervisor_svc_external_dns 的值必须以 https:// 开头。有关详细信息,请参见自动管理的软件包 values.yaml 设置。然后应用您的更改。有关说明,请参见下面的更新 Pinniped 配置。请注意,您必须为此主机名单独配置 DNS,例如,在 DNS 提供程序中创建 A 记录以解析为 Pinniped 主管服务的 IP 地址。此主机名必须在为 Pinniped 主管配置的 TLS 证书中作为主体备用名称列出。

更新 Pinniped 配置

要应用更改,请执行以下步骤更新 Pinniped 配置:

  1. 将管理集群的 Pinniped 加载项密钥保存到一个文件中,并在密钥的 values.yaml 部分中对 Base64 编码的字符串进行解码。

    kubectl get secret CLUSTER-NAME-pinniped-package -n tkg-system -o jsonpath="{.data.values\.yaml}" | base64 -d > FILENAME.yaml
    

    按如下方式替换占位符文本:

    • CLUSTER-NAME 是管理集群的名称。
    • FILENAME 是要用于密钥的文件名。例如,values.yaml
  2. 在解码文本中,请执行以下操作之一:

    • 如果准备了上面的 ClusterIssuer 资源,请在 custom_cluster_issuer 字段中指定资源的名称。例如:

      ---
      infrastructure_provider: vsphere
      tkg_cluster_role: management
      custom_cluster_issuer: "my-cluster-issuer-name"
      pinniped:
       cert_duration: 2160h
       cert_renew_before: 360h
       supervisor_svc_endpoint: https://10.168.217.220:31234
       supervisor_ca_bundle_data: LS0tLS1CRUdJTiBDRVJUSUZJQ0F……
      ...
      
    • 如果您在上面准备自己的 TLS 密钥,请在 custom_tls_secret 字段中指定密钥的名称。例如:

      ---
      infrastructure_provider: vsphere
      tkg_cluster_role: management
      custom_tls_secret: "my-tls-secret-name"
      pinniped:
       cert_duration: 2160h
       cert_renew_before: 360h
       supervisor_svc_endpoint: https://10.168.217.220:31234
       supervisor_ca_bundle_data: LS0tLS1CRUdJTiBDRVJUSUZJQ0F……
      ...
      

      如果配置 custom_tls_secret 字段,则会忽略 custom_cluster_issuer

      如果要为 Pinniped 服务配置 DNS 主机名,请在 pinniped.supervisor_svc_external_dns 字段中指定应用于 Pinniped 主管的 FQDN。例如,

      ...
      pinniped:
      cert_duration: 2160h
      cert_renew_before: 360h
      supervisor_svc_endpoint: https://0.0.0.0:31234
      supervisor_ca_bundle_data: ca_bundle_data_of_supervisor_svc
      supervisor_svc_external_ip: 0.0.0.0
      supervisor_svc_external_dns: https://pinniped.example.com
      ...
      
  3. 再次对 values.yaml 部分进行编码,并更新 Pinniped 加载项密钥。此命令因环境的操作系统而异:例如:

    Linux:

    kubectl patch secret CLUSTER-NAME-pinniped-package -n tkg-system -p "{\"data\":{\"values.yaml\":\"$(base64 -w 0 < values.yaml)\"}}" --type=merge
    

    MacOS:

    kubectl patch secret CLUSTER-NAME-pinniped-package -n tkg-system -p "{\"data\":{\"values.yaml\":\"$(base64 < values.yaml)\"}}" --type=merge
    
  4. 确认更改已成功应用:

    1. 获取 pinniped 应用的状态:

      kubectl get app CLUSTER-NAME-pinniped -n tkg-system
      

      如果返回的状态为“Reconcile failed(协调失败)”,请运行以下命令以获取有关失败的详细信息:

      kubectl get app CLUSTER-NAME-pinniped -n tkg-system -o yaml
      
    2. 通过运行 tanzu mc kubeconfig get --export-file ./KUBECONFIG-MC-CLUSTER-NAME 命令,生成管理集群的 kubeconfig 文件。然后,使用 kubeconfig 运行命令,如 kubectl get pods --kubeconfig ./KUBECONFIG-MC-CLUSTER-NAME。此外,如果您的管理集群管理任何工作负载集群,请针对每个现有集群运行 tanzu cluster kubeconfig get <WORKLOAD-CLUSTER-NAME> --export-file ./KUBECONFIG-WORKLOAD-CLUSTER-NAME,然后运行 kubectl get pods --kubeconfig ./KUBECONFIG-WORKLOAD-CLUSTER-NAME

更新 Dex 服务证书和 Dex CA 证书

在使用 LDAP 身份管理的集群中,您可能希望在以下情况下更新 Dex 证书:

  • Dex CA 证书已更新或已过期。
  • 与 Dex CA 关联的私钥已泄露。

必备条件

执行此过程之前,请确保您:

  • 为 Pinniped 附加项配置了 LDAP IDP。有关详细信息,请参见身份提供程序 - LDAP
  • 使用 kubectl get service dexsvc -n tanzu-system-auth 命令获取 Dex 服务的地址。

更新 Dex 服务证书

  1. 如果当前位于工作负载集群上下文中,请将 kubectl 上下文更改为管理集群。有关详细信息,请参见检索工作负载集群 kubeconfig

  2. 下载当前的 Dex 服务证书:

    openssl s_client -connect ADDRESS:PORT -showcerts </dev/null | openssl x509 -noout -text > /tmp/OLD-FILE.txt
    

    其中:

    • ADDRESS 是 Tanzu Kubernetes Grid 中的 Dex 服务地址。
    • OLD-FILE 是要保存服务证书文本文件的名称,例如,before.txt
  3. 删除当前 Dex 提供证书密钥,以便 cert-manager 重新创建该密钥:

    kubectl delete secret -n tanzu-system-auth  dex-cert-tls
    

    以下是输出示例:

    secret "dex-cert-tls" deleted
    
  4. 确认已创建新的 Dex 服务证书:

    kubectl get secret -n tanzu-system-auth
    

    以下是输出示例:

    $kubectl get secret -n tanzu-system-auth
    NAME                  TYPE                                  DATA   AGE
    default-token-cg8f2   kubernetes.io/service-account-token   3      6m5s
    dex-ca-key-pair       kubernetes.io/tls                     3      5m50s
    dex-cert-tls          kubernetes.io/tls                     3      2s
    dex-token-p96gl       kubernetes.io/service-account-token   3      6m3s
    
  5. 重新启动 Dex pod:

    kubectl delete pod -n tanzu-system-auth -l app=dex
    

    以下是输出示例:

    $ kubectl delete pod -n tanzu-system-auth -l app=dex
    pod DEX-POD deleted
    
  6. 下载新的 Dex 服务证书:

    openssl s_client -connect ADDRESS:PORT -showcerts </dev/null  | openssl x509 -noout -text > /tmp/NEW-FILE.txt
    

    其中:

    • ADDRESS 是 Tanzu Kubernetes Grid 中的 Dex 服务地址。
    • NEW-FILE 是要保存新服务证书文本文件的名称,例如,after.txt
  7. 比较旧证书和新证书以确保新证书已创建:

    diff /tmp/OLD-FILE /tmp/NEW-FILE
    

    其中:

    • OLD-FILE 是旧 Dex 服务证书的名称。
    • NEW-FILE 是新 Dex 服务证书的名称。

更新 Dex CA 证书

  1. 下载当前的 Dex CA 证书:

    kubectl get secret -n tanzu-system-auth dex-cert-tls -o jsonpath={.data.ca\\.crt} | base64 -d | openssl x509 -noout -text > /tmp/OLD-FILE.txt
    

    其中,OLD-FILE 是要保存服务证书文本文件的名称,例如,ca-before.txt

  2. 下载当前的 Dex 服务证书:

    openssl s_client -connect ADDRESS:PORT -showcerts </dev/null | openssl x509 -noout -text > /tmp/OLD-FILE.txt
    

    其中:

    • ADDRESS 是 Tanzu Kubernetes Grid 中的 Dex 服务地址。

    • OLD-FILE 是要保存服务证书文本文件的名称,例如,cert-before.txt

  3. 下载当前的 Dex CA 数据:

    kubectl get oidcidentityprovider upstream-oidc-identity-provider -n pinniped-supervisor -o jsonpath={.spec.tls.certificateAuthorityData} | base64 -d  | openssl x509 -noout -text > /tmp/OLD-FILE.txt
    

    其中,OLD-FILE 是要保存服务证书文本文件的名称,例如,ca-data-before.txt

  4. 删除 Dex CA 证书密钥,以便 cert-manager 重新创建该秘钥:

    kubectl delete secret -n tanzu-system-auth dex-ca-key-pair
    

    以下是输出示例:

    secret "dex-ca-key-pair" deleted
    
  5. 确认已创建新的 Dex CA 证书:

    kubectl get secret -n tanzu-system-auth
    

    以下是输出示例:

    $ kubectl get secret -n tanzu-system-auth
    NAME                  TYPE                                  DATA   AGE
    default-token-cg8f2   kubernetes.io/service-account-token   3      25m
    dex-ca-key-pair       kubernetes.io/tls                     3      18s
    dex-cert-tls          kubernetes.io/tls                     3      17s
    dex-token-p96gl       kubernetes.io/service-account-token   3      25m
    
    
  6. 删除当前 Dex 提供证书密钥,以便 cert-manager 重新创建该密钥:

    kubectl delete secret -n tanzu-system-auth  dex-cert-tls
    

    以下是输出示例:

    secret "dex-cert-tls" deleted
    
  7. 确认已创建新的 Dex 服务证书:

    kubectl get secret -n tanzu-system-auth
    

    以下是输出示例:

    kubectl get secret -n tanzu-system-auth
    NAME                  TYPE                                  DATA   AGE
    default-token-cg8f2   kubernetes.io/service-account-token   3      6m5s
    dex-ca-key-pair       kubernetes.io/tls                     3      5m50s
    dex-cert-tls          kubernetes.io/tls                     3      2s
    dex-token-p96gl       kubernetes.io/service-account-token   3      6m3s
    
  8. 删除 Pinniped 部署后作业:

    kubectl delete job -n pinniped-supervisor pinniped-post-deploy-job
    

    以下是输出示例:

    job.batch "pinniped-post-deploy-job" deleted
    
  9. 更新 Pinniped 附加项以快速同步更改,然后等待几分钟,以便附加项协调更改:

    kubectl patch app pinniped -n tkg-system -p '{"spec":{"syncPeriod":"30s"}}' --type merge
    
    kubectl wait app pinniped -n tkg-system --for condition=ReconcileSucceeded --timeout 5m
    
  10. 下载新的 Dex CA 证书:

    kubectl get secret -n tanzu-system-auth dex-cert-tls -o jsonpath={.data.ca\\.crt} | base64 -d | openssl x509 -noout -text > /tmp/NEW-FILE.txt
    

    其中,NEW-FILE 是要保存新 Dex CA 证书文本文件的名称,例如,ca-after.txt

  11. 下载新的 Dex 服务证书:

    openssl s_client -connect ADDRESS:PORT -showcerts </dev/null  | openssl x509 -noout -text > /tmp/NEW-FILE.txt
    

    其中:

    • ADDRESS 是 Tanzu Kubernetes Grid 中的 Dex 服务地址。
    • NEW-FILE 是要保存新 Dex 服务证书文本文件的名称,例如,after.txt

    • 下载新的 Dex CA 数据:

    kubectl get oidcidentityprovider upstream-oidc-identity-provider -n pinniped-supervisor -o jsonpath={.spec.tls.certificateAuthorityData} | base64 -d  | openssl x509 -noout -text > /tmp/NEW-FILE.txt
    

    其中,NEW-FILE 是要保存新 Dex CA 数据文本文件的名称,例如,ca-data-after.txt

  12. 比较旧 CA 证书和新 CA 证书,以确保已创建新的 CA 证书:

    diff /tmp/OLD-FILE /tmp/NEW-FILE
    

    其中:

    • OLD-FILE 是旧 Dex CA 证书的名称。
    • NEW-FILE 是旧 Dex CA 证书的名称。
  13. 比较旧服务证书和新服务证书,以确保已创建新服务证书:

    diff /tmp/OLD-FILE /tmp/NEW-FILE
    

    其中:

    • OLD-FILE 是旧 Dex 服务证书的名称。
    • NEW-FILE 是旧 Dex 服务证书的名称。
  14. 比较旧 CA 数据和新 CA 数据,以确保已创建新的 CA 数据:

    diff /tmp/OLD-FILE /tmp/NEW-FILE
    

    其中:

    • OLD-FILE 是旧 Dex CA 数据文件的名称。
    • NEW-FILE 是旧 Dex CA 数据文件的名称。
check-circle-line exclamation-circle-line close-line
Scroll to top icon