ceph是一個(gè)分布式文件存儲(chǔ)服務(wù)贴膘,類似的還有g(shù)ulster卖子,minio等等,至于各種云服務(wù)商的對象存儲(chǔ)服務(wù)就不說了刑峡,這里只聊自建敛瓷。為了配合kubernetes的底層pvc存儲(chǔ)僚匆,利用storageClass的自動(dòng)claim咏连,因此在測試環(huán)境部署了一套cephfs笛辟,cephfs依賴ceph服務(wù),因此先安裝ceph宫患。準(zhǔn)備3臺(tái)服務(wù)器刊懈,每臺(tái)掛載一塊數(shù)據(jù)盤,而且是raw的娃闲,也就是裸盤虚汛,不需要格式化。
ceph
首先去官網(wǎng):http://docs.ceph.org.cn/start/畜吊,快速查看了解ceph的部署過程泽疆,官方?jīng)]有做到事無巨細(xì),你也只能結(jié)合ecs的環(huán)境做個(gè)大致的了解玲献,至少瀏覽一遍殉疼,以便在出問題的時(shí)候,回到文檔中查看原因捌年。
其次開始安裝:只要沒有明確標(biāo)識(shí)在管理節(jié)點(diǎn)瓢娜,那就是所有節(jié)點(diǎn)都需要安裝
1、配置主機(jī)名和IP的映射:/etc/hosts礼预,這里必須和主機(jī)名對應(yīng)眠砾,否則后面執(zhí)行mon初始化的時(shí)候報(bào)錯(cuò)
2、添加yum源:yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/dl.fedoraproject.org*
3托酸、添加ceph的yum倉庫:
vim /etc/yum.repos.d/ceph.repo? ? 注意:luminous是ceph的版本褒颈,el7是你Linux的發(fā)行版柒巫;具體的版本信息這里查看https://docs.ceph.com/docs/mimic/releases/
[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-luminous/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
4、安裝ceph-deploy:管理節(jié)點(diǎn)
yum install -y ceph-deploy
5谷丸、使用root用戶安裝堡掏,如果需要普通用戶,請參照官方文檔中添加用戶部分
6刨疼、開始安裝:管理節(jié)點(diǎn)
mkdir my-cluster
cd my-cluster
ceph-deploy new admin? //生成ceph.conf
ceph-deploy install admin node1 node2 //各節(jié)點(diǎn)安裝ceph
ceph-deploy mon create-initial //初始化監(jiān)控節(jié)點(diǎn)泉唁,這一步肯定會(huì)出錯(cuò),查看出錯(cuò)日志揩慕,然后根據(jù)日志來修改ceph.conf或者其他操作
如果告訴你public_network或者public_addr都不存在亭畜,那么需要在ceph中添加對應(yīng)的網(wǎng)段
如果告訴你provided hostname must match remote hostname,那說明你的hosts里配置的主機(jī)名和ceph.conf中的不一致迎卤,需要你調(diào)整
每次修改ceph.conf需要重新把這個(gè)配置文件推送到所有的節(jié)點(diǎn):ceph-deploy --overwrite-conf config push admin node1 node2
如果還是不行拴鸵,就去各個(gè)節(jié)點(diǎn)執(zhí)行 pkill ceph殺掉進(jìn)程,重新初始化
最后還是不行蜗搔,你就purge所有的東西宝踪,重新從頭開始準(zhǔn)備安裝:
ceph-deploy purge admin node1 node2
ceph-deploy purgedata admin node1 node2
ceph-deploy forgetkeys
7、拷貝所有keyring結(jié)尾的密鑰文件到各個(gè)節(jié)點(diǎn)的/etc/ceph
8碍扔、檢查ceph的health狀態(tài)
ceph health //如果告訴你HEALTH_WARN no active mgr,那就需要添加mgr:ceph-deploy mgr create node1 node2
9秕重、添加osd
ceph-deploy osd create --data /dev/vdb admin
ceph-deploy osd create --data /dev/vdb node1
ceph-deploy osd create --data /dev/vdb node2? //注意磁盤的位置不同,這個(gè)版本的ceph-deploy無法使用prepare來添加osd了
10、查看ceph的狀態(tài)
ceph -s
? cluster:
? ? id:? ? 355a1118-c856-42e9-81bd-d5bec3c5464f
? ? health: HEALTH_OK
? services:
? ? mon: 1 daemons, quorum ecs-f80d-0001
? ? mgr: ecs-f80d-0002(active), standbys: ecs-f80d-0003
? ? osd: 3 osds: 3 up, 3 in
? data:
? ? pools:? 0 pools, 0 pgs
? ? objects: 0? objects, 0 B
? ? usage:? 3.0 GiB used, 597 GiB / 600 GiB avail
? ? pgs:
11溶耘、開啟dashboard
一般情況下二拐,都沒有什么問題,但是不保證啟用dashboard成功凳兵,因此百新,出現(xiàn)問題的時(shí)候就去查看mgr角色機(jī)器的mgr日志,路徑在/var/log/ceph/ceph-mgr.${nodename}.log
啟用步驟:
ceph mgr module enable dashboard //如果沒有設(shè)置dashboard綁定port和IP庐扫,那就是mgr節(jié)點(diǎn)的8080饭望,8443 for ssl
如果需要自定義地址和端口
ceph config set mgr mgr/dashboard/server_addr 0.0.0.0
ceph config set mgr mgr/dashboard/server_port 7000
ceph mgr module disable dashboard
ceph mgr module enable dashboard? //重啟一下dashboard
ceph dashboard set-login-credentials admin admin? //設(shè)置登錄用戶名和密碼
如果日志報(bào)錯(cuò)urllib3之類的,就通過pip重裝
pip uninstall urllib3
pip install urllib3 //可能會(huì)讓你--upgrade
ssl自簽證書形庭,看情況铅辞,如果不使用的話,需要這樣做:
ceph config set mgr mgr/dashboard/ssl false
dashboard有非常多的設(shè)置萨醒,具體操作斟珊,請參看官方文檔:https://docs.ceph.com/docs/master/mgr/dashboard/
12、安裝mds元數(shù)據(jù)組件
ceph-deploy mds create nodename //在ceph.conf同級目錄執(zhí)行
13富纸、安裝object gateway組件
ceph-deploy rgw create nodename
14囤踩、添加monitor旨椒,以便高可用
ceph-deploy mon add nodename
ceph quorum_status --format json-pretty //查看法定人數(shù)狀態(tài)
15、使用ceph
ceph osd pool create data 128 128 //創(chuàng)建存儲(chǔ)池子堵漱,pg和pgp均為128综慎,如果不寫將使用默認(rèn)的8,你可以在ceph.conf設(shè)置默認(rèn)的pg和pgp
ceph osd pool set-quota data max_objects 10000 //設(shè)置池子的對象個(gè)數(shù)配額
ceph osd pool set-quota data max_bytes 2G //設(shè)置池子的大小配額怔锌,取消配額寥粹,設(shè)置為0
16、測試推送數(shù)據(jù)到存儲(chǔ)池
rados put test-object-1 testfile.txt --pool=data //推送數(shù)據(jù)
rados -p data ls //驗(yàn)證數(shù)據(jù)對象是否存在
ceph osd map data test-object-1 //定位數(shù)據(jù)對象
rados rm test-object-1 --pool=data //刪除此對象
17埃元、新增節(jié)點(diǎn)和osd涝涤,以及mon
在deploy節(jié)點(diǎn)的hosts中添加新增的節(jié)點(diǎn)主機(jī)/etc/hosts
ceph-deploy install node3 node4 //批量安裝ceph到新增節(jié)點(diǎn)
如果出錯(cuò)就purge和purgedata,再重新安裝岛杀,可能還會(huì)有urllib3的報(bào)錯(cuò)阔拳,就還是按照之前介紹的方式重新pip安裝之
節(jié)點(diǎn)增加也需要增加對應(yīng)的monitor
ceph-deploy mon add node3
將monitor的列表在ceph.conf中配置完整,再push到各個(gè)節(jié)點(diǎn)中去
ceph-deploy --overwrite-conf config push admin node1 node2 node3 node4
新增osd:
ceph-deploy osd create --data /dev/vdb node3
ceph-deploy osd create --data /dev/vdb node4
ceph -s 或者 ceph osd tree 查看是否添加成功
18类嗤、添加客戶端用戶和設(shè)置權(quán)限
ceph auth get-or-create client.k8s mon 'allow rwx' osd 'allow rwx pool=k8s' mds 'allow rwp' -o ceph.client.k8s.keyring
更新權(quán)限
ceph auth caps client.k8s mon 'allow rwx' osd 'allow rwx pool=k8s, allow rw pool=cephfs_data' mds 'allow rwp'
還可以通過對cephfs文件系統(tǒng)授權(quán)的同時(shí)添加一個(gè)賬戶
ceph fs authorize cephfs client.k8s / r /data rw? ? //表示k8s用戶對/目錄有讀權(quán)限糊肠,對/data有讀寫權(quán)限,這里的data不是pool遗锣,而是文件系統(tǒng)的路徑
注意:不管是塊block存儲(chǔ)還是fs文件系統(tǒng)货裹,其都是基于pool來的,因此首先得創(chuàng)建pool
kubernetes
測試ceph的塊存儲(chǔ):
1精偿、先創(chuàng)建一個(gè)image
ceph osd pool create k8s 256 256
ceph osd pool set-quota data max_objects 1000000
ceph osd pool set-quota data max_bytes 200G
rbd create cephblocktest -s 1024 -p k8s
rbd create k8s/cephblocktest --size 1024 --image-feature layering //這種方式指定了rbd的feature弧圆,防止Linux kernel不支持其他特色而報(bào)錯(cuò)
2、創(chuàng)建測試pod
apiVersion: v1
kind: Pod
metadata:
? name: rbd
spec:
? containers:
? ? - image: nginx
? ? ? name: rbd-rw
? ? ? volumeMounts:
? ? ? - name: rbdpd
? ? ? ? mountPath: /mnt/rbd
? volumes:
? ? - name: rbdpd
? ? ? rbd:
? ? ? ? monitors:
? ? ? ? - '192.168.1.54:6789'
? ? ? ? - '192.168.1.107:6789'
? ? ? ? - '192.168.1.248:6789'
? ? ? ? pool: k8s
? ? ? ? image: cephblocktest
? ? ? ? fsType: ext4
? ? ? ? readOnly: false
? ? ? ? user: admin
? ? ? ? keyring: /etc/ceph/ceph.client.admin.keyring
3笔咽、apply這個(gè)yaml
查看events會(huì)發(fā)現(xiàn)有這樣的報(bào)錯(cuò):
MountVolume.WaitForAttach failed for volume "rbdpd" : rbd: map failed exit status 6, rbd output: rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable k8s/cephblocktest object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
原因是因?yàn)檫@個(gè)image的feature部分有Linux kernel不支持的搔预,所以需要去掉多余的feature
rbd? feature disable k8s/cephblocktest? exclusive-lock object-map fast-diff deep-flatten
刪掉pod,再重新apply
不出意外叶组,就可以看到pod的/mnt/rbd掛載到了之前新建的image的塊設(shè)備了拯田,名字叫做/dev/rbd0
4、至于pv和pvc的方式來使用rbd就不開展了甩十,這都是k8s的知識(shí)了船庇,先有pv,再有pvc侣监,rbd塊設(shè)備先在pv里面綁定溢十,pod再去pvc申請pv
5、重點(diǎn)說一下k8s的storageClass結(jié)合rbd塊設(shè)備
secret的值需要通過base64轉(zhuǎn)換:
ceph auth get-key client.admin | base64
#sc的配置
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
? name: ceph-rbd
? annotations:
? ? storageclass.kubernetes.io/is-default-class: "false"
provisioner: kubernetes.io/rbd
reclaimPolicy: Retain
parameters:
? monitors: 192.168.1.54:6789,192.168.1.107:6789,192.168.1.248:6789
? adminId: admin
? adminSecretName: ceph-client-admin-secret
? adminSecretNamespace: default
? pool: k8s
? userId: admin
? userSecretName: ceph-client-admin-secret
? fsType: ext4
? imageFormat: "2"
? imageFeatures: "layering"
#secret的配置
apiVersion: v1
kind: Secret
metadata:
? name: ceph-client-admin-secret
? namespace: default
data:
? key: QVFBTGVySmVTMWcrSmhBQTUvS0p3TlJqcFVhZWdhYytmQko0NXc9PQ==
type: "kubernetes.io/rbd"
#pvc的配置
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
? name: ceph-pvc
? namespace: default
spec:
? storageClassName: ceph-rbd
? accessModes:
? - ReadWriteOnce
? resources:
? ? requests:
? ? ? storage: 1Gi
6达吞、如果集群是通過kubeadm安裝的张弛,那么kube-controller-manager里面是沒有rbd命令的,會(huì)導(dǎo)致pvc在申請sc創(chuàng)建imgae的時(shí)候,報(bào)錯(cuò)沒有rbd命令吞鸭,兩種方式處理:a寺董、修改/etc/kubernetes/manifest/kube-controller-manager.yaml中的image為帶有rbd命令的鏡像,比如:gcr.io/google_containers/hyperkube:v1.16.2刻剥;b遮咖、創(chuàng)建一個(gè)rbd-provisioner的外部配置器,指定sc里面的provisioner為這個(gè)外部配置器
7造虏、由于rbd塊存儲(chǔ)不支持多節(jié)點(diǎn)掛載讀寫御吞,所以當(dāng)你的deployment是多個(gè)replicas時(shí),你就不能使用上面的pvc模式了漓藕,此時(shí)陶珠,你要么使用cephfs,要么使用statefulset給每個(gè)副本一個(gè)pvc
apiVersion: apps/v1
kind: StatefulSet
metadata:
? name: nginx
spec:
? selector:
? ? matchLabels:
? ? ? app: nginx
? serviceName: "nginx"
? replicas: 3
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app: nginx
? ? spec:
? ? ? terminationGracePeriodSeconds: 10
? ? ? containers:
? ? ? - name: nginx
? ? ? ? image: nginx
? ? ? ? volumeMounts:
? ? ? ? - name: www
? ? ? ? ? mountPath: /usr/share/nginx/html
? volumeClaimTemplates:
? - metadata:
? ? ? name: www
? ? spec:
? ? ? accessModes: [ "ReadWriteOnce" ]
? ? ? storageClassName: "ceph-rbd"
? ? ? resources:
? ? ? ? requests:
? ? ? ? ? storage: 1Gi
8享钞、cephfs使用
ceph osd pool create cephfs_data 64
ceph osd pool create cephfs_metadata 64
ceph fs new cephfs cephfs_metadata cephfs_data? //創(chuàng)建一個(gè)文件系統(tǒng)
如果你在這里就想給storageClass使用cephfs文件系統(tǒng)的話揍诽,那么pod掛載的就是文件的根目錄,因此在這里建議劃分多個(gè)有目的性的目錄出來栗竖,分別賦予不同的應(yīng)用
mount -t ceph 192.168.1.54,192.168.1.107,192.168.1.248:/ /mnt/cephfs -o name=admin,secret=AQALerJeS1g+JhAA5/KJwNRjp...... //密鑰省略了一部分
ceph-fuse -r / /mnt/cephfs/ --name client.admin //mount無法掛載就使用ceph-fuse
掛載文件系統(tǒng)之后暑脆,創(chuàng)建多個(gè)子目錄:
mkdir /mnt/cephfs/k8s_frontend
mkdir /mnt/cephfs/k8s_backend
setfattr -n ceph.quota.max_bytes -v 100000000000 /mnt/cephfs/k8s_frontend //100GB的大小,表示這個(gè)文件系統(tǒng)下的前端目錄最大為100GB
setfattr -n ceph.quota.max_bytes -v 500000000000 /mnt/cephfs/k8s_backend //500GB的大小
因?yàn)閗8s還不支持cephfs作為internal-provisioner狐肢,所以需要使用k8s的external-provisioner來實(shí)現(xiàn)cephfs的storageClass的配置和操作
https://github.com/kubernetes-incubator/external-storage/tree/master/ceph/cephfs
但是添吗,這個(gè)還不是很完美,比如:pod顯示的掛載大小是你cephfs目錄的總大小份名,而不是pvc申明的大懈省(cephfs的目錄quota大小不受影響),這個(gè)有大神給出了解決方案同窘,但是官方還沒有給出支持,所以暫時(shí)不去嘗試了部脚。
總結(jié):以上就是對ceph存儲(chǔ)(塊存儲(chǔ)rbd和文件系統(tǒng)存儲(chǔ)cephfs)作為kubernetes底層storageClass的應(yīng)用部署和實(shí)踐想邦,希望能對大家有所幫助。