共计 13676 个字符,预计需要花费 35 分钟才能阅读完成。
写在开篇
“
上一次,我发了一篇:《实践篇:让咱们一起鲁克鲁克——rook(开源存储编排)》。这次,来一篇实战,应用 rook 在 k8s 上把 ceph 集群搞起来。后续,还会陆续分享如何对接 k8s(作为 k8s 的后端存储)、以及分享一些在生产上的实践经验。
”
环境规划
主机名 | IP | 角色 | 数据磁盘 |
---|---|---|---|
k8s-a-master | 192.168.11.10 | k8s master | |
k8s-a-node01 | 192.168.11.11 | k8s worker、ceph osd | 1 个 1TB 硬盘 |
k8s-a-node02 | 192.168.11.12 | k8s worker、ceph osd | 1 个 1TB 硬盘 |
k8s-a-node03 | 192.168.11.13 | k8s worker、ceph osd | 1 个 1TB 硬盘 |
k8s-a-node04 | 192.168.11.14 | k8s worker、ceph osd | 1 个 1TB 硬盘 |
k8s-a-node05 | 192.168.11.15 | k8s worker、ceph osd | 1 个 1TB 硬盘 |
k8s-a-node06 | 192.168.11.16 | k8s worker、ceph osd | 1 个 1TB 硬盘 |
k8s-a-node07 | 192.168.11.17 | k8s worker、ceph osd | 1 个 1TB 硬盘 |
k8s-a-node08 | 192.168.11.18 | k8s worker、ceph osd | 1 个 1TB 硬盘 |
k8s-a-node09 | 192.168.11.19 | k8s worker、ceph osd | 1 个 1TB 硬盘 |
k8s-a-node010 | 192.168.11.20 | k8s worker、ceph osd | 1 个 1TB 硬盘 |
筹备工作
“
筹备工作在所有 worker 节点上做操作。
”
- 数据盘筹备,除了 sda 是装了操作系统之外,sdb 是用于 osd 盘的,不能被格式化文件系统
[root@k8s-a-node01 ~]# lsblk
sda 8:0 0 500G 0 disk
├─sda1 8:1 0 2G 0 part /boot
└─sda2 8:2 0 498G 0 part
├─centos-root 253:0 0 122G 0 lvm /
...
sdb 8:16 0 1000G 0 disk # 就是这块
- 装置 lvm2 如果在裸设施或未应用的分区上创立 OSD,则 Ceph OSD 具备对 LVM(逻辑卷治理)的依赖。
yum install -y lvm2
- 加载 rbd 模块 Ceph 须要应用带有 RBD 模块的 Linux 内核。许多 Linux 发行版都曾经蕴含了 RBD 模块,但不是所有的发行版都有,所以要确认。
modprobe rbd
lsmod | grep rbd
“
Rook 的默认 RBD 配置仅指定了 layering 个性,以便与较旧的内核放弃兼容。如果您的 Kubernetes 节点运行的是 5.4 或更高版本的内核,您能够抉择启用其余个性标记。其中,fast-diff 和 object-map 个性尤其有用。
”
- 降级内核(可选)如果你将应用 Ceph 共享文件系统(CephFS)来创立卷(Volumes),则 rook 官网倡议应用至多 4.17 版本的 Linux 内核。如果你应用的内核版本低于 4.17,则申请的 Persistent Volume Claim(PVC)大小将不会被强制执行。存储配额(Storage quotas)只能在较新的内核上失去强制执行。
在 Kubernetes 中,PVC 用于向存储系统申请指定大小的存储空间。如果申请的 PVC 大小无奈失去强制执行,则无奈保障所申请的存储空间大小。因为存储配额在较旧的内核上无奈失去强制执行,因而在应用 CephFS 创立卷时,如果应用较旧的内核版本,则可能无奈正确地治理和调配存储空间。因而,rook 官网倡议应用至多 4.17 版本的内核。
在所有 k8s 节点降级内核,之前遗记思考这个事件,当前得提前降级好内核再搭建 k8s 集群,这种状况下降级内核,很难保障不会对 k8s 集群带来间接影响。留神了,生产环境可不能这么玩,得提前做好布局和筹备。
我的 centos7 内核以后版本:
[root@k8s-a-node01 ~]# uname -r
3.10.0-1160.el7.x86_64
开始降级
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml-headers kernel-ml -y
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
uname -sr
# 降级实现后查看内核,曾经满足条件
[root@k8s-a-node10 ~]# uname -sr
Linux 6.2.9-1.el7.elrepo.x86_64
# 看看 k8s 是否失常,我的没问题,十分顺利。kubectl get nodes
kubectl get pod -n kube-system
部署 ceph 集群
- 部署 Rook Operator
git clone --single-branch --branch v1.11.2 https://github.com/rook/rook.git
cd rook/deploy/examples/
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
# 在持续操作之前,验证 rook-ceph-operator 是否失常运行
kubectl get deployment -n rook-ceph
kubectl get pod -n rook-ceph
- 创立 Ceph 集群
“
当初 Rook Operator 曾经运行起来了,接下来咱们能够创立 Ceph 集群。
”
Rook 容许通过自定义资源定义(CephCluster CRD)创立和自定义存储集群,创立群集的次要模式有四种不同的模式,对于模式以及对于 cluster.yaml 所有可用的字段和阐明请仔细阅读和参考:https://rook.io/docs/rook/v1.11/CRDs/Cluster/ceph-cluster-crd/
本次创立的集群就先按官网示例里的 cluster.yaml,不改变示例里的内容,它会在每个节点将创立一个 OSD
kubectl create -f cluster.yaml
创立后查看,请确保所有 Pod 处于 Running,OSD POD 处于 Completed:
[root@k8s-a-master ~]# kubectl get pod -n rook-ceph
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-4cx9v 2/2 Running 0 45m
csi-cephfsplugin-84fd4 2/2 Running 0 45m
csi-cephfsplugin-dnx6l 2/2 Running 0 45m
csi-cephfsplugin-gb4f7 2/2 Running 0 45m
csi-cephfsplugin-mtd67 2/2 Running 0 45m
csi-cephfsplugin-nrnck 2/2 Running 0 45m
csi-cephfsplugin-p5kmv 2/2 Running 0 45m
csi-cephfsplugin-provisioner-9f7449fc9-9qf67 5/5 Running 0 45m
csi-cephfsplugin-provisioner-9f7449fc9-k2cxc 5/5 Running 0 45m
csi-cephfsplugin-vhfr7 2/2 Running 0 45m
csi-cephfsplugin-wrgrb 2/2 Running 0 45m
csi-cephfsplugin-xt6f6 2/2 Running 0 45m
csi-rbdplugin-5mnb8 2/2 Running 0 45m
csi-rbdplugin-9j69s 2/2 Running 0 45m
csi-rbdplugin-ffg9b 2/2 Running 0 45m
csi-rbdplugin-ggfxk 2/2 Running 0 45m
csi-rbdplugin-h5gj7 2/2 Running 0 45m
csi-rbdplugin-ks7db 2/2 Running 0 45m
csi-rbdplugin-l2kmv 2/2 Running 0 45m
csi-rbdplugin-l5jm2 2/2 Running 0 45m
csi-rbdplugin-m7nc4 2/2 Running 0 45m
csi-rbdplugin-provisioner-649c57b978-m5pdk 5/5 Running 0 45m
csi-rbdplugin-provisioner-649c57b978-trp8j 5/5 Running 0 45m
csi-rbdplugin-szchk 2/2 Running 0 45m
rook-ceph-crashcollector-k8s-a-node01-6db7865746-clr4h 1/1 Running 0 50m
rook-ceph-crashcollector-k8s-a-node02-97bb5864c-wqbx4 1/1 Running 0 37m
rook-ceph-crashcollector-k8s-a-node03-59777d587b-gkr24 1/1 Running 0 41m
rook-ceph-crashcollector-k8s-a-node04-7f77bbdcfc-qgh7x 1/1 Running 0 45m
rook-ceph-crashcollector-k8s-a-node05-7cd59b4bc8-nkfgt 1/1 Running 0 45m
rook-ceph-crashcollector-k8s-a-node06-74dc6dc879-n9z5z 1/1 Running 0 45m
rook-ceph-crashcollector-k8s-a-node07-5f4c5c6c56-27zs9 1/1 Running 0 50m
rook-ceph-crashcollector-k8s-a-node08-7fd7ff557-5qthx 1/1 Running 0 39m
rook-ceph-crashcollector-k8s-a-node09-6b7d5645f4-fdpwp 1/1 Running 0 50m
rook-ceph-crashcollector-k8s-a-node10-69f8f5cbfb-6mhtw 1/1 Running 0 33m
rook-ceph-mgr-a-86f445fdcc-vdg4b 3/3 Running 0 50m
rook-ceph-mgr-b-7b7967fd54-wjhxw 3/3 Running 0 50m
rook-ceph-mon-a-6dd564d54d-cq4rb 2/2 Running 0 52m
rook-ceph-mon-b-5c4875d7b9-xbd7l 2/2 Running 0 51m
rook-ceph-mon-c-7fb466569d-qwb6v 2/2 Running 0 51m
rook-ceph-operator-c489cccb5-8dtnz 1/1 Running 1 (116m ago) 14h
rook-ceph-osd-0-f7cc57ddf-vc9tg 2/2 Running 0 50m
rook-ceph-osd-1-7d79b4d4c-rbrkn 2/2 Running 0 50m
rook-ceph-osd-2-564d78d445-jpjqk 2/2 Running 0 50m
rook-ceph-osd-3-7ddf87bfd6-dlvmf 2/2 Running 0 45m
rook-ceph-osd-4-849ddc4b68-5xg8h 2/2 Running 0 45m
rook-ceph-osd-5-5ff57d4d55-skwv6 2/2 Running 0 45m
rook-ceph-osd-6-668fcb969c-cwb46 2/2 Running 0 41m
rook-ceph-osd-7-7876687b4d-r4b2g 2/2 Running 0 39m
rook-ceph-osd-8-6c7784c4c-6xtv6 2/2 Running 0 37m
rook-ceph-osd-9-654ffc5b66-qqhnr 2/2 Running 0 33m
rook-ceph-osd-prepare-k8s-a-node01-6lf6r 0/1 Completed 0 33m
rook-ceph-osd-prepare-k8s-a-node02-8rcpw 0/1 Completed 0 33m
rook-ceph-osd-prepare-k8s-a-node03-dqcl4 0/1 Completed 0 33m
rook-ceph-osd-prepare-k8s-a-node04-8qtmq 0/1 Completed 0 33m
rook-ceph-osd-prepare-k8s-a-node05-qm78x 0/1 Completed 0 33m
rook-ceph-osd-prepare-k8s-a-node06-qq58n 0/1 Completed 0 33m
rook-ceph-osd-prepare-k8s-a-node07-lp9j8 0/1 Completed 0 33m
rook-ceph-osd-prepare-k8s-a-node08-vh4sn 0/1 Completed 0 33m
rook-ceph-osd-prepare-k8s-a-node09-smvp8 0/1 Completed 0 32m
rook-ceph-osd-prepare-k8s-a-node10-k6ggk 0/1 Completed 0 32m
rook-ceph-tools-54bdbfc7b7-hqdw4 1/1 Running 0 24m
[root@k8s-a-master ~]#
- 验证 ceph 集群
要验证群集是否处于失常状态,能够连贯到 toolbox 工具箱并运行命令
kubectl create -f toolbox.yaml
kubectl exec -it rook-ceph-tools-54bdbfc7b7-hqdw4 -n rook-ceph -- bash
# 进去之后就能够执行各种命令了:ceph status
ceph osd status
ceph df
rados df
# 看看我的
[root@k8s-a-master examples]# kubectl exec -it rook-ceph-tools-54bdbfc7b7-pzkd4 -n rook-ceph -- bash
bash-4.4$ ceph -s
cluster:
id: 0b64957b-9aaa-43ef-9946-211ca911dc92
health: HEALTH_OK
services:
mon: 3 daemons, quorum a,b,c (age 3m)
mgr: a(active, since 64s), standbys: b
osd: 10 osds: 10 up (since 116s), 10 in (since 2m)
data:
pools: 1 pools, 1 pgs
objects: 2 objects, 449 KiB
usage: 234 MiB used, 9.8 TiB / 9.8 TiB avail
pgs: 1 active+clean
bash-4.4$ ceph osd status
ID HOST USED AVAIL WR OPS WR DATA RD OPS RD DATA STATE
0 k8s-a-node02 23.9M 999G 0 0 0 0 exists,up
1 k8s-a-node03 20.9M 999G 0 0 0 0 exists,up
2 k8s-a-node04 24.9M 999G 0 0 0 0 exists,up
3 k8s-a-node06 24.9M 999G 0 0 0 0 exists,up
4 k8s-a-node05 23.8M 999G 0 0 0 0 exists,up
5 k8s-a-node07 23.8M 999G 0 0 0 0 exists,up
6 k8s-a-node08 19.8M 999G 0 0 0 0 exists,up
7 k8s-a-node10 23.8M 999G 0 0 0 0 exists,up
8 k8s-a-node01 23.8M 999G 0 0 0 0 exists,up
9 k8s-a-node09 23.7M 999G 0 0 0 0 exists,up
每个 OSD 都有一个状态,能够是以下几种之一:
- up:示意该 OSD 失常运行,并且能够解决数据申请。
- down:示意该 OSD 以后无奈运行或不可用,可能因为硬件故障或软件问题。
- out:示意该 OSD 不参加数据存储或复原,这通常是因为管理员手动将其标记为不可用。
- exists:示意该 OSD 配置存在,但尚未启动或退出集群。
“
在我这里,exists,up 示意该 OSD 配置存在,并且曾经胜利启动并参加了数据存储和复原。exists 状态示意 OSD 配置曾经存在,然而 OSD 还没有启动。只有当 OSD 运行后,状态才会变为 up。因而,exists,up 示意 OSD 的启动过程曾经实现,并且 OSD 失常运行。
”
裸露 Dashboard
Dashboard 能够让咱们查看 Ceph 集群的状态,包含整体的运行状况、mon 仲裁状态、mgr、osd 和其余 Ceph 守护程序的状态、查看池和 PG 状态、显示守护程序的日志等。对于 Dashboard 的更多配置,请参考:https://rook.io/docs/rook/v1.11/Storage-Configuration/Monitor…
- 查看 dashboard 的 svc,Rook 将启用端口 8443 以进行 https 拜访:
[root@k8s-a-master ~]# kubectl get svc -n rook-ceph
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-mgr ClusterIP 10.103.90.1 <none> 9283/TCP 52m
rook-ceph-mgr-dashboard ClusterIP 10.108.66.238 <none> 8443/TCP 52m
rook-ceph-mon-a ClusterIP 10.104.191.13 <none> 6789/TCP,3300/TCP 54m
rook-ceph-mon-b ClusterIP 10.108.194.172 <none> 6789/TCP,3300/TCP 53m
rook-ceph-mon-c ClusterIP 10.98.32.80 <none> 6789/TCP,3300/TCP 53m
[root@k8s-a-master ~]#
- rook-ceph-mgr:是 Ceph 的治理过程(Manager),负责集群的监控、状态报告、数据分析、调度等性能,它默认监听 9283 端口,并提供了 Prometheus 格局的监控指标,能够被 Prometheus 拉取并用于集群监控。
- rook-ceph-mgr-dashboard:是 Rook 提供的一个 Web 界面,用于不便地查看 Ceph 集群的监控信息、状态、性能指标等。
- rook-ceph-mon:是 Ceph Monitor 过程的 Kubernetes 服务。Ceph Monitor 是 Ceph 集群的外围组件之一,负责保护 Ceph 集群的状态、拓扑构造、数据分布等信息,是 Ceph 集群的治理节点。
- 查看默认账号 admin 的明码
[root@k8s-a-master examples]# kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
$}<EVv58G-*C3@/?J1@t
“
这个明码就是等会用来登录
”
- 应用 NodePort 类型的 Service 裸露 dashboard dashboard-external-https.yaml
apiVersion: v1
kind: Service
metadata:
name: rook-ceph-mgr-dashboard-external-https
namespace: rook-ceph
labels:
app: rook-ceph-mgr
rook_cluster: rook-ceph
spec:
ports:
- name: dashboard
port: 8443
protocol: TCP
targetPort: 8443
selector:
app: rook-ceph-mgr
rook_cluster: rook-ceph
sessionAffinity: None
type: NodePort
- 创立后 NodePort 类的 svc 后查看
[root@k8s-a-master examples]# kubectl get svc -n rook-ceph
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-mgr ClusterIP 10.96.58.93 <none> 9283/TCP 28m
rook-ceph-mgr-dashboard ClusterIP 10.103.131.77 <none> 8443/TCP 28m # 记得干掉
rook-ceph-mgr-dashboard-external-https NodePort 10.107.247.53 <none> 8443:32564/TCP 9m38s
rook-ceph-mon-a ClusterIP 10.98.168.35 <none> 6789/TCP,3300/TCP 29m
rook-ceph-mon-b ClusterIP 10.103.127.134 <none> 6789/TCP,3300/TCP 29m
rook-ceph-mon-c ClusterIP 10.111.46.187 <none> 6789/TCP,3300/TCP 29m
“
ClusterIP 类型的 SVC 是集群部署后默认创立的,要干掉,不然影响 NodePort 类型的拜访。
”
- 在任何节点拜访 dashboard
清理集群
“
如果你不想要这个集群了,干掉这个集群也是很简略的,工夫无限,我就不再输入,可参考官网文档:https://rook.io/docs/rook/v1.11/Getting-Started/ceph-teardown…。后续我也会专门抽个工夫做个分享。
”
写在最初
对于 3 种存储类型的实战,下次持续分享:
- 块:创立要由 Pod(RWO)应用的块存储
- 共享文件系统:创立要在多个 Pod(RWX)之间共享的文件系统
- 对象:创立可在 Kubernetes 集群外部或内部拜访的对象存储
“
PS:我会继续的分享 k8s、rook ceph 等等,感激各位盆友高度关注,如你跟着我的文章做测试,遇到问题解决不了的时候可私信我,我会尽力帮忙您解决问题。
”
本文转载于 WX 公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/gBErT26UikPBdsot9_Tjqg