安裝 Harbor 以用於服務登錄

本主題說明如何將 Harbor 部署到 Tanzu Kubernetes Grid 中的工作負載叢集或共用服務。

附註

vSphere with Tanzu 上,可以在主管上安裝 Harbor,如在主管上安裝和配置 Harbor 中所述,也可以在各個工作負載叢集中安裝 Harbor,如下所述。
由於主管服務是共用的,因此vSphere with Tanzu不支援將套件部署到單獨的共用服務叢集。

Harbor v2.6.0 版本資訊中所述,Notary 和 Chartmuseum 已在 Harbor v2.6 中被取代,並計劃在未來的版本中移除。使用者應切換到 Sigstore Cosign 以進行容器簽署和驗證。

Harbor

Harbor 是開放原始碼、受信任、雲端原生的容器登錄,用於儲存、簽署和掃描內容。Tanzu Kubernetes Grid 包含 Harbor 已簽署且已封裝的二進位檔,可供您部署到工作負載叢集,以便為該叢集提供容器登錄服務。此 Harbor 套件新增了使用者通常需要的功能 (例如安全性、身分識別控制和管理),以延伸開放原始碼 Docker 散佈。

Tanzu Kubernetes Grid 包括 Harbor 的簽名二進位檔,您可以將其部署到:

  • 用於為該叢集提供容器登錄服務的工作負載叢集
  • 共用服務叢集,用於在具有獨立管理叢集的部署中為其他工作負載叢集提供容器登錄服務。

部署為共用服務時,Harbor 可用於由同一獨立管理叢集管理的所有工作負載叢集。要將 Harbor 作為共用服務實施,請將其部署到專用於執行共用服務的特殊叢集中。每個管理叢集只能有一個共用服務叢集。

Harbor 登錄和 ExternalDNS

VMware 建議隨著 Harbor 登錄一起將 ExternalDNS 安裝在已啟用負載平衡的基礎結構上,尤其是在 Harbor 可用性很重要的生產或其他環境中。

如果輸入負載平衡器的 IP 位址變更,ExternalDNS 會自動取得變更,並將新位址重新對應到 Harbor 主機名稱。這樣就無須如連線到 Harbor 使用者介面中所述手動重新對應位址。

必要條件

準備叢集以部署 Harbor

