为 Pinniped 配置和管理 TLS 证书

本主题介绍了如何在 Tanzu Kubernetes Grid 中为 Pinniped 配置自定义 TLS 证书。

配置自定义 TLS 证书

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

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

设置 ClusterIssuer 资源或 TLS 密钥

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

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

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

  1. 检索 Pinniped 服务 pinniped-supervisor 的 IP 地址或 DNS 主机名:

    • 如果服务类型设置为 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
    
  2. pinniped-supervisor 命名空间中创建 kubernetes.io/tls 密钥。要创建 TLS 密钥,请运行:

    kubectl create secret generic SECRET-NAME -n pinniped-supervisor --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
    • FILENAME-*tls.crttls.keyca.crt 的名称。在 Pinniped 的 TLS 密钥中指定的 TLS 证书必须包含上一步中的 Pinniped 服务的 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

check-circle-line exclamation-circle-line close-line
Scroll to top icon