このトピックでは、Tanzu Kubernetes Grid で Pinniped および Dex のカスタム TLS 証明書を構成する方法について説明します。また、Tanzu Kubernetes Grid で Dex 証明書を更新する方法についても説明します。
デフォルトでは、Tanzu Kubernetes Grid は自己署名の Issuer
を使用して、Pinniped および Dex への HTTPS トラフィックを保護する TLS 証明書を生成します。必要に応じて、次のように、管理クラスタを展開した後にデフォルトの構成を更新できます。
ClusterIssuer
リソースまたは独自の TLS シークレットを設定します。以下の「ClusterIssuer
リソースまたは TLS シークレットの設定」を参照してください。注Tanzu Kubernetes Grid は、LDAP ID プロバイダについてのみ Dex を展開します。OIDC ID プロバイダを管理クラスタの作成時に構成するか、作成後の手順で構成すると、Dex は展開されません。
ClusterIssuer
リソースまたは TLS シークレットの設定カスタムの ClusterIssuer
リソースを使用して TLS 証明書を生成する場合は、次の手順を実行します。
cert-manager
が管理クラスタで実行されていることを確認します。デフォルトでは、このコンポーネントはすべての管理クラスタで実行されます。ClusterIssuer
リソースの名前を取得します。詳細については、cert-manager ドキュメントの「Issuer Configuration」を参照してください。values.yaml
セクションにある custom_cluster_issuer
フィールドに ClusterIssuer
名を指定し、変更を適用します。手順については、以下の「Pinniped 構成の更新」を参照してください。このセクションの手順を完了すると、Pinniped と Dex の両方の証明書チェーンが ClusterIssuer
によって署名されます。独自の TLS シークレットを直接指定する場合は、次の手順を実行します。
Pinniped サービスの IP アドレスまたは DNS ホスト名 (pinniped-supervisor
) を取得します。Dex サービスの LDAP ID プロバイダを使用している場合は、dexsvc
を取得します。
pinniped-supervisor
サービス:
サービスのタイプが 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
(LDAP のみ)dexsvc
サービス:
サービスのタイプが LoadBalancer
(NSX Advanced Load Balancer、Amazon Web Services (AWS)、Azure などのロード バランサを使用する vSphere)に設定されている場合は、次を実行してサービスの外部アドレスを取得します。
kubectl get service dexsvc -n tanzu-system-auth
サービスのタイプが NodePort
(ロード バランサなしの vSphere)に設定されている場合、サービスの IP アドレスは、vSphere 制御プレーン エンドポイントと同じです。IP アドレスを取得するには、次のコマンドを実行します。
kubectl get configmap cluster-info -n kube-public -o yaml
OIDC ID プロバイダを使用している場合は、pinniped-supervisor
名前空間に kubernetes.io/tls
シークレットを作成します。LDAP ID プロバイダを使用している場合は、同じ名前の 2 つの kubernetes.io/tls
シークレットを作成します。1 つは Pinniped サービス用として pinniped-supervisor
名前空間に作成し、もう 1 つは Dex サービス用として tanzu-system-auth
名前空間に作成します。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 ...
シークレットが正しく生成されている場合、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
を実行します。
LDAP ID 管理を使用するクラスタでは、次の場合に Dex 証明書を更新できます。
この手順を実行する前に、次の点を確認してください。
kubectl get service dexsvc -n tanzu-system-auth
コマンドを使用して、Dex サービスのアドレスを取得していること。現在ワークロード クラスタのコンテキストにいる場合は、kubectl
コンテキストを管理クラスタに変更します。詳細については、「Retrieve Workload Cluster 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 データ ファイルの名前です。