Tanzu Kubernetes クラスタ ポッドで外部コンテナ レジストリを使用できます。これは組み込みの Harbor レジストリ の代わりに使用できます。
外部プライベート レジストリの使用事例
コンテナ レジストリは、Kubernetes 環境に重要な機能を提供し、コンテナ イメージを保存して共有するための一元的なリポジトリとして機能します。最もよく使用されるパブリック コンテナ レジストリは DockerHub です。プライベート コンテナ レジストリのサービスは多数あります。VMware Harbor は、オープンソースのクラウド ネイティブなプライベート コンテナ レジストリです。vSphere with Tanzu には、vSphere ポッド および Tanzu Kubernetes クラスタで実行されているポッドのプライベート コンテナ レジストリとして使用できる Harbor のインスタンスが組み込まれています。詳細については、『スーパーバイザー クラスタ の組み込み Harbor レジストリ の有効化』を参照してください。
vSphere with Tanzu に付属する組み込みの Harbor レジストリ を使用するには、NSX-T ネットワークが必要です。vSphere ネットワークを使用している場合、このレジストリは使用できません。また、Tanzu Kubernetes クラスタと統合する独自のプライベート コンテナ レジストリをすでに実行している場合があります。この場合、自己署名証明書を使用してプライベート レジストリを信頼するように Tanzu Kubernetes Grid サービス を構成できます。これにより、Tanzu Kubernetes クラスタで実行されている Kubernetes ポッドで外部レジストリを使用できます。
外部プライベート レジストリの要件
Tanzu Kubernetes クラスタで外部プライベート レジストリを使用するには、vSphere with Tanzu バージョン 7 U2 以降を使用する必要があります。
独自のプライベート レジストリは、Tanzu Kubernetes クラスタおよび Tanzu Kubernetes リリース ノード仮想マシンで実行される Kubernetes ポッドでのみ使用できます。ESXi ホスト上でネイティブに実行される vSphere ポッド では独自のプライベート レジストリは使用できません。vSphere ポッド でサポートされるレジストリは、vSphere with Tanzu プラットフォームに組み込まれている Harbor レジストリ です。
Tanzu Kubernetes Grid サービス をプライベート レジストリ用に構成すると、プロビジョニングされる新しいクラスタでプライベート レジストリがサポートされます。既存のクラスタでプライベート レジストリをサポートするには、TkgServiceConfiguration
を適用するためのローリング アップデートが必要です。Tanzu Kubernetes クラスタの更新を参照してください。また、カスタム TkgServiceConfiguration
を初めて作成した場合は、ローリング アップデートが開始されます。
外部プライベート レジストリの構成
Tanzu Kubernetes クラスタで独自のプライベート レジストリを使用するには、1 つ以上の自己署名証明書を使用して、HTTPS 経由でプライベート レジストリ コンテンツを提供するように Tanzu Kubernetes Grid サービス を構成します。
プライベート レジストリの自己署名証明書をサポートするように TkgServiceConfiguration
が更新されます。具体的には、additionalTrustedCAs
フィールドを含む新しい trust
セクションが追加され、Tanzu Kubernetes クラスタが信頼する任意の数の自己署名証明書を定義できます。この機能を使用すると、証明書のリストを簡単に定義でき、ローテーションが必要な場合にそれらの証明書を更新できます。
TkgServiceConfiguration
を更新して適用すると、次にクラスタが作成されるときに TLS 証明書が新しいクラスタに適用されます。つまり、TkgServiceConfiguration.trust.additionalTrustedCAs
に更新を適用しても、Tanzu Kubernetes クラスタの自動ローリング アップデートはトリガされません。
apiVersion: run.tanzu.vmware.com/v1alpha1 kind: TkgServiceConfiguration metadata: name: tkg-service-configuration spec: defaultCNI: antrea trust: additionalTrustedCAs: - name: first-cert-name data: base64-encoded string of a PEM encoded public cert 1 - name: second-cert-name data: base64-encoded string of a PEM encoded public cert 2
kubectl apply -f tkgserviceconfiguration.yaml
Tanzu Kubernetes Grid サービス 仕様をプライベート レジストリ証明書で更新しているため、Tanzu Kubernetes クラスタで組み込みの Harbor レジストリ を使用する場合と同様に、パブリック キーを Tanzu Kubernetes クラスタの kubeconfig に追加する必要はありません。
プライベート コンテナ レジストリからイメージをプルするための Tanzu Kubernetes ワークロードの構成
Tanzu Kubernetes クラスタのワークロードのためにプライベート コンテナ レジストリからイメージをプルするには、プライベート レジストリの詳細を使用してワークロード YAML を構成します。
- プライベート レジストリの詳細を含むサンプルのポッド仕様を作成します。
apiVersion: v1 kind: Pod metadata: name: <workload-name> namespace: <kubernetes-namespace> spec: containers: - name: private-reg-container image: <Registry-IP-Address>/<vsphere-namespace>/<image-name>:<version> imagePullSecrets: - name: <registry-secret-name>
<workload-name>
をポッド ワークロードの名前に置き換えます。<kubernetes-namespace>
を、ポッドが作成されるクラスタ内の Kubernetes 名前空間に置き換えます。この名前空間は、レジストリ サービスのイメージ プル シークレットが格納されている、Tanzu Kubernetes クラスタ内の Kubernetes 名前空間(デフォルトの名前空間など)と同じにする必要があります。<Registry-IP-Address>
を、スーパーバイザー クラスタ で実行されている組み込みの Harbor レジストリ インスタンスの IP アドレスに置き換えます。- <vsphere-namespace> を、ターゲット Tanzu Kubernetes がプロビジョニングされている vSphere 名前空間 に置き換えます。
<image-name>
を、任意のイメージ名に置き換えます。<version>
を、イメージの適切なバージョン(「最新」バージョンなど)に置き換えます。<registry-secret-name>
を、以前に作成したレジストリ サービスのイメージ プル シークレットの名前に置き換えます。
- 定義したポッド仕様に基づいて、Tanzu Kubernetes クラスタ内にワークロードを作成します。
kubectl --kubeconfig=<path>/cluster-kubeconfig apply -f <pod.yaml>
ポッドは、レジストリからプルされたイメージに基づいて作成する必要があります。
外部プライベート レジストリの信頼フィールド
証明書エントリ(PEM でエンコードされたパブリック証明書の base64 エンコード文字列)を TkgServiceConfiguration
の additionalTrustedCAs
セクションに追加します。データは、TkgServiceConfiguration にプレーン テキストで保存されるパブリック証明書です。
フィールド | 説明 |
---|---|
trust |
セクション マーカー。データを受け入れない。 |
additionalTrustedCAs |
セクション マーカー。それぞれの名前とデータを示す証明書の配列が含まれます。 |
name |
TLS 証明書の名前。 |
data |
PEM でエンコードされたパブリック証明書の base64 エンコード文字列。 |
外部プライベート レジストリ証明書の削除
証明書を TkgServiceConfiguration
の additionalTrustedCAs
セクションの証明書リストから削除し、TkgServiceConfiguration
を Tanzu Kubernetes Grid サービス に適用します。
外部プライベート レジストリ証明書のローテーション
証明書をローテーションするには、仮想インフラストラクチャ管理者または DevOps エンジニアが TkgServiceConfiguration
または Tanzu Kubernetes クラスタ仕様の証明書の内容を変更し、その構成を適用して、その TKC のローリング アップデートをトリガします。
外部プライベート レジストリ証明書のトラブルシューティング
信頼する証明書を使用して Tanzu Kubernetes Grid サービス を構成し、自己署名証明書をクラスタの kubeconfig に追加すると、その自己署名証明書を使用するプライベート レジストリからコンテナ イメージを正常にプルできるはずです。
次のコマンドは、コンテナ イメージがポッド ワークロードに対して正常にプルされたかどうかを判断するのに役立ちます。
kubectl describe pod PODNAME
このコマンドを実行すると、特定のポッドの詳細なステータスとエラー メッセージが表示されます。カスタム証明書をクラスタに追加する前にイメージをプルする例を次に示します。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 33s default-scheduler ... Normal Image 32s image-controller ... Normal Image 15s image-controller ... Normal SuccessfulRealizeNSXResource 7s (x4 over 31s) nsx-container-ncp ... Normal Pulling 7s kubelet Waiting test-gc-e2e-demo-ns/testimage-8862e32f68d66f727d1baf13f7eddef5a5e64bbd-v10612 Warning Failed 4s kubelet failed to get images: ... Error: ... x509: certificate signed by unknown authority
kubectl get pods
ErrImagePull
エラーも表示されます。
NAME READY STATUS RESTARTS AGE testimage-nginx-deployment-89d4fcff8-2d9pz 0/1 Pending 0 17s testimage-nginx-deployment-89d4fcff8-7kp9d 0/1 ErrImagePull 0 79s testimage-nginx-deployment-89d4fcff8-7mpkj 0/1 Pending 0 21s testimage-nginx-deployment-89d4fcff8-fszth 0/1 ErrImagePull 0 50s testimage-nginx-deployment-89d4fcff8-sjnjw 0/1 ErrImagePull 0 48s testimage-nginx-deployment-89d4fcff8-xr5kg 0/1 ErrImagePull 0 79sエラー「x509: certificate signed by unknown authority」と「ErrImagePull」は、プライベート コンテナ レジストリに接続するための正しい証明書を使用してクラスタが構成されていないことを示しています。証明書が見つからないか、構成が正しくありません。
証明書の構成後にプライベート レジストリに接続するとエラーが発生する場合は、構成に適用された証明書がクラスタに適用されているかどうかを確認できます。構成に適用された証明書が正しく適用されているかどうかを確認するには、SSH を使用します。
- フォルダ
/etc/ssl/certs/
にtkg-<cert_name>.pem
という名前のファイルがあるかを確認します。<cert_name>
は、TkgServiceConfiguration
に追加された証明書の「name」プロパティです。証明書がTkgServiceConfiguration
内の証明書と一致していてもプライベート レジストリの使用が機能しない場合は、次の手順を実行してさらに診断します。 - コマンド
openssl s_client -connect hostname:port_num
を実行して、自己署名証明書を使用したターゲット サーバへの openssl 接続テストを実行します。hostname は自己署名証明書を使用しているプライベート レジストリのホスト名/DNS 名で、port_num はサービスが実行されているポート番号です(HTTPS の場合は通常 443)。自己署名証明書を使用しているエンドポイントに接続するときに openssl によって返されるエラーを正確に確認し、適切な証明書をTkgServiceConfiguration
に追加するなどしてその状況を解決できます。Tanzu Kubernetes クラスタに誤った証明書が組み込まれている場合は、正しい証明書を使用して Tanzu Kubernetes Grid サービス 構成を更新し、Tanzu Kubernetes クラスタを削除してから、正しい証明書を含む構成を使用してクラスタを再作成する必要があります。