本主题介绍了如何在 Tanzu Kubernetes Grid 中为 Pinniped 配置自定义 TLS 证书。
默认情况下,Tanzu Kubernetes Grid 使用自签名 Issuer
生成 TLS 证书,以保护流向 Pinniped 的 HTTPS 流量。部署管理集群后,您可以选择更新默认配置,如下所示:
ClusterIssuer
资源或您自己的 TLS 密钥。请参见下面的设置 ClusterIssuer
资源或 TLS 密钥。ClusterIssuer
资源或 TLS 密钥如果要使用自定义 ClusterIssuer
资源生成 TLS 证书:
cert-manager
正在管理集群中运行。默认情况下,此组件在所有管理集群中运行。ClusterIssuer
资源的名称。有关详细信息,请参见证书管理器文档中的颁发者配置。values.yaml
部分的 custom_cluster_issuer
字段中指定 ClusterIssuer
名称,然后应用更改。有关说明,请参见下面的更新 Pinniped 配置。完成本节中的步骤后,Pinniped 证书链将由 ClusterIssuer
签名。如果要直接指定自己的 TLS 密钥:
检索 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
在 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.crt
、tls.key
或 ca.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 主机名。
在管理集群的 Pinniped 附加项密钥的 values.yaml
部分的 custom_tls_secret
字段中指定密钥名称,然后应用更改。有关说明,请参见下面的更新 Pinniped 配置。
如果要为 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 加载项密钥保存到一个文件中,并在密钥的 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
。在解码文本中,请执行以下操作之一:
如果准备了上面的 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
...
再次对 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
确认更改已成功应用:
获取 pinniped
应用的状态:
kubectl get app CLUSTER-NAME-pinniped -n tkg-system
如果返回的状态为“Reconcile failed(协调失败)”,请运行以下命令以获取有关失败的详细信息:
kubectl get app CLUSTER-NAME-pinniped -n tkg-system -o yaml
通过运行 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
。