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 を構成します。

この手順は、プライベート コンテナ レジストリまたは組み込みの Harbor レジストリ からイメージをプルする場合に使用できます。この例では、組み込みの Harbor レジストリ に保存されているイメージを使用するポッド仕様を作成し、以前に構成したイメージ プル シークレットを利用します。
  1. プライベート レジストリの詳細を含むサンプルのポッド仕様を作成します。
    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> を、以前に作成したレジストリ サービスのイメージ プル シークレットの名前に置き換えます。
  2. 定義したポッド仕様に基づいて、Tanzu Kubernetes クラスタ内にワークロードを作成します。
    kubectl --kubeconfig=<path>/cluster-kubeconfig apply -f <pod.yaml>

    ポッドは、レジストリからプルされたイメージに基づいて作成する必要があります。

外部プライベート レジストリの信頼フィールド

証明書エントリ(PEM でエンコードされたパブリック証明書の base64 エンコード文字列)を TkgServiceConfigurationadditionalTrustedCAs セクションに追加します。データは、TkgServiceConfiguration にプレーン テキストで保存されるパブリック証明書です。

表 1. プライベート レジストリの信頼フィールド
フィールド 説明
trust セクション マーカー。データを受け入れない。
additionalTrustedCAs セクション マーカー。それぞれの名前とデータを示す証明書の配列が含まれます。
name TLS 証明書の名前。
data PEM でエンコードされたパブリック証明書の base64 エンコード文字列。

外部プライベート レジストリ証明書の削除

証明書を TkgServiceConfigurationadditionalTrustedCAs セクションの証明書リストから削除し、TkgServiceConfigurationTanzu 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 を使用します。

SSH を使用してワーカー ノードに接続することで、2 つの調査手順を実行できます。
  1. フォルダ /etc/ssl/certs/tkg-<cert_name>.pem という名前のファイルがあるかを確認します。<cert_name> は、TkgServiceConfiguration に追加された証明書の「name」プロパティです。証明書が TkgServiceConfiguration 内の証明書と一致していてもプライベート レジストリの使用が機能しない場合は、次の手順を実行してさらに診断します。
  2. コマンド openssl s_client -connect hostname:port_num を実行して、自己署名証明書を使用したターゲット サーバへの openssl 接続テストを実行します。hostname は自己署名証明書を使用しているプライベート レジストリのホスト名/DNS 名で、port_num はサービスが実行されているポート番号です(HTTPS の場合は通常 443)。自己署名証明書を使用しているエンドポイントに接続するときに openssl によって返されるエラーを正確に確認し、適切な証明書を TkgServiceConfiguration に追加するなどしてその状況を解決できます。Tanzu Kubernetes クラスタに誤った証明書が組み込まれている場合は、正しい証明書を使用して Tanzu Kubernetes Grid サービス 構成を更新し、Tanzu Kubernetes クラスタを削除してから、正しい証明書を含む構成を使用してクラスタを再作成する必要があります。