一、環境說明
本教程建立在已有的k8s集群以及安裝了helm的前提下,如未搭建k8s集群,請先參考其他相關部署教程。
環境現狀:
- k8s版本為 v1.14.0,部署了helm,版本為v2.13.1;
- k8s1和k8s2為兩個高可用的master節點,同時也是node節點;
- k8s3為單純的node節點;
- mars僅作為docker client使用,所以使用了一台很久以前的虛擬機,docker client 版本比較低,能用就行;
- 所有機器的操作系統均為CentOS7.2。
- harbor版本號為 v1.9.0
角色 | IP | 主機名 | 程序版本 |
k8s-master/k8s-node | 10.2.1.86 vip: 10.2.1.254 |
k8s1 | k8s v1.14.0 helm Client&Server v2.13.1 |
k8s-master/k8s-node | 10.2.1.72 vip: 10.2.1.254 |
k8s2 | k8s v1.14.0 |
k8s-node | 10.2.1.20 | k8s3 | k8s v1.14.0 |
Docker client | 10.2.1.67 | mars | docker client 1.10.3 |
二、部署harbor
1、從github拉取harbor-helm
git clone https://github.com/goharbor/harbor-helm cd harbor-helm
2、修改相關配置
在harbor-helm文件夾里面,可以看到Chart.yml 及 values.yaml 等helm 部署相關的文件,vim 編輯一下value.yaml,根據實際情況修改配置
ingress: hosts: core: harbor.mars.com #修改ingress里面的域名 notary: notary.mars.com …… externalURL: https://harbor.mars.com #修改訪問的URL …… #這部分可以看到,這里需要5個pvc,也就是說需要手動創建5個pv,官方默認為兩個5G,3個1G,可根據需要修改size,這里由於是實驗環境,所以不作改動 persistentVolumeClaim: registry: existingClaim: "" storageClass: "" subPath: "" accessMode: ReadWriteOnce size: 5Gi chartmuseum: existingClaim: "" storageClass: "" subPath: "" accessMode: ReadWriteOnce size: 5Gi jobservice: existingClaim: "" storageClass: "" subPath: "" accessMode: ReadWriteOnce size: 1Gi database: existingClaim: "" storageClass: "" subPath: "" accessMode: ReadWriteOnce size: 1Gi redis: existingClaim: "" storageClass: "" subPath: "" accessMode: ReadWriteOnce size: 1Gi …… harborAdminPassword: "Harbor12345" #默認管理員密碼為Harbor12345,可在這里進行修改
3、創建需要的5個pv
為簡化實驗,本實驗環境使用local-storage作為持久化存儲,使用k8s3機器的 /data/disks 目錄作為本地持久化存儲。
- 在k8s3上面創建五個文件夾
mkdir /data/disks/{disk1-5G,disk2-5G,disk3-1G,disk4-1G,disk5-1G}
- 在master上面編寫5個pv的yaml文件,並創建pv
mkdir pv cd pv
cat <<EOF > disk1-5G.yml apiVersion: v1 kind: PersistentVolume metadata: name: disk1 spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle local: path: "/data/disks/disk1-5G" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s3 EOF cat <<EOF > disk2-5G.yml apiVersion: v1 kind: PersistentVolume metadata: name: disk2.yml spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle local: path: "/data/disks/disk2-5G" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s3 EOF cat <<EOF > disk3-1G.yml apiVersion: v1 kind: PersistentVolume metadata: name: disk3.yml spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle local: path: "/data/disks/disk3-1G" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s3 EOF cat <<EOF > disk4-1G.yml apiVersion: v1 kind: PersistentVolume metadata: name: disk4.yml spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle local: path: "/data/disks/disk4-1G" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s3 EOF cat <<EOF > disk5-1G.yml apiVersion: v1 kind: PersistentVolume metadata: name: disk5.yml spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle local: path: "/data/disks/disk5-1G" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s3 EOF
kubectl apply -f .
kubectl get pv

