本主題說明如何在 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
資源的名稱。如需詳細資訊,請參閱 cert-manager 說明文件中的簽發者組態。values.yaml
區段的 custom_cluster_issuer
欄位中指定 ClusterIssuer
名稱,然後套用您所做的變更。如需相關指示,請參閱下面的更新 Pinniped 組態。在您完成本節中的步驟後,您的 ClusterIssuer
將會簽署 Pinniped 和 Dex 憑證鏈結。如果您要直接指定自己的 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
時,會在 [主體別名 (Subject Alternative Name)] 欄位中顯示 IP 位址或 DNS 主機名稱。
在管理叢集的 Pinniped 附加元件密碼中,於 values.yaml
區段的 custom_tls_secret
欄位中指定密碼名稱,然後套用您所做的變更。如需相關指示,請參閱下面的更新 Pinniped 組態。
如果要為 Pinniped 服務設定 DNS 主機名稱,請在管理叢集的 Pinniped 附加元件密碼的 pinniped.supervisor_svc_external_dns
部分中的 values.yaml
區段內指定與 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 網繭:
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 憑證:
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 資料:
diff /tmp/OLD-FILE /tmp/NEW-FILE
其中:
OLD-FILE
是舊 Dex CA 資料檔的名稱。NEW-FILE
是新 Dex CA 資料檔的名稱。