背景
上一篇文章中講到了基于NFS后端存儲Harbor的搭建
,這一節(jié)來聊聊K8s與CEPH的對接以及基于CEPH Harbor的構(gòu)建。
因?yàn)橘Y源的問題,測試環(huán)境仍然是K8s的ALL-IN-ONE環(huán)境,CEPH集群通過開源ROOK來搭建,而Harbor依然采用Helm的安裝方式。
1. CEPH集群的搭建
正常CEPH集群的搭建可通過ceph-deploy、ceph-ansible等工具來搭建,因?yàn)檫@里考慮到跟K8s的對接最后是通過CNCF下開源工具ROOK來完成的。
1.1 部署ROOK系統(tǒng)
部署方式其實(shí)很簡單,可參考如下步驟來完成:
# 下載rook源碼,這里是使用的release-0.9分支
git clone -b release-0.9 https://github.com/rook/rook.git
cd rook/cluster/examples/kubernetes/ceph/
kubectl create -f operator.yaml
如此,部署成功后可以看到如下Pod:

待這些Pod都處于running狀態(tài)時即可開始CEPH集群的搭建。
1.2 CEPH集群搭建
部署過程其實(shí)也很簡單,首先依據(jù)自身環(huán)境修改rook/cluster/examples/kubernetes/ceph/cluster.yaml文件,因?yàn)槭窃贙8s集群搭建且只有一個節(jié)點(diǎn),所以要做如下配置更改其實(shí)也就是對應(yīng)cephcluster資源的配置:

更新完成后保存,通過執(zhí)行如下命令來開始搭建CEPH集群:
cd rook/cluster/examples/kubernetes/ceph/
kubectl create -f cluster.yaml
首次搭建因?yàn)槔$R像需要等待一段時間,我們可以通過命令watch "kubectl get pods -n rook-ceph"來實(shí)時查看集群的構(gòu)建狀態(tài),最終的呈現(xiàn)方式應(yīng)該如下圖所示:

搭建完成后不妨對ceph集群做下簡單測試。
1.3 測試
首先,我們需要創(chuàng)建StorageClass和RBD POOL:
cd rook/cluster/examples/kubernetes/ceph/
kubectl create -f storageclass.yaml
效果呈現(xiàn)如下圖所示:

然后,創(chuàng)建一個測試的PVC:
root@vinefu-dev:~# cat test_pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: rook-ceph-block
root@vinefu-dev:~#kubectl create -f test_pvc.yaml
查看一下PVC的創(chuàng)建狀態(tài):

很顯然已經(jīng)創(chuàng)建成功且綁定到相應(yīng)的卷,另外創(chuàng)建pvc時有兩點(diǎn)額外說明一哈:
- 因?yàn)?code>StorageClass設(shè)置默認(rèn)格式化卷的格式是
xfs,所以需要預(yù)先在K8s集群節(jié)點(diǎn)上安裝xfsprogs,命令apt-get install -y xfsprogs安裝即可; - 創(chuàng)建
PVC指定卷大小時,由于xfs的限制,數(shù)目不能小于16Mi,否則會出現(xiàn)后續(xù)創(chuàng)建Pod volume mount failed;
最后,創(chuàng)建一個測試的pod:
root@vinefu-dev:~# cat test_pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: busybox
command:
- "/bin/sh"
args:
- "-c"
- "while true;do sleep 3600;done"
volumeMounts:
- name: test-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: test-pvc
persistentVolumeClaim:
claimName: test-claim
root@vinefu-dev:~#kubectl create -f test_pod.yaml
驗(yàn)證一下結(jié)果:

如此,說明CEPH集群搭建成功。
1.4 訪問ceph管理界面
CEPH集群搭建完畢后rook會提供一個可視化的ceph管理界面:
root@vinefu-dev:~/harbor-helm# kubectl get svc -n rook-ceph
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-mgr ClusterIP 10.100.5.96 <none> 9283/TCP 26h
rook-ceph-mgr-dashboard NodePort 10.98.155.216 <none> 8443:31060/TCP 26h # ceph管理界面服務(wù),這里采用nodePort的訪問模式,對外暴露端口31060
rook-ceph-mon-b ClusterIP None <none> 6790/TCP 13h
root@vinefu-dev:~/harbor-helm#kubectl get secret -n rook-ceph
NAME TYPE DATA AGE
default-token-xbg57 kubernetes.io/service-account-token 3 26h
rook-ceph-dashboard-password kubernetes.io/rook 1 26h
rook-ceph-mgr-a kubernetes.io/rook 1 26h
rook-ceph-mgr-token-rvp82 kubernetes.io/service-account-token 3 26h
rook-ceph-mon kubernetes.io/rook 4 26h
rook-ceph-osd-token-jkj6f kubernetes.io/service-account-token 3 26h
root@vinefu-dev:~/harbor-helm# kubectl get secret rook-ceph-dashboard-password -n rook-ceph -o template --template='{{ .data.password }}{{"\n"}}' | base64 -d
vrueIupYp7 # ceph管理界面登陸密碼,而用戶名默認(rèn)admin
瀏覽器輸入https://10.0.2.15:31060訪問ceph管理界面:

