本主题介绍了如何在 Tanzu Kubernetes Grid 中为 Pinniped 和 Dex 配置自定义 TLS 证书。此外,还介绍了如何更新 Tanzu Kubernetes Grid 中的 Dex 证书。
默认情况下,Tanzu Kubernetes Grid 使用自签名 Issuer
生成 TLS 证书,以保护流向 Pinniped 和 Dex 的 HTTPS 流量。部署管理集群后,您可以选择更新默认配置,如下所示:
ClusterIssuer
资源或您自己的 TLS 密钥。请参见下面的设置 ClusterIssuer
资源或 TLS 密钥。注意Tanzu Kubernetes Grid 仅为 LDAP 身份提供程序部署 Dex。如果在创建管理集群或将其配置为创建后步骤时配置 OIDC 身份提供程序,则不会部署 Dex。
ClusterIssuer
资源或 TLS 密钥如果要使用自定义 ClusterIssuer
资源生成 TLS 证书:
cert-manager
正在管理集群中运行。默认情况下,此组件在所有管理集群中运行。ClusterIssuer
资源的名称。有关详细信息,请参见证书管理器文档中的颁发者配置。values.yaml
部分的 custom_cluster_issuer
字段中指定 ClusterIssuer
名称,然后应用更改。有关说明,请参见下面的更新 Pinniped 配置。完成本节中的步骤后,Dex 证书链的 Pinniped 将由 ClusterIssuer
签名。如果要直接指定自己的 TLS 密钥:
检索 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
(仅 LDAP)dexsvc
服务:
如果服务类型设置为 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
如果使用 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.crt
、tls.key
或 ca.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 主机名。
在管理集群的 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
。
在使用 LDAP 身份管理的集群中,您可能希望在以下情况下更新 Dex 证书:
执行此过程之前,请确保您:
kubectl get service dexsvc -n tanzu-system-auth
命令获取 Dex 服务的地址。如果当前位于工作负载集群上下文中,请将 kubectl
上下文更改为管理集群。有关详细信息,请参见检索工作负载集群 kubeconfig。
下载当前的 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
。删除当前 Dex 提供证书密钥,以便 cert-manager
重新创建该密钥:
kubectl delete secret -n tanzu-system-auth dex-cert-tls
以下是输出示例:
secret "dex-cert-tls" deleted
确认已创建新的 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
重新启动 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
下载新的 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
。比较旧证书和新证书以确保新证书已创建:
diff /tmp/OLD-FILE /tmp/NEW-FILE
其中:
OLD-FILE
是旧 Dex 服务证书的名称。NEW-FILE
是新 Dex 服务证书的名称。下载当前的 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
。
下载当前的 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
。
下载当前的 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
。
删除 Dex CA 证书密钥,以便 cert-manager
重新创建该秘钥:
kubectl delete secret -n tanzu-system-auth dex-ca-key-pair
以下是输出示例:
secret "dex-ca-key-pair" deleted
确认已创建新的 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
删除当前 Dex 提供证书密钥,以便 cert-manager
重新创建该密钥:
kubectl delete secret -n tanzu-system-auth dex-cert-tls
以下是输出示例:
secret "dex-cert-tls" deleted
确认已创建新的 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
删除 Pinniped 部署后作业:
kubectl delete job -n pinniped-supervisor pinniped-post-deploy-job
以下是输出示例:
job.batch "pinniped-post-deploy-job" deleted
更新 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
下载新的 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
。
下载新的 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
。
比较旧 CA 证书和新 CA 证书,以确保已创建新的 CA 证书:
diff /tmp/OLD-FILE /tmp/NEW-FILE
其中:
OLD-FILE
是旧 Dex CA 证书的名称。NEW-FILE
是旧 Dex CA 证书的名称。比较旧服务证书和新服务证书,以确保已创建新服务证书:
diff /tmp/OLD-FILE /tmp/NEW-FILE
其中:
OLD-FILE
是旧 Dex 服务证书的名称。NEW-FILE
是旧 Dex 服务证书的名称。比较旧 CA 数据和新 CA 数据,以确保已创建新的 CA 数据:
diff /tmp/OLD-FILE /tmp/NEW-FILE
其中:
OLD-FILE
是旧 Dex CA 数据文件的名称。NEW-FILE
是旧 Dex CA 数据文件的名称。