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

如果您要直接指定自己的 TLS 密碼,請執行下列動作:

  1. 擷取 Pinniped 服務的 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
    
  2. kubernetes.io/tls 命名空間中建立 pinniped-supervisor 密碼。若要建立 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 時,會在 [主體別名 (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

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