このトピックでは、Tanzu Kubernetes Grid のワークロード クラスタまたは共有サービス クラスタに Harbor を展開する方法について説明します。
注vSphere with Tanzu では、「スーパーバイザーへの Harbor のインストールと構成」の説明に従って、スーパーバイザーに Harbor をインストールするか、以下の説明に従って個々のワークロード クラスタにインストールできます。
スーパーバイザー サービスが共有されているため、vSphere with Tanzu は、個別の共有サービス クラスタへのパッケージの展開をサポートしていません。Notary と Chartmuseum は Harbor v2.6 で廃止され、Harbor v2.6.0 リリース ノートに記載されているように、今後のリリースで削除される予定です。ユーザーは、コンテナの署名と検証のために Sigstore Cosign に切り替える必要があります。
Harbor は、コンテンツの保存、署名、スキャンを行うオープン ソースの信頼できるクラウド ネイティブ コンテナ レジストリです。Tanzu Kubernetes Grid には Harbor 用の署名付きのパッケージ化されたバイナリが含まれています。このバイナリをワークロード クラスタに展開して、そのクラスタにコンテナ レジストリ サービスを提供できます。Harbor パッケージは、ユーザーに通常必要なセキュリティ、ID 制御、管理などの機能を追加することで、オープンソースの Docker ディストリビューションを拡張します。
Tanzu Kubernetes Grid には Harbor 用の署名付きバイナリが含まれています。このバイナリは、以下に展開できます。
共有サービスとして展開すると、同じスタンドアローン管理クラスタによって管理されているすべてのワークロード クラスタで Harbor を使用できます。Harbor を共有サービスとして実装するには、共有サービスの実行専用の特別なクラスタに展開します。各管理クラスタに設定できる共有サービス クラスタは 1 つのみです。
VMware は、特に Harbor の可用性が重要な本番環境やその他の環境では、ロード バランシングを使用したインフラストラクチャに、Harbor レジストリと一緒に ExternalDNS をインストールすることを推奨しています。
入力方向ロード バランサへの IP アドレスが変更されると、ExternalDNS は自動的に変更を取得し、新しいアドレスを Harbor ホスト名に再マッピングします。これにより、「Harbor ユーザー インターフェイスへの接続」の説明に従って、アドレスを手動で再マップする必要が生じていました。
kubectl
、Carvel ツールがインストールされている。手順については、「vSphere with Tanzu スーパーバイザーで使用する Tanzu CLI およびその他のツールのインストール」または「スタンドアローン管理クラスタで使用する Tanzu CLI およびその他のツールのインストール」を参照してください。tanzu login
コマンドを使用して Tanzu CLI にログインしている。注インターネットが制限された環境で、Tanzu Kubernetes Grid v2.2 を実行するために Harbor のプロキシ キャッシュ機能を使用することはできません。Harbor プロキシ キャッシュを使用して、以前のバージョンの Tanzu Kubernetes Grid のイメージや、アプリケーション イメージなどの Tanzu 以外のイメージをプロキシすることはできます。
Harbor 展開用のクラスタを準備するには、次の手順を実行します。
kubectl
のコンテキストをワークロード クラスタまたは共有サービス クラスタに設定します。例:
kubectl config use-context tkg-services-admin@tkg-services
クラスタに、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)] リストを参照してください。まだ cert-manager および Contour パッケージをインストールしていない場合は、インストールします。手順については、「入力方向制御のための Contour のインストール」を参照してください。
(オプション)ExternalDNS パッケージをインストールします。手順については、「サービス検出のための ExternalDNS のインストール」を参照してください。
次の「クラスタへの Harbor の展開」に進みます。
次の手順に従って、Harbor をワークロード クラスタまたは共有サービス クラスタに展開します。
クラスタで Harbor パッケージが使用可能であることを確認します。
tanzu package available list -A
使用可能なパッケージのバージョンを取得します。
tanzu package available list harbor.tanzu.vmware.com -A
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
次のいずれかを実行して、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
harbor-data-values.yaml
ファイルで他の設定を指定します。
hostname
設定を Harbor へのアクセスに使用するホスト名に設定します。たとえば、harbor.yourdomain.com
です。tls.crt
、tls.key
、ca.crt
の各設定を証明書、キー、CA 証明書のコンテンツで更新します。証明書は、信頼できる機関によって署名することも、自己署名することもできます。空白のままにすると、Tanzu Kubernetes Grid によって自己署名証明書が自動的に生成されます。generate-passwords.sh
スクリプトを使用した場合は、必要に応じて、harborAdminPassword
を覚えやすいものに更新します。以下には空以外の値が必要です。
storageClass
: persistence.persistentVolumeClaim
の registry
、jobservice
、database
、redis
、および trivy
で、storageClass
を kubectl get sc
によって返されるストレージ プロファイルに設定します。注
azure-file
ストレージ クラスでは、ディスクのマウント後にファイルシステムの権限を変更することはできません。これは、Azure ドキュメントの「Azure Files の使用中に "アクセス許可を変更できませんでした" エラー」で説明されている Azure の問題が原因です。
pspNames
: pspNames
を kubectl 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
は、yaml
、json
、または table
に設定できます。
例:
tanzu package available get harbor.tanzu.vmware.com/2.7.1+vmware.1-tkg.1 --values-schema
harbor-data-values.yaml
ファイルのすべてのコメントを削除します。
yq -i eval '... comments=""' harbor-data-values.yaml
このパッケージをインストールします。
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
harbor
パッケージがインストールされていることを確認します。
tanzu package installed list -A
パッケージの詳細を表示するために、次のコマンドを実行することもできます。
tanzu package installed get harbor --namespace PACKAGE-NAMESPACE
ここで、PACKAGE-NAMESPACE
は、harbor
パッケージがインストールされている名前空間です。
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
クラスタ内のすべてのポッドを一覧表示して、Harbor サービスが実行されていることを確認します。
kubectl get pods -A
tanzu-system-registry
名前空間で、harbor
core
、database
、jobservice
、notary
、portal
、redis
、registry
、および 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
[...]
tanzu-system-registry
名前空間の harbor-tls
シークレットから Harbor CA 証明書を取得します。
kubectl -n tanzu-system-registry get secret harbor-tls -o=jsonpath="{.data.ca\.crt}" | base64 -d
次の手順の出力を記録します
Harbor レジストリが自己署名 CA を使用している場合は、クラスタの展開方法に基づいて、該当する手順を使用してワークロード クラスタに追加します。
スーパーバイザーにより展開:
スタンドアローン管理クラスタにより展開:
Harbor ユーザー インターフェイスは、クラスタ内の tanzu-system-ingress
名前空間で実行されている Envoy サービス ロード バランサを介して公開されます。ユーザーが Harbor ユーザー インターフェイスに接続できるようにするには、Envoy サービス ロード バランサのアドレスを Harbor サービスのホスト名(harbor.yourdomain.com
など)にマッピングする必要があります。
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
のようになります。
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 が自己署名証明書を使用している場合は、https://harbor.yourdomain.com/api/v2.0/systeminfo/getcert
から Harbor CA 証明書をダウンロードし、ローカル マシンにインストールして、Docker がこの CA 証明書を信頼できるようにします。
/etc/docker/certs.d/harbor.yourdomain.com/ca.crt
として保存します。admin
ユーザーを使用して Harbor レジストリにログインします。プロンプトが表示されたら、Harbor パッケージをクラスタにインストールしたときに設定した harborAdminPassword
を入力します。
docker login harbor.yourdomain.com -u admin
ローカルでプルした既存のイメージにタグを付けます(nginx:1.7.9
など)。
docker tag nginx:1.7.9 harbor.yourdomain.com/library/nginx:1.7.9
イメージを Harbor レジストリにプッシュします。
docker push harbor.yourdomain.com/library/nginx:1.7.9
これで、Harbor CA 証明書がインストールされている任意のマシンの Harbor レジストリからイメージをプルできるようになりました。
docker pull harbor.yourdomain.com/library/nginx:1.7.9
展開後に Harbor パッケージの構成を変更する必要がある場合は、次の手順に従って、展開された Harbor パッケージを更新します。
harbor-data-values.yaml
で Harbor 構成を更新します。たとえば、persistence.persistentVolumeClaim.registry.size
値を更新することで、レジストリ ストレージの容量を増やすことができます。
インストール済みパッケージの構成を更新します。
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-NAMESPACE
はPackageInstall
リソースの名前空間です。