基于CEPH后端存储搭建Harbor

背景

上一篇文章中讲到了基于NFS后端存储Harbor的搭建
,这一节来聊聊K8sCEPH的对接以及基于CEPH Harbor的构建。

因为资源的问题,测试环境仍然是K8sALL-IN-ONE环境,CEPH集群通过开源ROOK来搭建,而Harbor依然采用Helm的安装方式。

1. CEPH集群的搭建

正常CEPH集群的搭建可通过ceph-deploy、ceph-ansible等工具来搭建,因为这里考虑到跟K8s的对接最后是通过CNCF下开源工具ROOK来完成的。

1.1 部署ROOK系统

部署方式其实很简单,可参考如下步骤来完成:

# 下载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状态时即可开始CEPH集群的搭建。

1.2 CEPH集群搭建

部署过程其实也很简单,首先依据自身环境修改rook/cluster/examples/kubernetes/ceph/cluster.yaml文件,因为是在K8s集群搭建且只有一个节点,所以要做如下配置更改其实也就是对应cephcluster资源的配置:

更新完成后保存,通过执行如下命令来开始搭建CEPH集群:

cd rook/cluster/examples/kubernetes/ceph/
kubectl create -f cluster.yaml

首次搭建因为拉取镜像需要等待一段时间,我们可以通过命令watch "kubectl get pods -n rook-ceph"来实时查看集群的构建状态,最终的呈现方式应该如下图所示:

搭建完成后不妨对ceph集群做下简单测试。

1.3 测试

首先,我们需要创建StorageClassRBD POOL

cd rook/cluster/examples/kubernetes/ceph/
kubectl create -f storageclass.yaml

效果呈现如下图所示:


然后,创建一个测试的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的创建状态:

很显然已经创建成功且绑定到相应的卷,另外创建pvc时有两点额外说明一哈:

  • 因为StorageClass设置默认格式化卷的格式是xfs,所以需要预先在K8s集群节点上安装xfsprogs,命令apt-get install -y xfsprogs安装即可;
  • 创建PVC指定卷大小时,由于xfs的限制,数目不能小于16Mi,否则会出现后续创建Pod volume mount failed

最后,创建一个测试的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

验证一下结果:

如此,说明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管理界面服务,这里采用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管理界面登陆密码,而用户名默认admin

浏览器输入https://10.0.2.15:31060访问ceph管理界面:

1.5 安装toolbox

我们知道一般ceph集群搭建完之后都是通过证书来客户端访问的,直接类似kubectl exec rook-ceph-mon-a-66f5f857fb-h5vfh -- rbd ls的命令是无法查看ceph集群的信息(因为其内部都没有对应的访问keyring),所以常常安装toolbox来解决这一问题。

cd rook/cluster/examples/kubernetes/ceph
kubectl create -f toolbox.yaml

安装完之后便可以查看ceph集群的相应信息啦:

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的访问采用了证书访问的方式,因此配置上也要做相应的更新:

# harbor-helm/values.yaml更改项
expose.type: nodePort
expose.tls.enabled: true
expose.tls.commonName: "10.0.2.15"  # 主机节点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

由于我们设置时证书访问的模式,首先需要将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  # 用户名和密码默认admin、Harbor12345

如此便可以通过docker客户端向Harbor push/pull镜像了。

至于Charts的处理在前文中已经讲解,此处不作赘述。

3. 扩展

本文只是简单阐述在一个单节点K8s集群搭建基于CEPH后端存储Harbor的过程,实际使用中不管是CEPH集群还是Harbor一般都会独立出来且要做高可用处理来避免单点故障,至于方案也有很多本文就暂且不做深入了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349