Harbor はオープンソースのコンテナ レジストリです。Tanzu Kubernetes クラスタにデプロイするコンテナ イメージのプライベート レジストリ ストアとして、Harbor レジストリ用 TKG 拡張機能をデプロイできます。

Harbor 拡張機能のバージョン依存関係

Tanzu Kubernetes Grid サービス によってプロビジョニングされる Tanzu Kubernetes クラスタに Harbor レジストリ用 TKG 拡張機能をインストールするには、次の最小要件を満たす必要があります。
コンポーネント 最小バージョン
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 拡張機能の前提条件

Harbor レジストリ用 TKG 拡張機能 v1.3.1 をデプロイする前に、次の前提条件を満たす必要があります。

Harbor 拡張機能の追加要件

Harbor レジストリ用 TKG 拡張機能 v1.3.1 には、インストール前およびインストール後の追加要件があります。
  • 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 レジストリ用 TKG 拡張機能は、いくつかのコンテナをクラスタにインストールします。詳細については、『 https://goharbor.io/』を参照してください。
コンテナ リソースの種類 レプリカ 説明
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 イメージ脆弱性スキャナ
TKG 拡張機能を使用して Harbor レジストリをインストールするには、次の手順を実行します。
  1. 拡張機能のすべての前提条件を満たしていることを確認します。Harbor 拡張機能の前提条件Harbor 拡張機能の追加要件を参照してください。
  2. Harbor 拡張機能のディレクトリに移動します。
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/registry/harbor
  3. tanzu-system-registry 名前空間、Harbor サービス アカウント、およびロールを作成します。
    kubectl apply -f namespace-role.yaml
  4. Harbor データ値ファイルを作成します。
    cp harbor-data-values.yaml.example harbor-data-values.yaml
  5. 必須のパスワードとシークレットを 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 ファイルを開き、必須のパスワードとシークレットを確認します。

  6. 必要に応じて、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 値が必要です。
  7. データ値を使用してシークレットを作成します。
    kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry
    secret/harbor-data-valuestanzu-system-registry 名前空間に作成されます。これを確認するには、次のコマンドを実行します。
    kubectl get secrets -n tanzu-system-registry
  8. Harbor 拡張機能をデプロイします。
    kubectl apply -f harbor-extension.yaml

    成功すると、app.kappctrl.k14s.io/harbor created が表示されます。

  9. 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 レジストリのデプロイのトラブルシューティングを参照してください。
  10. Harbor 拡張機能の詳細情報を確認します。
    kubectl get app harbor -n tanzu-system-registry -o yaml
  11. 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
  12. 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
  13. 必要に応じて、Harbor のインストールのトラブルシューティングを行います。Harbor レジストリのデプロイのトラブルシューティングを参照してください。

LoadBalancer タイプの Envoy サービスを使用する Harbor 向けの DNS の構成(NSX-T ネットワーク)

前提条件の Envoy サービスが LoadBalancer を介して公開される場合は、ロード バランサの外部 IP アドレスを取得し、Harbor の FQDN の DNS レコードを作成します。
  1. 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]}'
  2. 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
    
  3. Harbor 拡張機能のインストールを確認するために、Harbor にログインします。Harbor Web インターフェイスへのログインを参照してください。
  4. Envoy サービスのロード バランサの External-IP アドレスを Harbor の FQDN と Notary の FQDN にマッピングする 2 つの CNAME レコードを DNS サーバに作成します。
  5. 外部 DNS 拡張機能をインストールします。外部 DNS サービス検出のための TKG 拡張機能のデプロイと管理を参照してください。

NodePort タイプの Envoy サービスを使用する Harbor 向けの DNS の構成(vDS ネットワーク)

