次の手順に従って、vSphere 7.x 用の TKr を使用してプロビジョニングされた TKG クラスタに Harbor をインストールします。

前提条件

vSphere 7.x の TKr に標準パッケージをインストールするためのワークフローを参照してください。

Harbor には HTTP/S Ingress が必要です。Harbor サービスは Contour パッケージの Envoy サービスを介して公開されます。前提条件として、Contour パッケージをデプロイします。 vSphere 7.x 用の TKr への Contour のインストールを参照してください。
  • スーパーバイザー に対して NSX ネットワークを使用している場合は、LoadBalancer タイプの Envoy サービスを作成します。
  • スーパーバイザー に対して vSphere Distributed Switch ネットワークを使用している場合は、環境と要件に応じて LoadBalancer タイプまたは NodePort タイプの Envoy サービスを作成します。
Harbor 拡張機能には、DNS が必要です。テストと検証のために、Harbor および Notary の FQDN をローカル /etc/hosts ファイルに追加します。以下の手順では、これを行う方法を説明します。

本番環境の Harbor では、BIND などのローカル DNS サーバ、または AWS Route53 や Azure DNS などのパブリック クラウドのいずれかの DNS ゾーンが必要です。DNS を設定した後、Harbor の FQDN を DNS サーバに自動的に登録するには、ExternalDNS 拡張機能をインストールします。vSphere 7.x 用の TKr への ExternalDNS のインストールを参照してください。

Harbor のインストール

標準パッケージを使用して Harbor レジストリをインストールするには、次の手順を実行します。

  1. リポジトリで使用可能な Harbor のバージョンを一覧表示します。
    kubectl get packages -n tkg-system | grep harbor
  2. harbor.yaml 仕様を作成します。
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: harbor-sa
      namespace: tkg-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: habor-role-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
      - kind: ServiceAccount
        name: harbor-sa
        namespace: tkg-system
    ---
    apiVersion: packaging.carvel.dev/v1alpha1
    kind: PackageInstall
    metadata:
      name: harbor
      namespace: tkg-system
    spec:
      serviceAccountName: harbor-sa
      packageRef:
        refName: harbor.tanzu.vmware.com
        versionSelection:
          constraints: 2.7.1+vmware.1-tkg.1 #PKG-VERSION
      values:
      - secretRef:
          name: harbor-data-values
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: harbor-data-values
      namespace: harbor-registry
    stringData:
      values.yml: |
        namespace: tanzu-system-registry
        hostname: <ENTER-HARBOR-FQDN>
        port:
          https: 443
        logLevel: info
        tlsCertificate:
          tls.crt: ""
          tls.key: ""
          ca.crt:
        tlsCertificateSecretName:
        enableContourHttpProxy: true
        harborAdminPassword: <ENTER-STRONG-PASSWORD-HERE>
        secretKey: <ENTER-SECRET-KEY>
        database:
          password: <ENTER-STRONG-PASSWORD-HERE>
          shmSizeLimit:
          maxIdleConns:
          maxOpenConns:
        exporter:
          cacheDuration:
        core:
          replicas: 1
          secret: <ENTER-SECRET>
          xsrfKey: <ENTER-XSRF-KEY-WHICH-IS-AN-ALPHANUMERIC-STRING-WITH-32-CHARS>
        jobservice:
          replicas: 1
          secret: <ENTER-SECRET>
        registry:
          replicas: 1
          secret: <ENTER-SECRET>
        trivy:
          enabled: true
          replicas: 1
          gitHubToken: ""
          skipUpdate: false
        persistence:
          persistentVolumeClaim:
            registry:
              existingClaim: ""
              storageClass: "<ENTER-STORAGE-CLASS>"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 50Gi
            jobservice:
              existingClaim: ""
              storageClass: "<ENTER-STORAGE-CLASS>"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
            database:
              existingClaim: ""
              storageClass: "<ENTER-STORAGE-CLASS>"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
            redis:
              existingClaim: ""
              storageClass: "<ENTER-STORAGE-CLASS>"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
            trivy:
              existingClaim: ""
              storageClass: "<ENTER-STORAGE-CLASS>"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
        proxy:
          httpProxy:
          httpsProxy:
          noProxy: 127.0.0.1,localhost,.local,.internal
        pspNames: vmware-system-restricted
        network:
          ipFamilies: ["IPv4", "IPv6"]
  3. 環境に適した値(ホスト名、パスワード、シークレット、ストレージ クラスなど)を使用して、harbor.yaml 仕様の harbor-data-values シークレットをカスタマイズします。

    詳細については、「Harbor パッケージ リファレンス」を参照してください。

  4. Harbor をインストールします。
    kubectl apply -f harbor.yaml
  5. Harbor のインストールを確認します。
    kubectl get all -n harbor-registry

Envoy LoadBalancer を使用する Harbor 向けの DNS の構成(NSX ネットワーク)

前提条件の 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
    #TKG Harbor with Envoy Load Balancer IP
    10.195.141.17 core.harbor.domain
    10.195.141.17 core.notary.harbor.domain
    
  3. Harbor 拡張機能のインストールを確認するために、Harbor にログインします。
  4. Envoy サービスのロード バランサの External-IP アドレスを Harbor の FQDN と Notary の FQDN にマッピングする 2 つの CNAME レコードを DNS サーバに作成します。
  5. 外部 DNS 拡張機能をインストールします。

Envoy NodePort を使用する Harbor 向けの DNS の構成(Distributed Switch ネットワーク)

前提条件の 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
  3. ワーカー ノードの 1 つを選択し、次のコマンドを使用して記述します。
    kubectl describe virtualmachines tkg2-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
    #TKG Harbor with Envoy NodePort
    10.115.22.43 core.harbor.domain
    10.115.22.43 core.notary.harbor.domain
    
  6. Harbor 拡張機能のインストールを確認するために、Harbor にログインします。
  7. ワーカー ノードの IP アドレスを Harbor の FQDN と Notary の FQDN にマッピングする 2 つの CNAME レコードを DNS サーバに作成します。
  8. 外部 DNS 拡張機能をインストールします。

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 レジストリとの間でコンテナ イメージをプッシュおよびプルできるようにします。TKG サービス クラスタでのプライベート レジストリの使用を参照してください。
  6. Harbor の使用方法の詳細については、Harbor のドキュメントを参照してください。