Harbor 是開放原始碼容器登錄。可以將適用於 Harbor 登錄的 TKG 延伸部署為要部署到 Tanzu Kubernetes 叢集之容器映像的私人登錄存放區。

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 入口的 TKG 延伸
    • 如果要針對 主管叢集 使用 NSX-T 網路,請建立類型為 LoadBalancer 的 Envoy 服務。
    • 如果要針對 主管叢集 使用 vSphere vDS 網路,請建立類型為 LoadBalancer 或類型為 NodePort 的 Envoy 服務,具體取決於您的環境和需求。
  • Harbor 延伸需要 DNS。安裝 Harbor 延伸後,您需要設定 DNS。
    • 出於測試和驗證目的,請將 Harbor 和 Notary FQDN 新增至本機 /etc/hosts 檔案。以下指示說明了如何執行此操作。
    • 在生產環境中,Harbor 要求本機 DNS 伺服器 (例如 BIND) 或公有雲 (例如 AWS Route53、Azure DNS 或 Google CloudDNS) 上具有 DNS 區域。設定 DNS 後,若要向 DNS 伺服器自動登錄 Harbor FQDN,請安裝外部 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 網路,並因此使用類型為 LoadBalancer 的 Envoy 入口服務,請將此設定保留為預設 443

    如果要針對 主管叢集 使用 vDS 網路,並因此使用類型為 NodePort 的 Envoy 入口服務,請將此值設定為與 Envoy 節點連接埠相符。

    clair.enabled

    為了支援 Trivy,Clair 映像掃描程式已棄用。兩者皆在組態檔中啟用。

    透過將 Clair 的值設定為 false 來停用 Clair。

    persistence.persistentVolumeClaim. <component>.accessMode

    此設定有數個執行個體。

    預設值為 ReadWriteOnce

    ReadWriteMany 已排定為在即將推出的版本中受到支援。

    imageChartStorage.type

    預設值為 filesystem

    請根據需要進行變更,並設定所使用的儲存區。

    proxy 如果需要,請為 Harbor 設定 Proxy。如果已設定 Proxy,則需要預設 noProxy 值。
  7. 使用資料值建立密碼。
    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
  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 網路)

如果透過 LoadBalancer 公開必要 Envoy 服務,請取得負載平衡器的外部 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. 在 DNS 伺服器上建立兩個 CNAME 記錄,以將 Envoy 服務負載平衡器 External-IP 位址對應至 Harbor FQDN 和 Notary FQDN。
  5. 安裝外部 DNS 延伸。請參閱部署和管理適用於外部 DNS 服務探索的 TKG 延伸

使用類型為 NodePort 的 Envoy 服務為 Harbor 設定 DNS (vDS 網路)

如果透過 NodePort 公開必要 Envoy 服務,請取得 worker 節點的虛擬機器 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. 使用下列命令選擇其中一個 worker 節點並加以說明。
    kubectl describe virtualmachines tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm
  4. 找到虛擬機器的 IP 位址,例如 Vm Ip: 10.115.22.43
  5. 若要驗證 Harbor 延伸的安裝,請使用對應至 worker 節點 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. 在 DNS 伺服器上建立兩個 CNAME 記錄,以將 worker 節點 IP 位址對應至 Harbor FQDN 和 Notary FQDN。
  8. 安裝外部 DNS 延伸。請參閱部署和管理適用於外部 DNS 服務探索的 TKG 延伸

登入 Harbor Web 介面

安裝並設定 Harbor 後,請進行登入並開始使用。
  1. 存取位於 https://core.harbor.domain 的 Harbor 登錄 Web 介面或您使用的主機名稱。

    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。如果網繭狀態為 ImagePullBackOffImageCrashLoopBackOff,則無法提取容器映像。檢查資料值和延伸 YAML 檔案中的登錄 URL,並確保其正確無誤。

檢查容器記錄,其中 name-XXXXkubectl 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 configmap。
    kubectl get configmap harbor -n tanzu-system-harbor -o 'go-template={{ index .data "harbor.yaml" }}' > harbor-configmap.yaml
    
  2. 刪除現有的 Harbor 部署。請參閱刪除 Harbor 延伸
  3. 部署 Harbor 延伸。請參閱部署 Harbor 延伸