サービス レジストリ用の Harbor のインストール

このトピックでは、Tanzu Kubernetes Grid のワークロード クラスタまたは共有サービス クラスタに Harbor を展開する方法について説明します。

vSphere with Tanzu では、「スーパーバイザーへの Harbor のインストールと構成」の説明に従って、スーパーバイザーに Harbor をインストールするか、以下の説明に従って個々のワークロード クラスタにインストールできます。
スーパーバイザー サービスが共有されているため、vSphere with Tanzu は、個別の共有サービス クラスタへのパッケージの展開をサポートしていません。

Notary と Chartmuseum は Harbor v2.6 で廃止され、Harbor v2.6.0 リリース ノートに記載されているように、今後のリリースで削除される予定です。ユーザーは、コンテナの署名と検証のために Sigstore Cosign に切り替える必要があります。

Harbor

Harbor は、コンテンツの保存、署名、スキャンを行うオープン ソースの信頼できるクラウド ネイティブ コンテナ レジストリです。Tanzu Kubernetes Grid には Harbor 用の署名付きのパッケージ化されたバイナリが含まれています。このバイナリをワークロード クラスタに展開して、そのクラスタにコンテナ レジストリ サービスを提供できます。Harbor パッケージは、ユーザーに通常必要なセキュリティ、ID 制御、管理などの機能を追加することで、オープンソースの Docker ディストリビューションを拡張します。

Tanzu Kubernetes Grid には Harbor 用の署名付きバイナリが含まれています。このバイナリは、以下に展開できます。

  • そのクラスタにコンテナ レジストリ サービスを提供するワークロード クラスタ
  • スタンドアローン管理クラスタを使用する展開で、他のワークロード クラスタにコンテナ レジストリ サービスを提供する共有サービス クラスタ。

共有サービスとして展開すると、同じスタンドアローン管理クラスタによって管理されているすべてのワークロード クラスタで Harbor を使用できます。Harbor を共有サービスとして実装するには、共有サービスの実行専用の特別なクラスタに展開します。各管理クラスタに設定できる共有サービス クラスタは 1 つのみです。

Harbor レジストリと ExternalDNS

VMware は、特に Harbor の可用性が重要な本番環境やその他の環境では、ロード バランシングを使用したインフラストラクチャに、Harbor レジストリと一緒に ExternalDNS をインストールすることを推奨しています。

入力方向ロード バランサへの IP アドレスが変更されると、ExternalDNS は自動的に変更を取得し、新しいアドレスを Harbor ホスト名に再マッピングします。これにより、「Harbor ユーザー インターフェイスへの接続」の説明に従って、アドレスを手動で再マップする必要が生じていました。

前提条件

インターネットが制限された環境で、Tanzu Kubernetes Grid v2.2 を実行するために Harbor のプロキシ キャッシュ機能を使用することはできません。Harbor プロキシ キャッシュを使用して、以前のバージョンの Tanzu Kubernetes Grid のイメージや、アプリケーション イメージなどの Tanzu 以外のイメージをプロキシすることはできます。

Harbor 展開用のクラスタの準備

Harbor 展開用のクラスタを準備するには、次の手順を実行します。

  1. kubectl のコンテキストをワークロード クラスタまたは共有サービス クラスタに設定します。例:

    kubectl config use-context tkg-services-admin@tkg-services
    
  2. クラスタに、tanzu-standard リポジトリなどの Harbor パッケージがインストールされたパッケージ リポジトリがない場合は、次の方法でインストールします。

    プランベースのクラスタ(レガシー)をターゲットとする場合は、この手順をスキップします。プランベースのクラスタの場合は、tanzu-standard パッケージ リポジトリは、すべてのクラスタの tanzu-package-repo-global 名前空間で自動的に有効になります。

    tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
    

    ここで、

    • PACKAGE-REPO-NAME はパッケージ リポジトリの名前です。tanzu-standard や、ADDITIONAL_IMAGE_REGISTRY 変数で構成されたプライベート イメージ レジストリの名前が入ります。
    • PACKAGE-REPO-ENDPOINT はパッケージ リポジトリの URL です。

      • このリリースでは、tanzu-standard の URL は projects.registry.vmware.com/tkg/packages/standard/repo:v2.2.0 です。Tanzu CLI からこの値を取得するには、「パッケージ リポジトリの一覧表示」を参照してください。また、Tanzu Mission Control では [クラスタ (Cluster)] ペインの [アドオン (Addons)] > [リポジトリ (Repositories)] リストを参照してください。
  3. まだ cert-manager および Contour パッケージをインストールしていない場合は、インストールします。手順については、「入力方向制御のための Contour のインストール」を参照してください。

  4. (オプション)ExternalDNS パッケージをインストールします。手順については、「サービス検出のための ExternalDNS のインストール」を参照してください。

  5. 次の「クラスタへの Harbor の展開」に進みます。

