本主題說明如何將 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,請執行以下動作:
將 kubectl
的內容設定為工作負載叢集或共用服務叢集。例如:
kubectl config use-context tkg-services-admin@tkg-services
如果叢集尚未安裝 standard
套件存放庫,請安裝它:
附註如果要將以計劃為基礎的叢集 (舊版) 為目標,請跳過此步驟。對於以計劃為基礎的叢集,會在
tanzu-package-repo-global
命名空間中的每個叢集中,自動啟用tanzu-standard
套件存放庫。
tanzu package repository add tanzu-standard --url PACKAGE-REPOSITORY-ENDPOINT --namespace tkg-system
其中,PACKAGE-REPOSITORY-ENDPOINT
是 standard
套件存放庫的 URL。對於此版本,URL 為 projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1
。
若要從 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.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
執行下列其中一個動作,在 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
在 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.6.3+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.6.3+vmware.1-tkg.1 \
--values-file harbor-data-values.yaml \
--namespace my-packages
如果使用 ebs.csi.aws.com
作為 storageClass
,請執行以下操作之一:
將儲存區類別 VolumeBoundMode
從 Immediate
變更為 WaitForFirstConsumer
。
修補 Harbor Scandata Volume EmptyDir Overlay,如下所示。此覆疊會將 scandata 磁碟區設為空目錄,以避免在將 jobLog
磁碟區和 scandata
磁碟區掛接到同一個 jobservice pod 時影響 scandata 匯出功能並導致 AZ 衝突:
建立檔案 scandata-empty-dir-overlay.yaml
,其中包含下方的 Harbor Scandata 磁碟區 EmptyDir 覆疊程式碼。
為覆疊建立通用密碼:
kubectl -n test create secret generic scandata-empty-dir-overlay -o yaml --dry-run=client --from-file=scandata-emptyDir-overlay.yaml | kubectl apply -f -
kubectl -n test annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0=scandata-empty-dir-overlay
isReconciling
:kubectl get pkgi harbor -n my-packages
isReconciling
,請刪除現有的 Harbor Pod,以便它們重新建立:kubectl delete pods --all -n 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 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.6.3+vmware.1-tkg.1 \
--values-file harbor-data-values.yaml \
--namespace my-packages
將使用您新增的值協調 Harbor 套件。kapp-controller
套用變更可能需要長達五分鐘的時間。
如需 tanzu package installed update
命令的詳細資訊,請參閱安裝和管理套件中的更新套件。您可以使用此命令更新已安裝的套件版本和組態。
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