若要準備叢集以部署 Harbor,請執行以下動作:

  1. kubectl 的內容設定為工作負載叢集或共用服務叢集。例如:

    kubectl config use-context tkg-services-admin@tkg-services
    
  2. 如果叢集尚未安裝 standard 套件存放庫,請安裝它:

    附註

    如果要將以計劃為基礎的叢集 (舊版) 為目標,請跳過此步驟。對於以計劃為基礎的叢集,會在 tanzu-package-repo-global 命名空間中的每個叢集中,自動啟用 tanzu-standard 套件存放庫。

    tanzu package repository add tanzu-standard --url PACKAGE-REPOSITORY-ENDPOINT --namespace tkg-system
    

    其中,PACKAGE-REPOSITORY-ENDPOINTstandard 套件存放庫的 URL。對於此版本,URL 為 projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1

    若要從 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-VERSIONtanzu package available list 中列出的套件版本,但以 _ 字元替代了 + 字元。此外還必須包括首碼 v。例如,v2.6.3_vmware.1-tkg.1

    例如:

    imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:v2.6.3_vmware.1-tkg.1 -o /tmp/harbor-package-v2.6.3_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.6.3,請執行:

        image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.2.6.3+vmware.1-tkg.1 -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
        imgpkg pull -b $image_url -o /tmp/harbor-package-2.6.3
        bash /tmp/harbor-package-2.6.3/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.persistentVolumeClaim 下,對於 registryjobservicedatabaseredistrivy,將 storageClass 設定為 kubectl get sc 傳回的儲存區設定檔。
        附註

        使用 azure-file 儲存區類別時,您無法在掛接磁碟後變更檔案系統權限,因為存在 Azure 說明文件中使用 Azure 檔案時出現「無法變更權限」錯誤中所述的 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 設定為 yamljsontable

      例如:

      tanzu package available get harbor.tanzu.vmware.com/2.6.3+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-packagestanzu-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.6.3+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    
  5. 如果使用 ebs.csi.aws.com 作為 storageClass,請執行以下操作之一:

    • 將儲存區類別 VolumeBoundModeImmediate 變更為 WaitForFirstConsumer

      • 請注意,這是一個叢集範圍的操作,可能會影響 Harbor 以外的服務。
    • 修補 Harbor Scandata Volume EmptyDir Overlay,如下所示。此覆疊會將 scandata 磁碟區設為空目錄,以避免在將 jobLog 磁碟區和 scandata 磁碟區掛接到同一個 jobservice pod 時影響 scandata 匯出功能並導致 AZ 衝突:

      1. 建立檔案 scandata-empty-dir-overlay.yaml,其中包含下方的 Harbor Scandata 磁碟區 EmptyDir 覆疊程式碼。

      2. 為覆疊建立通用密碼:

        kubectl -n test  create secret generic scandata-empty-dir-overlay -o yaml --dry-run=client --from-file=scandata-emptyDir-overlay.yaml | kubectl apply -f -
        
      3. 使用密碼來修補 Harbor 套件:
        kubectl -n test annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0=scandata-empty-dir-overlay
        
      4. 檢查套件狀態是否為 isReconciling
        kubectl get pkgi harbor -n my-packages
        
      5. 如果套件狀態不是 isReconciling,請刪除現有的 Harbor Pod,以便它們重新建立:
        kubectl delete pods --all -n my-packages
        
  6. 確認已安裝 harbor 套件:

    tanzu package installed list -A
    

    若要查看有關套件的更多詳細資料,也可以執行:

    tanzu package installed get harbor --namespace PACKAGE-NAMESPACE
    

    其中,PACKAGE-NAMESPACE 是安裝 harbor 套件的命名空間。

  7. 確認 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
    
  8. 列出叢集中的所有網繭,以確認 Harbor 服務正在執行:

    kubectl get pods -A
    

    tanzu-system-registry 命名空間中,您應該會看到 harbor coredatabasejobservicenotaryportalredisregistrytrivy 服務在網繭中執行,名稱類似如下:

    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
    [...]
    
  9. tanzu-system-registry 命名空間中的 harbor-tls 密鑰取得 Harbor CA 憑證:

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

    複製輸出。

連線到 Harbor 使用者介面

Harbor UI 透過叢集的 tanzu-system-ingress 命名空間中執行的 Envoy 服務負載平衡器公開。若要允許使用者連線到 Harbor UI,必須將 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 上,Envoy 服務是透過 NodePort 而非 LoadBalancer 公開,因此上述輸出會空白,您可以改用叢集中任何工作節點的 IP 位址。在使用 NSX ALB 的 vSphere 上,Envoy 服務的負載平衡器 IP 位址類似 20.54.226.44

  2. 將 Envoy 服務負載平衡器的位址對應到 Harbor 服務的主機名稱。對於在 vSphere 上執行的叢集,必須在 /etc/hosts 中新增 IP 到主機名稱的對應,或在 DNS 伺服器中新增對應的 A 記錄。例如,如果 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

現在,使用者可以在網頁瀏覽器中導覽至 https://harbor.yourdomain.com 來連線到 Harbor UI,並使用您在 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 上,在憑證檔案上按一下滑鼠右鍵,然後選取安裝憑證
  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.6.3+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    

將使用您新增的值協調 Harbor 套件。kapp-controller 套用變更可能需要長達五分鐘的時間。

如需 tanzu package installed update 命令的詳細資訊,請參閱安裝和管理套件中的更新套件。您可以使用此命令更新已安裝的套件版本和組態。

Harbor Scandata 磁碟區 EmptyDir 覆疊

scandata-empty-dir-overlay.yaml

#@ load("@ytt:overlay", "overlay")
​
#@overlay/match by=overlay.and_op(overlay.subset({"kind": "Deployment"}), overlay.subset({"metadata": {"name": "harbor-jobservice"}}))
---
spec:
  template:
    spec:
      volumes:
        #@overlay/match by="name"
        #@overlay/remove
        - name: job-scandata-exports
        #@overlay/append
        - name: job-scandata-exports
          emptyDir:
            sizeLimit: 500Mi
check-circle-line exclamation-circle-line close-line
Scroll to top icon