本主題說明如何將 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 是開放原始碼、受信任、雲端原生的容器登錄,用於儲存、簽署和掃描內容。Tanzu Kubernetes Grid 包含 Harbor 已簽署且已封裝的二進位檔,可供您部署到工作負載叢集,以便為該叢集提供容器登錄服務。此 Harbor 套件新增了使用者通常需要的功能 (例如安全性、身分識別控制和管理),以延伸開放原始碼 Docker 散佈。
Tanzu Kubernetes Grid 包括 Harbor 的簽名二進位檔,您可以將其部署到:
部署為共用服務時,Harbor 可用於由同一獨立管理叢集管理的所有工作負載叢集。要將 Harbor 作為共用服務實施,請將其部署到專用於執行共用服務的特殊叢集中。每個管理叢集只能有一個共用服務叢集。
VMware 建議隨著 Harbor 登錄一起將 ExternalDNS 安裝在已啟用負載平衡的基礎結構上,尤其是在 Harbor 可用性很重要的生產或其他環境中。
如果輸入負載平衡器的 IP 位址變更,ExternalDNS 會自動取得變更,並將新位址重新對應到 Harbor 主機名稱。這樣就無須如連線到 Harbor 使用者介面中所述手動重新對應位址。
kubectl 和 Carvel 工具。如需相關指示,請參閱安裝 Tanzu CLI 和其他工具以用於 vSphere with Tanzu 主管或安裝 Tanzu CLI 和其他工具以用於獨立管理叢集。tanzu login 命令登入 Tanzu CLI。附註您無法在網際網路受限的環境中,將 Harbor 的 Proxy 快取功能用於執行 Tanzu Kubernetes Grid v2.2。您仍然可以使用 Harbor Proxy 快取來代理 Tanzu Kubernetes Grid 之前版本中的映像,以及應用程式映像等非 Tanzu 映像。
若要準備叢集以部署 Harbor,請執行以下動作:
將 kubectl 的內容設定為工作負載叢集或共用服務叢集。例如:
kubectl config use-context tkg-services-admin@tkg-services
如果叢集無已安裝 Harbor 軟體套件的套件存放庫 (例如 tanzu-standard 存放庫),請安裝一個:
附註如果要將以計劃為基礎的叢集 (舊版) 為目標,請跳過此步驟。對於以計劃為基礎的叢集,會在
tanzu-package-repo-global命名空間中的每個叢集中,自動啟用tanzu-standard套件存放庫。
tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
其中:
PACKAGE-REPO-NAME 是軟體套件存放庫的名稱,例如 tanzu-standard 或使用 ADDITIONAL_IMAGE_REGISTRY 變數設定的私人映像登錄名稱。PACKAGE-REPO-ENDPOINT 是套件存放庫的 URL。
tanzu-standard URL 為 projects.registry.vmware.com/tkg/packages/standard/repo:v2.2.0。若要從 Tanzu CLI 取得此值,請參閱列出套件存放庫,或在 Tanzu Mission Control 中查看叢集 (Cluster) 窗格中的附加元件 (Addons) > 存放庫 (Repositories) 清單。安裝 cert-manager 和 Contour 套件 (如果尚未安裝)。如需相關指示,請參閱安裝 Contour 以用於入口控制。
(選用) 安裝 ExternalDNS 套件。如需相關指示,請參閱安裝 ExternalDNS 以用於服務探索。
繼續下面的將 Harbor 部署到叢集。
遵循此程序將 Harbor 部署到工作負載或共用服務叢集:
確認 Harbor 套件在叢集中可用:
tanzu package available list -A
擷取可用套件的版本:
tanzu package available list harbor.tanzu.vmware.com -A
從 standard 套件存放庫下載 Harbor 套件:
imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:PACKAGE-VERSION -o /tmp/harbor-package-PACKAGE-VERSION
其中,PACKAGE-VERSION 是 tanzu package available list 中列出的套件版本,但以 _ 字元替代了 + 字元。此外還必須包括首碼 v。例如,v2.7.1_vmware.1-tkg.1。
例如:
imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:v2.7.1_vmware.1-tkg.1 -o /tmp/harbor-package-v2.7.1_vmware.1-tkg.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.7.1,請執行:
image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.2.7.1+vmware.1-tkg.1 -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
imgpkg pull -b $image_url -o /tmp/harbor-package-2.7.1
bash /tmp/harbor-package-2.7.1/config/scripts/generate-passwords.sh harbor-data-values.yaml
若要設定您自己的密碼和密鑰,請在 harbor-data-values.yaml 檔案中更新以下項目:
harborAdminPasswordsecretKeydatabase.passwordcore.secretcore.xsrfKeyjobservice.secretregistry.secret在 harbor-data-values.yaml 檔案中指定其他設定。
hostname 設定設為要用於存取 Harbor 的主機名稱。例如,harbor.yourdomain.com。tls.crt、tls.key 和 ca.crt 設定更新為您的憑證、金鑰和 CA 憑證的內容。憑證可以由受信任的授權構簽署,也可以自我簽署。如果這些都保留空白,Tanzu Kubernetes Grid 會自動產生自我簽署憑證。generate-passwords.sh 指令碼,則可以選擇將 harborAdminPassword 更新為較易記住的內容。以下情況需要非空白值:
storageClass: 在 persistence.persistentVolumeClaim 下,對於 registry、jobservice、database、redis 和 trivy,將 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 設定為 yaml、json 或 table。
例如:
tanzu package available get harbor.tanzu.vmware.com/2.7.1+vmware.1-tkg.1 --values-schema
移除 harbor-data-values.yaml 檔案中的所有註解:
yq -i eval '... comments=""' harbor-data-values.yaml
安裝套件:
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-packages 或 tanzu-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.7.1+vmware.1-tkg.1 \
--values-file harbor-data-values.yaml \
--namespace my-packages
確認已安裝 harbor 套件:
tanzu package installed list -A
若要查看有關套件的更多詳細資料,也可以執行:
tanzu package installed get harbor --namespace PACKAGE-NAMESPACE
其中,PACKAGE-NAMESPACE 是安裝 harbor 套件的命名空間。
確認 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
列出叢集中的所有網繭,以確認 Harbor 服務正在執行:
kubectl get pods -A
在 tanzu-system-registry 命名空間中,您應該會看到 harbor core、database、jobservice、notary、portal、redis、registry 和 trivy 服務在網繭中執行,名稱類似如下:
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
[...]
從 tanzu-system-registry 命名空間中的 harbor-tls 密鑰取得 Harbor CA 憑證:
kubectl -n tanzu-system-registry get secret harbor-tls -o=jsonpath="{.data.ca\.crt}" | base64 -d
記錄以下步驟的輸出
如果 Harbor 登錄使用自我簽署 CA,請根據叢集的部署方式使用適用的程序將其加入工作負載叢集:
已部署主管:
已部署獨立管理叢集:
Harbor UI 透過叢集的 tanzu-system-ingress 命名空間中執行的 Envoy 服務負載平衡器公開。若要允許使用者連線到 Harbor UI,必須將 Envoy 服務負載平衡器的位址對應到 Harbor 服務的主機名稱,例如 harbor.yourdomain.com。
取得 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。
將 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 使用自我簽署憑證,請從 https://harbor.yourdomain.com/api/v2.0/systeminfo/getcert 下載 Harbor CA 憑證,並安裝在本機機器上,以便 Docker 可以信任此 CA 憑證。
/etc/docker/certs.d/harbor.yourdomain.com/ca.crt。以 admin 使用者身分登入 Harbor 登錄。出現提示時,輸入在叢集中安裝 Harbor 套件設定的 harborAdminPassword。
docker login harbor.yourdomain.com -u admin
標記已在本機提取的現有映像,例如 nginx:1.7.9。
docker tag nginx:1.7.9 harbor.yourdomain.com/library/nginx:1.7.9
將映像推送到 Harbor 登錄。
docker push harbor.yourdomain.com/library/nginx:1.7.9
現在,您可以在已安裝 Harbor CA 憑證的任何機器上從 Harbor 登錄中提取映像。
docker pull harbor.yourdomain.com/library/nginx:1.7.9
如果需要在部署後變更 Harbor 套件的組態,請遵循以下步驟更新已部署的 Harbor 套件。
在 harbor-data-values.yaml 中更新 Harbor 組態。例如,可以更新 persistence.persistentVolumeClaim.registry.size 值來增加登錄儲存數量。
更新已安裝的套件組態:
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.7.1+vmware.1-tkg.1 \
--values-file harbor-data-values.yaml \
--namespace my-packages
將使用您新增的值協調 Harbor 套件。kapp-controller 套用變更可能需要長達五分鐘的時間。
如需 tanzu package installed update 命令的詳細資訊,請參閱安裝和管理套件中的更新套件。您可以使用此命令更新已安裝的套件版本和組態。
附註如果要將 Harbor 套件更新到 v2.7.1,並且之前已將 Harbor Scandata Volume EmptyDir Overlay 套用於該套件,則必須先從 Harbor
PackageInstall資源中移除覆蓋註解,然後再更新套件版本。您可以手動移除註解,也可以執行kubectl -n MY-PACKAGES-NAMESPACE annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0-,其中MY-PACKAGES-NAMESPACE是 {PackageInstall資源的命名空間。