Pinniped の TLS 証明書の構成と管理

このトピックでは、Tanzu Kubernetes Grid で Pinniped のカスタム TLS 証明書を構成する方法について説明します。

カスタム TLS 証明書の構成

デフォルトでは、Tanzu Kubernetes Grid は自己署名の Issuer を使用して、Pinniped への HTTPS トラフィックを保護する TLS 証明書を生成します。必要に応じて、次のように、管理クラスタを展開した後にデフォルトの構成を更新できます。

  1. カスタムの ClusterIssuer リソースまたは独自の TLS シークレットを設定します。以下の「ClusterIssuer リソースまたは TLS シークレットの設定」を参照してください。
  2. 管理クラスタの Pinniped アドオン シークレットを再展開して、Pinniped 構成を更新します。以下の「Pinniped 構成の更新」を参照してください。

ClusterIssuer リソースまたは TLS シークレットの設定

カスタムの ClusterIssuer リソースを使用して TLS 証明書を生成する場合は、次の手順を実行します。

  1. cert-manager が管理クラスタで実行されていることを確認します。デフォルトでは、このコンポーネントはすべての管理クラスタで実行されます。
  2. 管理クラスタ内の既存の ClusterIssuer リソースの名前を取得します。詳細については、cert-manager ドキュメントの「Issuer Configuration」を参照してください。
  3. 管理クラスタの Pinniped アドオン シークレットの values.yaml セクションにある custom_cluster_issuer フィールドに ClusterIssuer 名を指定し、変更を適用します。手順については、以下の「Pinniped 構成の更新」を参照してください。このセクションの手順を完了すると、Pinniped の証明書チェーンが ClusterIssuer によって署名されます。

独自の TLS シークレットを直接指定する場合は、次の手順を実行します。

  1. Pinniped サービス pinniped-supervisor の IP アドレスまたは DNS ホスト名を取得します。

    • サービスのタイプが LoadBalancer(NSX Advanced Load Balancer、Amazon Web Services (AWS)、Azure などのロード バランサを使用する vSphere)に設定されている場合は、次を実行してサービスの外部アドレスを取得します。
    kubectl get service pinniped-supervisor -n pinniped-supervisor
    
    • サービスのタイプが NodePort(ロード バランサなしの vSphere)に設定されている場合、サービスの IP アドレスは、vSphere 制御プレーン エンドポイントと同じです。IP アドレスを取得するには、次のコマンドを実行します。
    kubectl get configmap cluster-info -n kube-public -o yaml
    
  2. 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.crttls.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 ...
    

    シークレットが正しく生成されている場合、tls.crtopenssl x509 -in tls.crt -text でデコードすると、[サブジェクト代替名 (Subject Alternative Name)] フィールドに IP アドレスまたは DNS ホスト名が表示されます。

  3. 管理クラスタの Pinniped アドオン シークレットの values.yaml セクションにある custom_tls_secret フィールドにシークレット名を指定し、変更を適用します。手順については、以下の「Pinniped 構成の更新」を参照してください。

  4. Pinniped サービスの DNS ホスト名を構成する場合は、管理クラスタの Pinniped アドオン シークレットの values.yaml セクションの pinniped.supervisor_svc_external_dns フィールドで、Pinniped スーパーバイザーに関連付けられている FQDN を指定します。pinniped.supervisor_svc_external_dns の値は https:// で始まる必要があります。詳細については、「自動管理パッケージの values.yaml 設定」を参照してください。次に、変更を適用します。手順については、以下の「Pinniped 構成の更新」を参照してください。たとえば、Pinniped スーパーバイザー サービスの IP アドレスに解決するには、DNS プロバイダに A レコードを作成するなどして、このホスト名の DNS を個別に構成する必要があります。このホスト名は、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 アドオン シークレットを更新します。このコマンドは、環境の OS によって異なります。例:

    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