1.5 安裝toolbox
我們知道一般ceph集群搭建完之后都是通過證書來客戶端訪問的,直接類似kubectl exec rook-ceph-mon-a-66f5f857fb-h5vfh -- rbd ls的命令是無法查看ceph集群的信息(因?yàn)槠鋬?nèi)部都沒有對應(yīng)的訪問keyring),所以常常安裝toolbox來解決這一問題。
cd rook/cluster/examples/kubernetes/ceph
kubectl create -f toolbox.yaml
安裝完之后便可以查看ceph集群的相應(yīng)信息啦:
root@vinefu-dev:~/rook/cluster/examples/kubernetes/ceph# kubectl get pod -n rook-ceph
NAME READY STATUS RESTARTS AGE
rook-ceph-mgr-a-95c6f694d-d99qf 1/1 Running 6 27h
rook-ceph-mon-a-66f5f857fb-h5vfh 1/1 Running 7 27h
rook-ceph-osd-0-745c8b4bc8-srl4g 1/1 Running 7 27h
rook-ceph-osd-prepare-vinefu-dev-sx2rx 0/2 Completed 0 3h39m
rook-ceph-tools-85c554456b-qbrwl 1/1 Running 8 24h
root@vinefu-dev:~/rook/cluster/examples/kubernetes/ceph# kubectl exec -n rook-ceph rook-ceph-tools-85c554456b-qbrwl -- rbd ls replicapool
pvc-33aac180-fd92-435c-aff4-789a674ba833
pvc-5d41d52a-b6ce-4790-b08c-b54cf0e7ba99
pvc-60c64e2b-f7b9-461c-9ade-36fb45d2bf01
pvc-ae03c5f6-6646-4581-a70f-3a40d10b28b2
pvc-b28a29e6-ba9b-4c46-bf65-433686b23934
pvc-dde322f8-5716-4db3-b10a-904e63320640
pvc-ef15814d-b7b3-41f8-bf9a-3cb57e9cee6e
root@vinefu-dev:~/rook/cluster/examples/kubernetes/ceph# kubectl exec -n rook-ceph rook-ceph-tools-85c554456b-qbrwl -- ceph mon stat
e1: 1 mons at {a=10.0.2.15:6790/0}, election epoch 17, leader 0 a, quorum 0 a
root@vinefu-dev:~/rook/cluster/examples/kubernetes/ceph# kubectl exec -n rook-ceph rook-ceph-tools-85c554456b-qbrwl -- ceph osd stat
1 osds: 1 up, 1 in; epoch: e87
root@vinefu-dev:~/rook/cluster/examples/kubernetes/ceph# kubectl exec -n rook-ceph rook-ceph-tools-85c554456b-qbrwl -- ceph osd status
+----+------------+-------+-------+--------+---------+--------+---------+-----------+
| id | host | used | avail | wr ops | wr data | rd ops | rd data | state |
+----+------------+-------+-------+--------+---------+--------+---------+-----------+
| 0 | vinefu-dev | 22.2G | 36.5G | 0 | 20.8k | 1 | 0 | exists,up |
+----+------------+-------+-------+--------+---------+--------+---------+-----------+
root@vinefu-dev:~/rook/cluster/examples/kubernetes/ceph# kubectl exec -n rook-ceph rook-ceph-tools-85c554456b-qbrwl -- ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
59 GiB 37 GiB 22 GiB 37.87
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
replicapool 3 442 MiB 1.27 34 GiB 203
root@vinefu-dev:~/rook/cluster/examples/kubernetes/ceph#
2. 基于CEPH來搭建Harbor
這里依然通過helm來安裝Harbor,步驟基本上跟基于NFS搭建Harbor一致,只是配置要做稍微變動。
另外,這里Registry的訪問采用了證書訪問的方式,因此配置上也要做相應(yīng)的更新:
# harbor-helm/values.yaml更改項(xiàng)
expose.type: nodePort
expose.tls.enabled: true
expose.tls.commonName: "10.0.2.15" # 主機(jī)節(jié)點(diǎn)ip即可
externalURL: https://10.0.2.15:30003 # 注意該端口號一定要寫上
persistence.persistentVolumeClaim.registry.storageClass: "rook-ceph-block"
persistence.persistentVolumeClaim.redis.storageClass: "rook-ceph-block"
persistence.persistentVolumeClaim.chartmuseum.storageClass: "rook-ceph-block"
persistence.persistentVolumeClaim. jobservice.storageClass: "rook-ceph-block"
persistence.persistentVolumeClaim.database.storageClass: "rook-ceph-block"
然后通過命令helm install --name my-harbor .來完成安裝即可。
瀏覽器輸入https://10.0.2.15:30003便可訪問Harbor界面。
Docker客戶端上傳鏡像至Harbor
由于我們設(shè)置時證書訪問的模式,首先需要將Harbor registry根證書拷貝到docker客戶端,根證書可以在Harbor界面下載:

然后拷貝到docker客戶端:
mkdir -p /etc/docker/certs.d/10.0.2.15:30003
cp ca.crt /etc/docker/certs.d/10.0.2.15:30003/
docker login 10.0.2.15:30003 # 用戶名和密碼默認(rèn)admin、Harbor12345
如此便可以通過docker客戶端向Harbor push/pull鏡像了。
至于Charts的處理在前文中已經(jīng)講解,此處不作贅述。
3. 擴(kuò)展
本文只是簡單闡述在一個單節(jié)點(diǎn)K8s集群搭建基于CEPH后端存儲Harbor的過程,實(shí)際使用中不管是CEPH集群還是Harbor一般都會獨(dú)立出來且要做高可用處理來避免單點(diǎn)故障,至于方案也有很多本文就暫且不做深入了。