クラスタへの Harbor の展開

次の手順に従って、Harbor をワークロード クラスタまたは共有サービス クラスタに展開します。

  1. クラスタで Harbor パッケージが使用可能であることを確認します。

    tanzu package available list -A
    
  2. 使用可能なパッケージのバージョンを取得します。

    tanzu package available list harbor.tanzu.vmware.com -A
    
  3. standard パッケージ リポジトリから Harbor パッケージをダウンロードします。

    imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:PACKAGE-VERSION -o /tmp/harbor-package-PACKAGE-VERSION
    

    ここで、PACKAGE-VERSION は、tanzu package available list によってリストされるパッケージのバージョンですが、_ 文字は + 文字に置き換わります。また、プリフィックス v も含める必要があります。たとえば、v2.7.1_vmware.1-tkg.1 などです。

    例:

    imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:v2.7.1_vmware.1-tkg.1 -o /tmp/harbor-package-v2.7.1_vmware.1-tkg.1
    
    1. 次のいずれかを実行して、harbor-data-values.yaml ファイルに必須のパスワードとシークレットを設定します。

      • ランダム パスワードとシークレットを自動的に生成するには、次のコマンドを実行します。

        image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.PACKAGE-VERSION -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
        imgpkg pull -b $image_url -o /tmp/harbor-package-PACKAGE-VERSION
        
        cp /tmp/harbor-package-PACKAGE-VERSION/config/values.yaml harbor-data-values.yaml
        
        bash /tmp/harbor-package-PACKAGE-VERSION/config/scripts/generate-passwords.sh harbor-data-values.yaml
        

        ここで、PACKAGE-VERSION はインストールする Harbor パッケージのバージョンです。

        たとえば、Harbor パッケージ v2.7.1 の場合は、次のコマンドを実行します。

        image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.2.7.1+vmware.1-tkg.1 -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
        imgpkg pull -b $image_url -o /tmp/harbor-package-2.7.1
        bash /tmp/harbor-package-2.7.1/config/scripts/generate-passwords.sh harbor-data-values.yaml
        
      • 独自のパスワードとシークレットを設定するには、harbor-data-values.yaml ファイルの次のエントリを更新します。

        • harborAdminPassword
        • secretKey
        • database.password
        • core.secret
        • core.xsrfKey
        • jobservice.secret
        • registry.secret
    2. harbor-data-values.yaml ファイルで他の設定を指定します。

      • hostname 設定を Harbor へのアクセスに使用するホスト名に設定します。たとえば、harbor.yourdomain.comです。
      • 独自の証明書を使用するには、tls.crttls.keyca.crt の各設定を証明書、キー、CA 証明書のコンテンツで更新します。証明書は、信頼できる機関によって署名することも、自己署名することもできます。空白のままにすると、Tanzu Kubernetes Grid によって自己署名証明書が自動的に生成されます。
      • generate-passwords.sh スクリプトを使用した場合は、必要に応じて、harborAdminPassword を覚えやすいものに更新します。
      • 以下には空以外の値が必要です。

        • storageClass: persistence.persistentVolumeClaimregistryjobservicedatabaseredis、および trivy で、storageClasskubectl get sc によって返されるストレージ プロファイルに設定します。

        azure-file ストレージ クラスでは、ディスクのマウント後にファイルシステムの権限を変更することはできません。これは、Azure ドキュメントの「Azure Files の使用中に "アクセス許可を変更できませんでした" エラー」で説明されている Azure の問題が原因です。

        • pspNames: pspNameskubectl get psp によって返される PSP 値に設定します。たとえば、"vmware-system-restricted,vmware-system-privileged" です。
      • 必要に応じて、他の persistence 設定を更新して、Harbor によるデータの格納方法を指定します。

        大量のコンテナ イメージを Harbor に保存する必要がある場合は、persistence.persistentVolumeClaim.registry.size を大きな値に設定します。

      harbor-data-values.yaml ファイルの値の詳細を表示するには、ターゲット クラスタに対して次のコマンドを実行します。

      tanzu package available get harbor.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
      

      ここで、AVAILABLE-VERSION は Harbor パッケージのバージョンです。--values-schema フラグは、Harbor パッケージの Package API リソースから valuesSchema セクションを取得します。値スキーマの出力形式 --output は、yamljson、または table に設定できます。

      例:

      tanzu package available get harbor.tanzu.vmware.com/2.7.1+vmware.1-tkg.1 --values-schema
      
    3. harbor-data-values.yaml ファイルのすべてのコメントを削除します。

      yq -i eval '... comments=""' harbor-data-values.yaml
      
  4. このパッケージをインストールします。

    tanzu package install harbor \
    --package harbor.tanzu.vmware.com \
    --version AVAILABLE-PACKAGE-VERSION \
    --values-file harbor-data-values.yaml \
    --namespace TARGET-NAMESPACE
    

    ここで、

    • TARGET-NAMESPACE は、Harbor パッケージをインストールする名前空間です。たとえば、my-packages または tanzu-cli-managed-packages 名前空間などです。

      • --namespace フラグが指定されていない場合、Tanzu CLI はパッケージとそのリソースを default 名前空間にインストールします。Harbor ポッドおよび Harbor コンポーネントに関連付けられているその他のリソースは、tanzu-system-registry 名前空間に作成されます。この名前空間には Harbor パッケージをインストールしないでください。
      • 指定された名前空間は、たとえば kubectl create namespace my-packages を実行することによってすでに存在している必要があります。
    • AVAILABLE-PACKAGE-VERSION は、上で取得したバージョンです。

    例:

    tanzu package install harbor \
    --package harbor.tanzu.vmware.com \
    --version 2.7.1+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    
  5. harbor パッケージがインストールされていることを確認します。

    tanzu package installed list -A
    

    パッケージの詳細を表示するために、次のコマンドを実行することもできます。

    tanzu package installed get harbor --namespace PACKAGE-NAMESPACE
    

    ここで、PACKAGE-NAMESPACE は、harbor パッケージがインストールされている名前空間です。

  6. harbor アプリケーションが PACKAGE-NAMESPACE で正常に調整されていることを確認します。

    kubectl get apps -A
    

    ステータスが Reconcile Succeeded でない場合は、harbor アプリケーションの完全なステータスの詳細を表示します。完全なステータスを表示すると、問題のトラブルシューティングに役立ちます。

    kubectl get app harbor --namespace PACKAGE-NAMESPACE -o yaml
    

    ここで、PACKAGE-NAMESPACE は、パッケージをインストールした名前空間です。トラブルシューティングを行っても問題を解決できない場合は、パッケージをアンインストールしてから再度インストールする必要があります。

    tanzu package installed delete harbor --namespace PACKAGE-NAMESPACE
    
  7. クラスタ内のすべてのポッドを一覧表示して、Harbor サービスが実行されていることを確認します。

    kubectl get pods -A
    

    tanzu-system-registry 名前空間で、harbor coredatabasejobservicenotaryportalredisregistry、および trivy サービスが次のような名前のポッドで実行されているのがわかります。

    NAMESPACE               NAME                                    READY   STATUS    RESTARTS   AGE
    [...]
    tanzu-system-ingress    contour-6b568c9b88-h5s2r                1/1     Running   0          26m
    tanzu-system-ingress    contour-6b568c9b88-mlg2r                1/1     Running   0          26m
    tanzu-system-ingress    envoy-wfqdp                             2/2     Running   0          26m
    tanzu-system-registry   harbor-core-557b58b65c-4kzhn            1/1     Running   0          23m
    tanzu-system-registry   harbor-database-0                       1/1     Running   0          23m
    tanzu-system-registry   harbor-jobservice-847b5c8756-t6kfs      1/1     Running   0          23m
    tanzu-system-registry   harbor-notary-server-6b74b8dd56-d7swb   1/1     Running   2          23m
    tanzu-system-registry   harbor-notary-signer-69d4669884-dglzm   1/1     Running   2          23m
    tanzu-system-registry   harbor-portal-8f677757c-t4cbj           1/1     Running   0          23m
    tanzu-system-registry   harbor-redis-0                          1/1     Running   0          23m
    tanzu-system-registry   harbor-registry-85b96c7777-wsdnj        2/2     Running   0          23m
    tanzu-system-registry   harbor-trivy-0                          1/1     Running   0          23m
    [...]
    
  8. tanzu-system-registry 名前空間の harbor-tls シークレットから Harbor CA 証明書を取得します。

    kubectl -n tanzu-system-registry get secret harbor-tls -o=jsonpath="{.data.ca\.crt}" | base64 -d
    

    次の手順の出力を記録します

  9. Harbor レジストリが自己署名 CA を使用している場合は、クラスタの展開方法に基づいて、該当する手順を使用してワークロード クラスタに追加します。

