Harbor快速部署到Kubernetes集羣及登陸問題解決

Harbor(https://goharbor.io)是一個功能強大的容器鏡像管理和服務系統,用於提供專有容器鏡像服務。隨着雲原生架構的普遍使用,原來由VMWare開發的Harbor也加入了雲原生基金會(參考《Harbor最新進展,將由CNCF管理 》,項目地址已經變爲 https://github.com/goharbor),成爲雲原生的生態系統的重要組成部分。node

一、快速安裝

Harbor能夠支持容器部署和Kubernetes部署。從Harbor 1.6開始,項目提供了Kubernetes的集羣化部署方法,可使用Helm(https://github.com/goharbor/harbor-helm)快速進行部署,基於Kubernetes集羣管理機制進行動態調度。以下:nginx

git clone https://github.com/goharbor/harbor-helm
cd harbor-helm
git checkout master

helm install --namespace harbor --name harbor .

二、部署技巧

可是,對於多節點的Kubernetes集羣來講,還須要解決幾個問題:git

  • 鏡像下載。由於Harbor使用的容器鏡像多達10個(其中registry會用到多個容器鏡像),會被集羣分別調度到多個節點上運行,須要保證全部的節點都有須要的容器鏡像,會帶來大量的下載流量,完整運行起來的時間比較長。最好是在一個節點上下載,而後上傳到全部節點。
  • 網絡存儲。在Kubernetes集羣中pod是能夠漂移的,須要保證漂移後的容器仍然可以連續訪問存儲。
  • 登錄問題。Kubernetes提供了多種服務暴露方法,但目前NodePort等的受權與後臺服務會不一致,從而登陸失敗,提示「 不正確的用戶名或密碼」。

2.1 鏡像下載

使用下面的腳本預先下載鏡像:github

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):redis

helm install --namespace harbor --name harbor .

查看安裝後的pod,運行:sql

kubectl get pod -n harbor

運行的pod實例以下:docker

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運行狀況。api

2.2 網絡存儲

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等系統。

按照推薦的方法,能夠經過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."

幾個問題的記錄:

下面列出正常運行後,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運行失敗,則須要檢查存儲的容量和路徑是否設置正確,請修改之,確保存儲徹底可用。

2.3 登錄問題

系統默認安裝參數是使用Ingress提供服務入口的。雖然文檔中說明可使用nodePort和LoadBalancer來設置服務harbor-harbor-portal的類型,但實際操做中發現,輸入帳號 admin和密碼Harbor12345後,始終會提示 「帳號會密碼不正確」,致使沒法正常登錄到系統。

我使用Ingress(須要提早安裝)來提供服務,還須要修改Ingress的規則。

安裝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.

三、Docker客戶端訪問

首先從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

更多參考:

相關文章
相關標籤/搜索