為 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 資源的名稱。如需詳細資訊,請參閱 cert-manager 說明文件中的簽發者組態
  3. 在管理叢集的 Pinniped 附加元件密碼中,於 values.yaml 區段的 custom_cluster_issuer 欄位中指定 ClusterIssuer 名稱,然後套用您所做的變更。如需相關指示,請參閱下面的更新 Pinniped 組態。在您完成本節中的步驟後,您的 ClusterIssuer 將會簽署 Pinniped 和 Dex 憑證鏈結。

如果您要直接指定自己的 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
        
    • (僅限 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
        
  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 時,會在 [主體別名 (Subject Alternative Name)] 欄位中顯示 IP 位址或 DNS 主機名稱。

  3. 在管理叢集的 Pinniped 附加元件密碼中,於 values.yaml 區段的 custom_tls_secret 欄位中指定密碼名稱,然後套用您所做的變更。如需相關指示,請參閱下面的更新 Pinniped 組態

  4. 如果要為 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 組態:

  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 網繭:

    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 憑證:

    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 資料:

    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