Harbor ユーザー インターフェイスへの接続

Harbor ユーザー インターフェイスは、クラスタ内の tanzu-system-ingress 名前空間で実行されている Envoy サービス ロード バランサを介して公開されます。ユーザーが Harbor ユーザー インターフェイスに接続できるようにするには、Envoy サービス ロード バランサのアドレスを Harbor サービスのホスト名(harbor.yourdomain.com など)にマッピングする必要があります。

  1. Envoy サービス ロード バランサのアドレスを取得します。

    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
    

    NSX Advanced Load Balancer (ALB) を使用しない vSphere (vSphere without NSX Advanced Load Balancer (ALB)) では、Envoy サービスは LoadBalancer ではなく NodePort を介して公開されるため、上記の出力は空になり、代わりにクラスタ内の任意のワーカー ノードの IP アドレスを使用できます。NSX ALB を使用する vSphere (vSphere with NSX ALB) では、Envoy サービスのロード バランサの IP アドレスは 20.54.226.44 のようになります。

  2. Envoy サービス ロード バランサのアドレスを Harbor サービスのホスト名にマッピングします。vSphere で実行されているクラスタの場合は、/etc/hosts のホスト名マッピングに IP アドレスを追加するか、対応する A レコードを DNS サーバに追加する必要があります。たとえば、IP アドレスが 10.93.9.100 の場合は、/etc/hosts に次の値を追加します。

    10.93.9.100 harbor.yourdomain.com notary.harbor.yourdomain.com
    

    Windows マシンでは、/etc/hosts/ に相当するのは C:\Windows\System32\Drivers\etc\hosts です。