前提条件の Envoy サービスが NodePort を介して公開される場合は、ワーカー ノードの仮想マシンの IP アドレスを取得し、Harbor の FQDN の DNS レコードを作成します。
注: NodePort を使用するには、 harbor-data-values.yaml ファイルに正しい port.https 値を指定しておく必要があります。
  1. クラスタがプロビジョニングされている vSphere 名前空間 にコンテキストを切り替えます。
    kubectl config use-context VSPHERE-NAMESPACE
  2. クラスタ内のノードを一覧表示します。
    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
  3. ワーカー ノードの 1 つを選択し、次のコマンドを使用して記述します。
    kubectl describe virtualmachines tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm
  4. Vm Ip: 10.115.22.43 などの仮想マシンの IP アドレスを見つけます。
  5. 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
    
  6. Harbor 拡張機能のインストールを確認するために、Harbor にログインします。Harbor Web インターフェイスへのログインを参照してください。
  7. ワーカー ノードの IP アドレスを Harbor の FQDN と Notary の FQDN にマッピングする 2 つの CNAME レコードを DNS サーバに作成します。
  8. 外部 DNS 拡張機能をインストールします。外部 DNS サービス検出のための TKG 拡張機能のデプロイと管理を参照してください。

Harbor Web インターフェイスへのログイン

Harbor をインストールして構成したら、ログインして使用を開始します。
  1. Harbor レジストリの Web インターフェイス (https://core.harbor.domain)、または使用したホスト名にアクセスします。

    Harbor レジストリの Web インターフェイス。

  2. ユーザー名 admin と、生成され、harbor-data-values.yaml ファイルに入力したたパスワードを使用して Harbor にログインします。

    Harbor のログイン画面。ユーザー名 admin と生成されたパスワードが入力されています。

  3. Harbor ユーザー インターフェイスにアクセスできることを確認します。

    ログイン後に Harbor ユーザー インターフェイスの [プロジェクト] タブが表示されます。

  4. Harbor CA 証明書を取得します。

    Harbor インターフェイスで、[プロジェクト] > [ライブラリ] の順に選択するか、[新しいプロジェクト] を作成します。

    [レジストリ証明書] をクリックして、Harbor CA 証明書 (ca.crt) をダウンロードします。

  5. Harbor CA 証明書を Docker クライアントのトラスト ストアに追加して、Harbor レジストリとの間でコンテナ イメージをプッシュおよびプルできるようにします。組み込みの Harbor レジストリ 証明書を使用した Docker クライアントの構成を参照してください。
  6. 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 拡張機能を更新します。

  1. シークレットから Harbor データ値を取得します。
    kubectl get secret harbor-data-values -n tanzu-system-registry -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > harbor-data-values.yaml
    
  2. harbor-data-values.yaml 内の Harbor データ値を更新します。
  3. 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 拡張機能を適用します。
  4. 拡張機能のステータスを確認します。
    kubectl get app harbor -n tanzu-system-registry

    Contour が更新されると、Contour アプリケーションのステータスが Reconcile Succeeded に変更されます。

  5. 詳細なステータスを確認して、トラブルシューティングを行います。
    kubectl get app harbor -n tanzu-system-registry -o yaml

Harbor 拡張機能の削除

Tanzu Kubernetes クラスタから Harbor 拡張機能を削除します。

注: 手順を順番に実行します。Contour 拡張機能とアプリケーションを削除する前に、Contour 名前空間とロール オブジェクトを削除しないでください。Contour 名前空間とロール オブジェクトを削除すると、kapp-controller で使用されるサービス アカウントが削除されます。アプリケーションと拡張機能が削除される前にこのサービス アカウントを削除すると、システム エラーが発生する可能性があります。
  1. Harbor の拡張機能ファイルをダウンロードしたディレクトリに移動します。
    cd /extensions/registry/harbor/
  2. Harbor アプリケーションを削除します。
    kubectl delete app harbor -n tanzu-system-registry
    予期される結果:
    app.kappctrl.k14s.io "harbor" deleted
  3. Harbor アプリケーションが削除されていることを確認します。
    kubectl get app Harbor -n tanzu-system-registry
    予期される結果:アプリケーションが Not Found になります。
    apps.kappctrl.k14s.io "harbor" not found
  4. レジストリ名前空間を削除します。
    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 拡張機能がデプロイされている場合は、最新バージョンにアップグレードできます。
  1. Harbor の構成マップを取得します。
    kubectl get configmap harbor -n tanzu-system-harbor -o 'go-template={{ index .data "harbor.yaml" }}' > harbor-configmap.yaml
    
  2. 既存の Harbor 環境を削除します。Harbor 拡張機能の削除を参照してください。
  3. Harbor 拡張機能をデプロイします。Harbor 拡張機能のデプロイを参照してください。