このトピックでは、Tanzu Kubernetes Grid で Pinniped のカスタム TLS 証明書を構成する方法について説明します。
デフォルトでは、Tanzu Kubernetes Grid は自己署名の Issuer
を使用して、Pinniped への HTTPS トラフィックを保護する TLS 証明書を生成します。必要に応じて、次のように、管理クラスタを展開した後にデフォルトの構成を更新できます。
ClusterIssuer
リソースまたは独自の TLS シークレットを設定します。以下の「ClusterIssuer
リソースまたは TLS シークレットの設定」を参照してください。ClusterIssuer
リソースまたは TLS シークレットの設定カスタムの ClusterIssuer
リソースを使用して TLS 証明書を生成する場合は、次の手順を実行します。
cert-manager
が管理クラスタで実行されていることを確認します。デフォルトでは、このコンポーネントはすべての管理クラスタで実行されます。ClusterIssuer
リソースの名前を取得します。詳細については、cert-manager ドキュメントの「Issuer Configuration」を参照してください。values.yaml
セクションにある custom_cluster_issuer
フィールドに ClusterIssuer
名を指定し、変更を適用します。手順については、以下の「Pinniped 構成の更新」を参照してください。このセクションの手順を完了すると、Pinniped の証明書チェーンが ClusterIssuer
によって署名されます。独自の TLS シークレットを直接指定する場合は、次の手順を実行します。
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
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.crt
、tls.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.crt
を openssl x509 -in tls.crt -text
でデコードすると、[サブジェクト代替名 (Subject Alternative Name)] フィールドに 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 構成の更新」を参照してください。たとえば、Pinniped スーパーバイザー サービスの IP アドレスに解決するには、DNS プロバイダに A
レコードを作成するなどして、このホスト名の DNS を個別に構成する必要があります。このホスト名は、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 アドオン シークレットを更新します。このコマンドは、環境の 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
変更が正常に適用されたことを確認します。
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
を実行します。