Harbor はオープンソースのコンテナ レジストリです。Tanzu Kubernetes クラスタにデプロイするコンテナ イメージのプライベート レジストリ ストアとして、Harbor レジストリ用 TKG 拡張機能をデプロイできます。
Harbor 拡張機能のバージョン依存関係
コンポーネント | 最小バージョン |
---|---|
vCenter Server | 7.0.2.00400 |
vSphere 名前空間 | 0.0.10-18245956 |
スーパーバイザー クラスタ | v1.20.2+vmware.1-vsc0.0.10-18245956 |
Tanzu Kubernetes リリース | v1.20.7+vmware.1-tkg.1.7fb9067 |
Harbor 拡張機能の前提条件
- クラスタをプロビジョニングします。TKGS v1alpha2 API を使用して Tanzu Kubernetes クラスタをプロビジョニングするためのワークフローを参照してください。
- クラスタに接続します。vCenter Single Sign-On ユーザーとして Tanzu Kubernetes クラスタに接続を参照してください。
- kubectl コマンドを実行するクライアント ホストへのTKG 拡張機能 v1.3.1 バンドルのダウンロードを実行します。
- ターゲット クラスタへのTKG 拡張機能の前提条件のインストールを実行します。
Harbor 拡張機能の追加要件
- Harbor 拡張機能には、デフォルトの PVC ストレージ クラスが必要です。TKG 拡張機能のパーシステント ストレージの要件の確認を参照してください。
- Harbor 拡張機能には、HTTP/S 入力が必要です。具体的には、Harbor サービスは Contour 拡張機能の Envoy サービスを介して公開されます。前提条件として、Contour 拡張機能をデプロイします。Contour Ingress 用 TKG 拡張機能のデプロイと管理を参照してください。
- スーパーバイザー クラスタ に対して NSX-T ネットワークを使用している場合は、LoadBalancer タイプの Envoy サービスを作成します。
- スーパーバイザー クラスタ に対して vSphere vDS ネットワークを使用している場合は、環境と要件に応じて LoadBalancer タイプまたは NodePort タイプの Envoy サービスを作成します。
- Harbor 拡張機能には、DNS が必要です。Harbor 拡張機能のインストールが終わったら、DNS を構成する必要があります。
- テストと検証のために、Harbor および Notary の FQDN をローカル /etc/hosts ファイルに追加します。以下の手順では、これを行う方法を説明します。
- 本番環境の Harbor では、BIND などのローカル DNS サーバ、または AWS Route53、Azure DNS、Google CloudDNS などのパブリック クラウドのいずれかの DNS ゾーンが必要です。DNS を設定した後、Harbor の FQDN を DNS サーバに自動的に登録するには、外部 DNS 拡張機能をインストールします。外部 DNS サービス検出のための TKG 拡張機能のデプロイと管理を参照してください。
Harbor 拡張機能のデプロイ
コンテナ | リソースの種類 | レプリカ | 説明 |
---|---|---|---|
harbor-core |
デプロイ | 1 | Envoy 用の管理および構成サーバ |
harbor-database |
ポッド | 1 | Postgres データベース |
harbor-jobservice |
デプロイ | 1 | Harbor ジョブ サービス |
harbor-notary-server |
デプロイ | 1 | Harbor Notary サービス |
harbor-notary-signer |
デプロイ | 1 | Harbor Notary |
harbor-portal |
デプロイ | 1 | Harbor Web インターフェイス |
harbor-redis |
ポッド | 1 | Harbor Redis インスタンス |
harbor-registry |
デプロイ | 2 | Harbor コンテナ レジストリ インスタンス |
harbor-trivy |
ポッド | 1 | Harbor イメージ脆弱性スキャナ |
- 拡張機能のすべての前提条件を満たしていることを確認します。Harbor 拡張機能の前提条件とHarbor 拡張機能の追加要件を参照してください。
- Harbor 拡張機能のディレクトリに移動します。
cd /tkg-extensions-v1.3.1+vmware.1/extensions/registry/harbor
tanzu-system-registry
名前空間、Harbor サービス アカウント、およびロールを作成します。kubectl apply -f namespace-role.yaml
- Harbor データ値ファイルを作成します。
cp harbor-data-values.yaml.example harbor-data-values.yaml
- 必須のパスワードとシークレットを
harbor-data-values.yaml
に指定します。Harbor レジストリには、この表に記載されたいくつかのパスワードとシークレットが必要です。パスワードまたはシークレット 説明 harborAdminPassword
Harbor 管理者の初期パスワード。 secretKey
暗号化に使用されるプライベート キー。16 文字の文字列にする必要があります。 database.password
Postgres データベースの初期パスワード。 core.secret
コア サーバが他のコンポーネントと通信するときに使用されるシークレット。 core.xsrfKey
XSRF キー。32 文字の文字列にする必要があります。 jobservice.secret
ジョブ サービスが他のコンポーネントと通信するときに使用されるシークレット。 registry.secret
クライアントおよびレジストリ ストレージ バックエンドからアップロード状態を保護するために使用されるシークレット。 harbor-data-values.yaml
ファイルにポピュレートされるようにするには、次のコマンドを実行します。bash generate-passwords.sh harbor-data-values.yaml
成功すると、次のメッセージが表示されます。Successfully generated random passwords and secrets in harbor-data-values.yaml
harbor-data-values.yaml
ファイルを開き、必須のパスワードとシークレットを確認します。 - 必要に応じて、
harbor-data-values.yaml
にその他の Harbor 構成値を指定します。一般的に更新される値は、次のとおりです。構成フィールド 説明 hostname
デフォルトの Harbor ホスト名は、
core.harbor.domain
です。必要に応じて、要件に合わせてこの値を変更します。
port.https
デフォルトは
443
です。スーパーバイザー クラスタ に NSX-T ネットワークを使用しているために Envoy Ingress サービスが LoadBalancer タイプである場合は、この設定をデフォルトの
443
のままにします。スーパーバイザー クラスタ に vDS ネットワークを使用しているために Envoy Ingress サービスが NodePort タイプの場合は、この値を Envoy ノード ポートと一致するように設定します。
clair.enabled
Clair イメージ スキャナは廃止され、Trivy が使用されます。構成ファイルでは両方とも有効になっています。
Clair の値を
false
に設定して無効にします。persistence.persistentVolumeClaim. <component>.accessMode
この設定には、いくつかのインスタンスがあります。
デフォルトは
ReadWriteOnce
です。ReadWriteMany
は、今後のリリースでサポートされる予定です。imageChartStorage.type
デフォルトは
filesystem
です。必要に応じて変更し、使用しているストレージを構成します。
proxy
必要に応じて、Harbor 用にプロキシを構成します。プロキシを構成する場合は、デフォルトの noProxy
値が必要です。 - データ値を使用してシークレットを作成します。
kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry
secret/harbor-data-values
がtanzu-system-registry
名前空間に作成されます。これを確認するには、次のコマンドを実行します。kubectl get secrets -n tanzu-system-registry
- Harbor 拡張機能をデプロイします。
kubectl apply -f harbor-extension.yaml
成功すると、
app.kappctrl.k14s.io/harbor created
が表示されます。 - Harbor アプリケーションのステータスを確認します。
kubectl get app harbor -n tanzu-system-registry
成功すると、ステータスがReconciling
からReconcile succeeded
に変わります。NAME DESCRIPTION SINCE-DEPLOY AGE harbor Reconciling 96s 98s
NAME DESCRIPTION SINCE-DEPLOY AGE harbor Reconcile succeeded 39s 2m29s
ステータスがReconcile failed
の場合は、Harbor レジストリのデプロイのトラブルシューティングを参照してください。 - Harbor 拡張機能の詳細情報を確認します。
kubectl get app harbor -n tanzu-system-registry -o yaml
- Harbor デプロイ オブジェクトのステータスを確認します。
kubectl get deployments -n tanzu-system-registry
成功すると、次のデプロイが表示されます。
NAME READY UP-TO-DATE AVAILABLE AGE harbor-core 1/1 1 1 5m16s harbor-jobservice 1/1 1 1 5m16s harbor-notary-server 1/1 1 1 5m16s harbor-notary-signer 1/1 1 1 5m16s harbor-portal 1/1 1 1 5m16s harbor-registry 1/1 1 1 5m16s
- Harbor ポッドのステータスを確認します。
kubectl get pods -n tanzu-system-registry
NAME READY STATUS RESTARTS AGE harbor-core-9cbf4b79d-gxvgx 1/1 Running 0 7m11s harbor-database-0 1/1 Running 0 7m11s harbor-jobservice-6b656ccb95-lm47d 1/1 Running 0 7m11s harbor-notary-server-8494c684db-gm7jf 1/1 Running 0 7m11s harbor-notary-signer-6f96b549d4-dzcnm 1/1 Running 0 7m11s harbor-portal-5b8f4ddbd-qdnp2 1/1 Running 0 7m11s harbor-redis-0 1/1 Running 0 7m11s harbor-registry-688894c58d-72txm 2/2 Running 0 7m11s harbor-trivy-0 1/1 Running 0 7m11s
- 必要に応じて、Harbor のインストールのトラブルシューティングを行います。Harbor レジストリのデプロイのトラブルシューティングを参照してください。
LoadBalancer タイプの Envoy サービスを使用する Harbor 向けの DNS の構成(NSX-T ネットワーク)
- LoadBalancer タイプの Envoy サービスの
External-IP
アドレスを取得します。kubectl get service envoy -n tanzu-system-ingress
返されたExternal-IP
アドレスが次の例のように表示されます。NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE envoy LoadBalancer 10.99.25.220 10.195.141.17 80:30437/TCP,443:30589/TCP 3h27m
または、次のコマンドを使用してExternal-IP
アドレスを取得することもできます。kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
- Harbor 拡張機能のインストールを確認するには、次の例のように、ロード バランサの
External-IP
アドレスにマッピングされる Harbor および Notary の FQDN を指定してローカルの/etc/hosts
ファイルを更新します。127.0.0.1 localhost 127.0.1.1 ubuntu # TKGS Harbor with Envoy Load Balancer IP 10.195.141.17 core.harbor.domain 10.195.141.17 core.notary.harbor.domain
- Harbor 拡張機能のインストールを確認するために、Harbor にログインします。Harbor Web インターフェイスへのログインを参照してください。
- Envoy サービスのロード バランサの
External-IP
アドレスを Harbor の FQDN と Notary の FQDN にマッピングする 2 つの CNAME レコードを DNS サーバに作成します。 - 外部 DNS 拡張機能をインストールします。外部 DNS サービス検出のための TKG 拡張機能のデプロイと管理を参照してください。
NodePort タイプの Envoy サービスを使用する Harbor 向けの DNS の構成(vDS ネットワーク)
harbor-data-values.yaml
ファイルに正しい
port.https
値を指定しておく必要があります。
- クラスタがプロビジョニングされている vSphere 名前空間 にコンテキストを切り替えます。
kubectl config use-context VSPHERE-NAMESPACE
- クラスタ内のノードを一覧表示します。
kubectl get virtualmachines
クラスタ ノードが次のように表示されます。NAME POWERSTATE AGE tkgs-cluster-X-control-plane-6dgln poweredOn 6h7m tkgs-cluster-X-control-plane-j6hq6 poweredOn 6h10m tkgs-cluster-X-control-plane-xc25f poweredOn 6h14m tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm poweredOn 6h12m tkgs-cluster-X-workers-9twdr-59bc54dc97-pjptr poweredOn 6h12m tkgs-cluster-X-workers-9twdr-59bc54dc97-t45mn poweredOn 6h12m
- ワーカー ノードの 1 つを選択し、次のコマンドを使用して記述します。
kubectl describe virtualmachines tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm
Vm Ip: 10.115.22.43
などの仮想マシンの IP アドレスを見つけます。- Harbor 拡張機能のインストールを確認するには、次の例のように、ワーカー ノードの IP アドレスにマッピングされる Harbor および Notary の FQDN を指定してローカルの
/etc/hosts
ファイルを更新します。127.0.0.1 localhost 127.0.1.1 ubuntu # TKGS Harbor with Envoy NodePort 10.115.22.43 core.harbor.domain 10.115.22.43 core.notary.harbor.domain
- Harbor 拡張機能のインストールを確認するために、Harbor にログインします。Harbor Web インターフェイスへのログインを参照してください。
- ワーカー ノードの IP アドレスを Harbor の FQDN と Notary の FQDN にマッピングする 2 つの CNAME レコードを DNS サーバに作成します。
- 外部 DNS 拡張機能をインストールします。外部 DNS サービス検出のための TKG 拡張機能のデプロイと管理を参照してください。
Harbor Web インターフェイスへのログイン
- Harbor レジストリの Web インターフェイス (https://core.harbor.domain)、または使用したホスト名にアクセスします。
- ユーザー名 admin と、生成され、
harbor-data-values.yaml
ファイルに入力したたパスワードを使用して Harbor にログインします。 - Harbor ユーザー インターフェイスにアクセスできることを確認します。
- Harbor CA 証明書を取得します。
Harbor インターフェイスで、[新しいプロジェクト] を作成します。
の順に選択するか、[レジストリ証明書] をクリックして、Harbor CA 証明書 (ca.crt) をダウンロードします。
- Harbor CA 証明書を Docker クライアントのトラスト ストアに追加して、Harbor レジストリとの間でコンテナ イメージをプッシュおよびプルできるようにします。組み込みの Harbor レジストリ 証明書を使用した Docker クライアントの構成を参照してください。
- Harbor の使用方法の詳細については、Harbor のドキュメントを参照してください。
Harbor レジストリのデプロイのトラブルシューティング
デプロイまたは調整が失敗した場合は、kubectl get pods -n tanzu-system-registry
を実行してポッドのステータスを確認します。harbor
ポッドは、Running
である必要があります。ポッドのステータスが ImagePullBackOff
または ImageCrashLoopBackOff
の場合は、コンテナ イメージをプルできていません。データ値と拡張機能 YAML ファイルに記述されているリポジトリ URL を確認し、これらが正確であることを確認します。
name-XXXX
は、
kubectl get pods -A
を実行したときの一意のポッド名です。
kubectl logs pod/harbor-XXXXX -c harbor -n tanzu-system-registry
Harbor 拡張機能の更新
Tanzu Kubernetes クラスタにデプロイされている Contour 拡張機能を更新します。
- シークレットから Harbor データ値を取得します。
kubectl get secret harbor-data-values -n tanzu-system-registry -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > harbor-data-values.yaml
harbor-data-values.yaml
内の Harbor データ値を更新します。- Harbor データ値のシークレットを更新します。
kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry -o yaml --dry-run | kubectl replace -f-
Harbor 拡張機能が新しいデータ値で調整されます。注: デフォルトでは、kapp-controller によってアプリケーションが 5 分ごとに同期されます。更新は 5 分以内に有効になります。更新をすぐに有効にするには、harbor-extension.yaml
内のsyncPeriod
の値を小さくし、kubectl apply -f harbor-extension.yaml
を使用して Contour 拡張機能を適用します。 - 拡張機能のステータスを確認します。
kubectl get app harbor -n tanzu-system-registry
Contour が更新されると、Contour アプリケーションのステータスが
Reconcile Succeeded
に変更されます。 - 詳細なステータスを確認して、トラブルシューティングを行います。
kubectl get app harbor -n tanzu-system-registry -o yaml
Harbor 拡張機能の削除
Tanzu Kubernetes クラスタから Harbor 拡張機能を削除します。
- Harbor の拡張機能ファイルをダウンロードしたディレクトリに移動します。
cd /extensions/registry/harbor/
- Harbor アプリケーションを削除します。
kubectl delete app harbor -n tanzu-system-registry
予期される結果:app.kappctrl.k14s.io "harbor" deleted
- Harbor アプリケーションが削除されていることを確認します。
kubectl get app Harbor -n tanzu-system-registry
予期される結果:アプリケーションがNot Found
になります。apps.kappctrl.k14s.io "harbor" not found
- レジストリ名前空間を削除します。
Harbor 拡張機能とアプリケーションが完全に削除されていることを確認した後でないと、名前空間とロール オブジェクトを安全に削除できません。
kubectl delete -f namespace-role.yaml
予期される結果:Harbor がデプロイされている名前空間と、関連付けられたロール ベースのアクセス コントロール オブジェクトが削除されます。namespace "tanzu-system-registry" deleted serviceaccount "harbor-extension-sa" deleted role.rbac.authorization.k8s.io "harbor-extension-role" deleted rolebinding.rbac.authorization.k8s.io "harbor-extension-rolebinding" deleted clusterrole.rbac.authorization.k8s.io "harbor-extension-cluster-role" deleted clusterrolebinding.rbac.authorization.k8s.io "harbor-extension-cluster-rolebinding" deleted
Harbor 拡張機能のアップグレード
- Harbor の構成マップを取得します。
kubectl get configmap harbor -n tanzu-system-harbor -o 'go-template={{ index .data "harbor.yaml" }}' > harbor-configmap.yaml
- 既存の Harbor 環境を削除します。Harbor 拡張機能の削除を参照してください。
- Harbor 拡張機能をデプロイします。Harbor 拡張機能のデプロイを参照してください。