可以看到5個pv已經准備就緒
4、使用helm部署harbor
cd /data/harbor-helm
helm dependency update
helm install . --debug -n harbor --namespace mars
參數說明:
- --debug 部署過程中開啟debug模式
- -n 定義helm release的名字
- --namespace 指定使用哪個namespace部署
部署完成后,可以通過相關命令查看部署情況
分別查看helm、pvc、deployment、pod、service、ingress 等是否正常(其中部分pod有可能會失敗,但會自動重建,直到最后全部pod都會處理Running狀態,個人猜測原因是啟動這些deployment需要有一定的順序,某些deployment需要在其他deployment啟動的前提下才能正常啟動)
5、使用瀏覽器測試
在 Docker Client 的 /etc/hosts 文件里面把 10.2.1.254 指定到域名 harbor.mars.com 的解釋上,然后使用瀏覽器訪問 https://harbor.mars.com,由於是實驗環境,沒有ssl配置證書,直接信任即可。注:此步驟需要使用圖形界面,如果Docker Client 沒有安裝圖形界面,請自行安裝,或者用其他方法(如ssh隧道)
echo '10.2.1.254 harbor.mars.com' >> /etc/hosts
使用 admin用戶登錄(默認密碼在之前的value.yaml文件中定義),並創建一個項目mars。
三、使用harbor
1、登錄harbor
harbor部署完畢了,項目也創建好了,現在嘗試一下用命令行登錄一下。
發現報錯了,看提示,是缺少了CA證書,解決方法有兩個:
(1)在Docker Client 的啟動文件里面加入 --insecure-registry 參數,強制信任這個鏡像倉庫(生產環境不推薦,不安全)
(2)在Docker Client 添加harbor的CA證書(推薦)
下面分別說明一下兩種方法。
方法一:Docker client 啟動文件加入--insecure-registry 參數(生產環境不推薦,不安全)
這個版本的Docker的啟動文件為 /usr/lib/systemd/system/docker.service ,其他版本可能不一樣
在ExecStart 加入 --insecure-registry "harbor.mars.com" ,意思為允許不安全地使用 harbor.mars.com 這個鏡像倉庫
重啟 docker 及 daemon
systemctl restart docker
systemctl daemon-reload
再次嘗試 login,登錄成功
方法二:在Docker Client 添加harbor的CA證書(推薦)
在k8s的master上面通過以下命令獲取CA證書
kubectl -n mars get secrets/harbor-harbor-ingress -o jsonpath="{.data.ca\.crt}" | base64 --decode
在Docker Client 上添加證書(不需要重啟docker)
mkdir /etc/docker/certs.d/harbor.mars.com cat <<EOF > /etc/docker/certs.d/harbor.mars.com/ca.crt -----BEGIN CERTIFICATE----- MIIC9DCCAdygAwIBAgIQdq5L+F3WlnD1oRv7Ai1o1zANBgkqhkiG9w0BAQsFADAU MRIwEAYDVQQDEwloYXJib3ItY2EwHhcNMTkwNzE4MDQxNzMwWhcNMjAwNzE3MDQx NzMwWjAUMRIwEAYDVQQDEwloYXJib3ItY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDVr8SzNtog69u+3kLa8xZYEpgKktV6w7A6d43XSnQOhF2PynT3 AnQ3Ah3NBcjGoYEp7k/JNoNHyvPMMMxqOs8bj/QNTIASN7XuqLZegJCF5E15dttR ey1bZsINDX4eoa5WN/nYOGRnP6rNF8ijDPwFm/I0bT+V9xTiJgaEScPSmN9YRwkQ Gm1279W5eXXaHXUeArAdsydC1+hRA0Xxz9mZWA9CGNJwJ3w+Zmvg82CxCcWmm4yf feiex5N/8u63PynuVV3ZNoWTyDRZ6o7ljXat0MX0fBjmkC6UQbo6IuILSHZR5oPj mtSMgfqMzT9o175Ew3DtC6KB39cs6op0IXdrAgMBAAGjQjBAMA4GA1UdDwEB/wQE AwICpDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDwYDVR0TAQH/BAUw AwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAZPG5cYVFI8nYNQfZJ8yzkWD0jJMHlZ77 D65gUHnZSsJKQd+yXA674LHfNXCkPDexYZvMZtYjSg/wTwI0xVeW+K3zdfK9MBxM PCpEJLtrTKj2ZYXKXqG9db7iybKbIgW+6eGELBn7asM7ka0jNWsYVOkKirVtfPzZ sKUm9ujNfs5W1XeJL/8af/HDX7sYJoNRgDRzYRzmFScV5cq7KD1Vvn7+QjcDdHpJ QNmJ9QC53LW34NJ+mfQFMXs84LNZ4M08V+Wpyd0p6c8RYRYS8QVxuXbShn3ltP40 Xu2/CRYCzvpOj3vQSn78bqDoXfX/8AX1eKr7iMAPNyrDrYVQU39QpQ== -----END CERTIFICATE----- EOF
再次嘗試 login,登錄成功
2、上傳本地鏡像
把本地的一個鏡像 docker.io/redis:latest 上傳到harbor,先給鏡像打一個tag
docker tag docker.io/redis harbor.mars.com/mars/redis:v1
上傳鏡像
docker push harbor.mars.com/mars/redis:v1
上傳成功
在harbor頁面上對應的項目里面,可以查看到相關的鏡像
3、下載harbor鏡像
先刪除本地鏡像(其實只是去掉一個tag)
docker rmi harbor.mars.com/mars/redis:v1
下載harbor上面的鏡像
docker pull harbor.mars.com/mars/redis:v1
下載成功