您好,登錄后才能下訂單哦!
這篇文章主要講解了“Harbor如何快速部署到Kubernetes集群”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Harbor如何快速部署到Kubernetes集群”吧!
Harbor可以支持容器部署和Kubernetes部署。從Harbor 1.6開始,項目提供了Kubernetes的集群化部署方法,可以使用Helm(https://github.com/goharbor/harbor-helm)快速進行部署,基于Kubernetes集群管理機制進行動態調度。如下:
git clone https://github.com/goharbor/harbor-helm cd harbor-helm git checkout master helm install --namespace harbor --name harbor .
但是,對于多節點的Kubernetes集群來說,還需要解決幾個問題:
鏡像下載。因為Harbor使用的容器鏡像多達10個(其中registry會用到多個容器鏡像),會被集群分別調度到多個節點上運行,需要保證所有的節點都有需要的容器鏡像,會帶來大量的下載流量,完整運行起來的時間比較長。最好是在一個節點上下載,然后上傳到所有節點。
網絡存儲。在Kubernetes集群中pod是可以漂移的,需要保證漂移后的容器仍然能夠連續訪問存儲。
登陸問題。Kubernetes提供了多種服務暴露方法,但目前NodePort等的授權與后臺服務會不一致,從而登錄失敗,提示“ 不正確的用戶名或密碼”。
使用下面的腳本預先下載鏡像:
echo "Pull images for Harbor:dev" echo "" docker pull goharbor/harbor-core:dev # docker pull goharbor/harbor-portal:dev # docker pull goharbor/harbor-jobservice:dev # docker pull goharbor/clair-photon:dev # docker pull goharbor/notary-server-photon:dev # docker pull goharbor/notary-signer-photon:dev # docker pull goharbor/registry-photon:dev # docker pull goharbor/harbor-registryctl:dev # docker pull goharbor/chartmuseum-photon:dev # docker pull goharbor/harbor-db:dev # docker pull goharbor/redis-photon:dev # echo "Finished."
運行 Helm的安裝命令(命名空間為harbor):
helm install --namespace harbor --name harbor .
查看安裝后的pod,運行:
kubectl get pod -n harbor
運行的pod實例如下:
NAME READY STATUS RESTARTS AGE harbor-harbor-chartmuseum-5d8895d9dc-c76mx 1/1 Running 1 9h harbor-harbor-clair-7995586c44-8p98g 1/1 Running 1 9h harbor-harbor-core-9999c79ff-db2fl 1/1 Running 0 9h harbor-harbor-database-0 1/1 Running 0 9h harbor-harbor-jobservice-65f6dbdc78-h82nb 1/1 Running 1 9h harbor-harbor-notary-server-77774bb46f-jzsgx 1/1 Running 2 9h harbor-harbor-notary-signer-5c94f5844c-8gpp8 1/1 Running 2 9h harbor-harbor-portal-85dbb47c4f-xbnzz 1/1 Running 0 9h harbor-harbor-redis-0 1/1 Running 0 9h harbor-harbor-registry-b8bd76fc7-744fs 2/2 Running 0 9h
但是,剛安裝完的時候,由于存儲和登陸問題存在,上面的pod有很多是出于失敗狀態的,我這里顯示的是解決完這些問題以后的pod運行情況。
Harbor可以使用本地存儲、外置存儲或者網絡存儲。
如果使用本地存儲,需要指定Harbor服務pod運行在存儲所在的節點上(或者是單節點的Kubernetes集群)。
具體配置文件的參考 https://github.com/openthings/kubernetes-tools/harbor/hostpath,下面給出redis的例子:
創建Redis的存儲pv配置文件:
apiVersion: v1 kind: PersistentVolume metadata: name: data-harbor-harbor-redis-0 namespace: harbor spec: capacity: storage: 8Gi accessModes: - ReadWriteMany hostPath: path: /home/supermap/harbor/data-harbor-harbor-redis-0
創建Redis的存儲pvc配置文件:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: data-harbor-harbor-redis-0 namespace: harbor spec: accessModes: - ReadWriteMany resources: requests: storage: 8Gi
我這里是直接從GlusterFS創建的pvc,也可以使用NFS或Ceph之類的網絡可訪問存儲,包括性能比較好的NAS/iSCSI/IPSAN等系統。
首先創建endpoint,然后創建pv和pvc。
與本地存儲類似,但是可以提供pod在網絡范圍內的可遷移訪問。
具體配置文件參考 https://github.com/openthings/kubernetes-tools/harbor/zettariver。
按照推薦的方法,可以通過helm install來指定存儲設備的參數,或者修改value.yaml文件來指定存儲的使用方式。我這里沒有修改原始參數,等創建pod結束后,將所有的pvc刪除,重新創建,然后等待pod重啟后運行成功。腳本如下:
echo "Delete pvc..." kubectl delete -n harbor pvc/data-harbor-harbor-redis-0 kubectl delete -n harbor pvc/database-data-harbor-harbor-database-0 kubectl delete -n harbor pvc/harbor-harbor-chartmuseum kubectl delete -n harbor pvc/harbor-harbor-jobservice kubectl delete -n harbor pvc/harbor-harbor-registry echo "" echo "Create pvc..." kubectl apply -f 0a-glusterfs-gvzr00-endpoint.yaml kubectl apply -f 0b-glusterfs-gvzr00-service.yaml kubectl apply -f 1a-pv-data-harbor-harbor-redis-0.yaml kubectl apply -f 1b-pvc-data-harbor-harbor-redis-0.yaml kubectl apply -f 2a-pv-database-data-harbor-harbor-database-0.yaml kubectl apply -f 2b-pvc-database-data-harbor-harbor-database-0.yaml kubectl apply -f 3a-pv-harbor-harbor-chartmuseum.yaml kubectl apply -f 3b-pvc-harbor-harbor-chartmuseum.yaml kubectl apply -f 4a-pv-harbor-harbor-jobservice.yaml kubectl apply -f 4b-pvc-harbor-harbor-jobservice.yaml kubectl apply -f 5a-pv-harbor-harbor-registry.yaml kubectl apply -f 5b-pvc-harbor-harbor-registry.yaml echo "Finished."
幾個問題的記錄:
使用endpoint方法訪問glusterfs,其中一些pod總是運行不成功。
參考:Kubernetes中掛載GlusterFS的volume
采用mount glusterfs卷為本地卷,再創建pvc給harbor使用,就可以了(需要設定nodeSelector為固定節點)。
參考:分布式存儲系統GlusterFS最新版本安裝
但是,容器harbor-harbor-database-0除外,必須存儲在非GlusterFS的存儲設備上。原因如下。
經試驗,容器harbor-harbor-database-0不能部署在GlusterFS卷上,數據pvc為database-data-harbor-harbor-database-0。
PostgreSQL錯誤,https://stackoverflow.com/questions/46852123/error-in-performance-test-postgresql-and-glusterfs
GlusterFS不支持結構化數據,https://docs.gluster.org/en/latest/Install-Guide/Overview/#is-gluster-going-to-work-for-me-and-what-i-need-it-to-do
因為GlusterFS不支持PostgreSQL的結構化數據:
臨時解決辦法:將database-data-harbor-harbor-database-0卷放在物理磁盤上,容器harbor-harbor-database-0部署在同一個節點上。
采用heketi部署glusterfs方法,暫未測試。
參考:GlusterFS-動態卷快速應用
采用NFS訪問部署haorbor,或者glusterfs的NFS服務接口部署harbor,暫未測試。
參考:GlusterFS的客戶端訪問和NFS設置
下面列出正常運行后,Harbor對于存儲的使用情況,目前用到了5個pvc虛擬存儲卷:
kubectl get pvc -n harbor NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-harbor-harbor-redis-0 Bound data-harbor-harbor-redis-0 8Gi RWX 9h database-data-harbor-harbor-database-0 Bound database-data-harbor-harbor-database-0 16Gi RWX 9h harbor-harbor-chartmuseum Bound harbor-harbor-chartmuseum 8Gi RWX 9h harbor-harbor-jobservice Bound harbor-harbor-jobservice 8Gi RWX 9h harbor-harbor-registry Bound harbor-harbor-registry 8Gi RWX 9h
如果在Kubernetes中pv/pvc運行失敗,則需要檢查存儲的容量和路徑是否設置正確,請修改之,確保存儲完全可用。
系統默認安裝參數是使用Ingress提供服務入口的。雖然文檔中說明可以使用nodePort和LoadBalancer來設置服務harbor-harbor-portal的類型,但實際操作中發現,輸入賬號 admin和密碼Harbor12345后,始終會提示 “賬號會密碼不正確”,導致無法正常登陸到系統。
問題報告和解決辦法參見:
Invalid user name or password,https://github.com/goharbor/harbor-helm/issues/75
我使用Ingress(需要提前安裝)來提供服務,還需要修改Ingress的規則。
安裝Ingress,執行:
腳本和配置參見:github.com/openthings/kubernetes-tools/ingress
helm install ./nginx-ingress --name nginx-ingress \ --namespace ingress \ --set controller.stats.enabled=true
在Kubernetes的Dashboard中,選擇“服務發現與負載均衡”,選中“訪問權”里的Ingress規則,點擊“編輯”。
將其中的host修改為自己的主機域名,如下:
"rules": [ { "host": "localhost", "http": { "paths": [ { "path": "/", "backend": { "serviceName": "harbor-harbor-portal", "servicePort": 80 } }, { "path": "/api/", "backend": { "serviceName": "harbor-harbor-core", "servicePort": 80 } }, { "path": "/service/", "backend": { "serviceName": "harbor-harbor-core", "servicePort": 80 } }, { "path": "/v2/", "backend": { "serviceName": "harbor-harbor-core", "servicePort": 80 } }, { "path": "/chartrepo/", "backend": { "serviceName": "harbor-harbor-core", "servicePort": 80 } }, { "path": "/c/", "backend": { "serviceName": "harbor-harbor-core", "servicePort": 80 } } ] } },
注意:
我上面的host設為了localhost,只能允許本地訪問,其它機器連接進來是無法訪問的。
可以設為外部域名或者將其它機器名稱加入/etc/hosts,或者IP地址,就可以提供外部訪問了。
The IP is ingress node.
首先從Harbor的管理界面“系統管理”-“配置管理”-“系統設置”,選擇“鏡像庫根證書”-“下載”,將下載后的文件保存到需要訪問Harbor服務的客戶端。然后,需要完成Docker的證書配置,登陸到Harbor服務器,就可以推送/下載自己的鏡像了。
在客戶端:
將ca.crt 復制到 docker 客戶端的 /etc/docker/certs.d/yourdomain.com(registry服務器的IP)。例如:
#獲取ca.crt文件,如果目錄不存在,則需要預先手動創建之。 sudo scp user@192.168.1.8:~/docker/ca.crt /etc/docker/certs.d/192.168.1.8/
重新啟動Docker。
sudo systemctl restart docker
使用docker tag重新命名容器鏡像。如:
docker tag goharbor/harbor-portal:dev core.harbor.domain/library/harbor-portal:dev
從命令行登陸到Harbro服務器(輸入賬號:admin/Harbor12345,或者自建的賬號):
docker login core.harbor.domain
推送鏡像到Harbor服務器:
docker push core.harbor.domain/library/harbor-portal:dev
HTTPS服務和客戶端的詳細配置,請參考:https://my.oschina.net/u/2306127/blog/785281
感謝各位的閱讀,以上就是“Harbor如何快速部署到Kubernetes集群”的內容了,經過本文的學習后,相信大家對Harbor如何快速部署到Kubernetes集群這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。