Web ブラウザで https://harbor.yourdomain.com に移動し、harbor-data-values.yaml で構成した harborAdminPassword を使用して admin ユーザーとしてログインすることで、Harbor ユーザー インターフェイスに接続できるようになりました。

Harbor との間でのイメージのプッシュとプル

Harbor が設定されたので、イメージをプッシュして、クラスタがプルできるようにすることができます。

  1. Harbor が自己署名証明書を使用している場合は、https://harbor.yourdomain.com/api/v2.0/systeminfo/getcert から Harbor CA 証明書をダウンロードし、ローカル マシンにインストールして、Docker がこの CA 証明書を信頼できるようにします。

    • Linux の場合は、証明書を /etc/docker/certs.d/harbor.yourdomain.com/ca.crt として保存します。
    • macOS では、この手順を実行します。
    • Windows で、証明書ファイルを右クリックし、[証明書のインストール (Install Certificate)] を選択します。
  2. admin ユーザーを使用して Harbor レジストリにログインします。プロンプトが表示されたら、Harbor パッケージをクラスタにインストールしたときに設定した harborAdminPassword を入力します。

    docker login harbor.yourdomain.com -u admin
    
  3. ローカルでプルした既存のイメージにタグを付けます(nginx:1.7.9 など)。

    docker tag nginx:1.7.9 harbor.yourdomain.com/library/nginx:1.7.9
    
  4. イメージを Harbor レジストリにプッシュします。

    docker push harbor.yourdomain.com/library/nginx:1.7.9
    
  5. これで、Harbor CA 証明書がインストールされている任意のマシンの Harbor レジストリからイメージをプルできるようになりました。

    docker pull harbor.yourdomain.com/library/nginx:1.7.9
    

実行中の Harbor 展開の更新

展開後に Harbor パッケージの構成を変更する必要がある場合は、次の手順に従って、展開された Harbor パッケージを更新します。

  1. harbor-data-values.yaml で Harbor 構成を更新します。たとえば、persistence.persistentVolumeClaim.registry.size 値を更新することで、レジストリ ストレージの容量を増やすことができます。

  2. インストール済みパッケージの構成を更新します。

    tanzu package installed update harbor \
    --version INSTALLED-PACKAGE-VERSION \
    --values-file harbor-data-values.yaml \
    --namespace INSTALLED-PACKAGE-NAMESPACE
    

    ここで、

    • INSTALLED-PACKAGE-VERSION は、インストールされている Harbor パッケージのバージョンです。
    • INSTALLED-PACKAGE-NAMESPACE は Harbor パッケージがインストールされている名前空間です。

    例:

    tanzu package installed update harbor \
    --version 2.7.1+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    

Harbor パッケージは、追加した新しい値を使用して調整されます。kapp-controller が変更を適用するまでに最大 5 分かかることがあります。

tanzu package installed update コマンドの詳細については、「パッケージのインストールと管理」の「パッケージの更新」を参照してください。 このコマンドを使用して、インストールされているパッケージのバージョンと構成を更新できます。

Harbor パッケージを v2.7.1 に更新し、以前に Harbor スキャンデータ ボリュームの EmptyDir オーバーレイをパッケージに適用した場合は、パッケージ バージョンを更新する前に Harbor の PackageInstall リソースからオーバーレイ注釈を削除する必要があります。注釈は、手動で削除するか、kubectl -n MY-PACKAGES-NAMESPACE annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0- を実行して削除します。ここで、MY-PACKAGES-NAMESPACEPackageInstall リソースの名前空間です。

check-circle-line exclamation-circle-line close-line
Scroll to top icon