默认命名空间 rook-ceph,主要修改成自己的

建议镜像上传到私有仓库或拉取后部署

部署参考: RookCeph安装

一, 检查

1 pod 状态

pod 都是RunningCompleted状态

1
kubectl get pod -n rook-ceph |grep -v 'Running\|Completed'

2 集群状态

请注意以下状态,表明群集处于正常状态:

  • 群集运行状况:群集整体状态为HEALTH_OK,并且没有显示警告或错误状态消息。
  • Monitors(mon):所有监视器都包含在quorum列表中。
  • Manager(mgr):Ceph mgr 处于active状态。
  • OSDs(osd):所有 osd 都是upin状态。
  • Placement groups(pgs):所有 PG 都处于active+clean状态。
  • Ceph 文件系统元数据服务器(mds):所有 MDS 都处于up状态
  • Ceph 对象存储 RADOS 网关 (rgw):所有 rgw 都是active状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph status
cluster:
id: b5b9953a-5f24-498e-8d51-ab377e0e3376
health: HEALTH_OK

services:
mon: 3 daemons, quorum a,c,d (age 4h)
mgr: b(active, since 3d), standbys: a
mds: 1/1 daemons up, 1 hot standby
osd: 3 osds: 3 up (since 4h), 3 in (since 4h)
rgw: 1 daemon active (1 hosts, 1 zones)

data:
volumes: 1/1 healthy
pools: 12 pools, 305 pgs
objects: 58.63k objects, 223 GiB
usage: 449 GiB used, 151 GiB / 600 GiB avail
pgs: 305 active+clean

3 统计版本

1
kubectl -n rook-ceph get pod -o jsonpath='{range .items[*]}{"\t\t"}{.spec.containers[0].image}{"\t"}{.spec.initContainers[0].image}{"\n"}{end}' |sort -u

二, Rook 升级

本指南适用于从rook v1.9.x 升级到 rook v1.10.x

参考文档

v1.10 中的重大更改

  • 删除了对 ceph(15.2.x)的支持。如果您运行的是 v15,则必须先升级到 Ceph 到 v16 或 v17,然后再升级 Rook v1.10

  • Ceph-CSI 支持的最低版本是 v3.6.0。在将 Rook 操作员映像更新到 v1.10 之前或同时,您必须至少更新到此版本的 Ceph-CSI

  • 在升级到 K8s 1.25 之前,请确保您至少运行的是 Rook v1.10.3 或 v1.10.x。如果在升级到 v1.10.3 或更高版本之前升级到 K8s 1.25,则可能会阻止 Helm 图表升级到较新版本的 Rook。请参阅  #10826  了解可能的解决方法。

1 准备文件

1.1 下载

启用 Prometheus 需要升级 rbac,点击下载

1
2
wget https://raw.githubusercontent.com/rook/rook/v1.10.3/deploy/examples/common.yaml -O common-1.10.yaml
wget https://raw.githubusercontent.com/rook/rook/v1.10.3/deploy/examples/crds.yaml -O crds-1.10.yaml

1.2 修改配置

1
2
3
4
5
6
sed -i.bak \
-e "s/\(.*\):.*# namespace:operator/\1: rook-ceph # namespace:operator/g" \
-e "s/\(.*\):.*# namespace:cluster/\1: rook-ceph # namespace:cluster/g" \
common-1.10.yaml
# 注意版本,我这里是1.10.3
sed -i 's/1.9.10/1.10.3/g' operator.yaml

2 更新

1
2
kubectl apply -f common-1.10.yaml -f crds-1.10.yaml
kubectl apply -f operator.yaml

3 查看

Ceph 集群,mgr,OSD,rbd 镜像,MDS 和 RGW 被终止并按顺序替换为更新的版本。

当 mons 更新时,群集可能会非常短暂地无响应

升级 MDS 时,Ceph 文件系统可能会脱机几次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
kubectl -n rook-ceph get deployments -l rook_cluster=rook-ceph -o jsonpath='{range .items[*]}{.metadata.name}{"  \treq/upd/avl: "}{.spec.replicas}{"/"}{.status.updatedReplicas}{"/"}{.status.readyReplicas}{"  \trook-version="}{.metadata.labels.rook-version}{"\n"}{end}'
rook-ceph-crashcollector-k8s-ceph-100 req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-crashcollector-k8s-ceph-136 req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-crashcollector-k8s-ceph-142 req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-mds-ccfs-a req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-mds-ccfs-b req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-mgr-a req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-mgr-b req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-mon-a req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-mon-c req/upd/avl: 1/1/ rook-version=v1.10.3
rook-ceph-mon-d req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-nfs-cc-nfs-a req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-osd-0 req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-osd-1 req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-osd-2 req/upd/avl: 1/1/1 rook-version=v1.10.3
rook-ceph-rgw-ccs3-store-a req/upd/avl: 1/1/1 rook-version=v1.10.3

三, Ceph 升级

注意事项参考

1 修改 ceph 版本

1
2
3
4
5
vim cluster.yaml
......
image: quay.io/ceph/ceph:v17.2.4-20220930
......
kubectl apply -f cluster.yaml

2 升级后处理

会报错Telemetry requires re-opt-in

1
2
ceph telemetry on --license sharing-1-0
ceph telemetry enable channel perf

3 检查

3.1 查看版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
kubectl -n rook-ceph get deployments -l rook_cluster=rook-ceph -o jsonpath='{range .items[*]}{.metadata.name}{"  \treq/upd/avl: "}{.spec.replicas}{"/"}{.status.updatedReplicas}{"/"}{.status.readyReplicas}{"  \tceph-version="}{.metadata.labels.ceph-version}{"\n"}{end}'

rook-ceph-crashcollector-k8s-ceph-100 req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-crashcollector-k8s-ceph-136 req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-crashcollector-k8s-ceph-142 req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-mds-ccfs-a req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-mds-ccfs-b req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-mgr-a req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-mgr-b req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-mon-a req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-mon-c req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-mon-d req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-nfs-cc-nfs-a req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-osd-0 req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-osd-1 req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-osd-2 req/upd/avl: 1/1/1 ceph-version=17.2.4-0
rook-ceph-rgw-ccs3-store-a req/upd/avl: 1/1/1 ceph-version=17.2.4-0

3.2 查看集群状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cluster:
id: b5b9953a-5f24-498e-8d51-ab377e0e3376
health: HEALTH_OK

services:
mon: 3 daemons, quorum a,c,d (age 11m)
mgr: a(active, since 9m), standbys: b
mds: 1/1 daemons up, 1 hot standby
osd: 3 osds: 3 up (since 10m), 3 in (since 6h)
rgw: 1 daemon active (1 hosts, 1 zones)

data:
volumes: 1/1 healthy
pools: 12 pools, 305 pgs
objects: 54.36k objects, 207 GiB
usage: 415 GiB used, 185 GiB / 600 GiB avail
pgs: 305 active+clean

四, 添加 ceph 节点

先把节点加入 k8s 集群

1 修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim cluster.yaml
nodes:
- name: "10.1.1.1"
devices:
- name: "sdb"
- name: "10.1.1.2"
devices:
- name: "sdb"
- name: "10.1.1.3"
devices:
- name: "sdb"
- name: "10.1.1.4"
devices:
- name: "sdb"

2 更新配置

kubectl apply -f cluster.yaml

3 查看节点是否正常

新加的节点 1T,数据一点一点平衡过来,期间读写性能很差,建议在业务低峰期添加节点,或者参考下面修改 recovery 策略

并且因为前面咱们开启了 pg_autoscaler,因为新加的节点磁盘比较大,所以自动分配的权重比较大.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
0 hdd 0.19530 1.00000 200 GiB 115 GiB 115 GiB 980 KiB 681 MiB 85 GiB 57.65 2.12 162 up
1 hdd 0.19530 1.00000 200 GiB 120 GiB 119 GiB 954 KiB 995 MiB 80 GiB 60.03 2.21 161 up
2 hdd 0.19530 1.00000 200 GiB 137 GiB 137 GiB 1.1 MiB 664 MiB 63 GiB 68.67 2.53 162 up
3 hdd 1.00000 1.00000 1 TiB 69 GiB 69 GiB 0 B 268 MiB 955 GiB 6.72 0.25 172 up
TOTAL 1.6 TiB 442 GiB 439 GiB 3.0 MiB 2.5 GiB 1.2 TiB 27.19
MIN/MAX VAR: 0.25/2.53 STDDEV: 32.19
ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
0 hdd 0.19530 1.00000 200 GiB 67 GiB 66 GiB 980 KiB 814 MiB 133 GiB 33.48 1.31 120 up
1 hdd 0.19530 1.00000 200 GiB 74 GiB 73 GiB 954 KiB 1.1 GiB 126 GiB 37.10 1.46 132 up
2 hdd 0.19530 1.00000 200 GiB 69 GiB 68 GiB 1.1 MiB 819 MiB 131 GiB 34.48 1.35 116 up
3 hdd 1.00000 1.00000 1 TiB 203 GiB 203 GiB 0 B 731 MiB 821 GiB 19.86 0.78 289 up
TOTAL 1.6 TiB 413 GiB 410 GiB 3.0 MiB 3.4 GiB 1.2 TiB 25.46
MIN/MAX VAR: 0.78/1.46 STDDEV: 8.84

4 修改 recovery 策略

可以操作以下参数实现速度控制,但是要留意,速度越快对集群性能的影响越大;可以动态的调整参数值,观察 recovery 对集群性能影响情况,找到合适自己的值,即不会对 client 请求造成过大影响的同时保障最优的 recovery 速度。

参数名称 解释
osd_recovery_max_single_start 同时启动多少线程实现 recovery
osd_backfill_retry_interval osd 在重试回填请求之前等待的秒数(默认 30 秒)
osd_recovery_sleep_hdd hd 磁盘在恢复过程中的休眠时间
osd_recovery_sleep_ssd ssd 磁盘在恢复过程中的休眠时间
osd_max_backfills 允许进出 OSD 的最大回填操作数。数字越大,恢复越快。
osd_recovery_max_active OSD 恢复请求的数量。数字越大,恢复越快。
osd_recovery_op_priority 恢复操作优先级,取值 1-63,值越高占用资源越高,恢复越快。
osd_recovery_priority 同上,恢复操作的优先级,如过不希望影响业务,设置优先级低一些,数字越小,性能影响越小。

4.1 查看现在配置并记录

1
2
3
4
5
6
ceph-osd -i 1 --show-config |  egrep "osd_recovery_max_active|osd_recovery_op_priority|osd_max_backfills"
osd_max_backfills = 1
osd_recovery_max_active = 0
osd_recovery_max_active_hdd = 3
osd_recovery_max_active_ssd = 10
osd_recovery_op_priority = 3

4.2 修改

1
ceph tell 'osd.*' injectargs --osd-recovery-max-active=1

4.3 还原配置

数据平衡后还原

1
ceph tell 'osd.*' injectargs --osd-recovery-max-active=3

五, 节点下线维护

1 暂时关闭 operator

防止故障转移

1
kubectl -n rook-ceph scale deployment rook-ceph-operator --replicas=0

2 移除故障 osd 数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ceph osd set noup
ceph osd down 3
ceph osd out 3
# 等待数据均衡完成
ceph -s
......
progress:
Global Recovery Event (12m)
[=====================.......] (remaining: 3m)
# 查看osd状态
ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 1.58589 root default
-5 0.19530 host k8s-ceph-100
0 hdd 0.19530 osd.0 up 1.00000 1.00000
-3 0.19530 host k8s-ceph-136
1 hdd 0.19530 osd.1 up 1.00000 1.00000
-7 0.19530 host k8s-ceph-142
2 hdd 0.19530 osd.2 up 1.00000 1.00000
-9 1.00000 host k8s-ceph-153
3 hdd 1.00000 osd.3 down 0 1.00000

3 移除故障的 osd

1
2
3
4
5
6
7
8
9
10
11
12
13
ceph osd purge 3 --yes-i-really-mean-it
ceph auth del osd.3
# 查看osd状态
ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.58589 root default
-5 0.19530 host k8s-ceph-100
0 hdd 0.19530 osd.0 up 1.00000 1.00000
-3 0.19530 host k8s-ceph-136
1 hdd 0.19530 osd.1 up 1.00000 1.00000
-7 0.19530 host k8s-ceph-142
2 hdd 0.19530 osd.2 up 1.00000 1.00000
-9 0 host k8s-ceph-153

4 删除节点(可选)

不建议删除节点,重新加入节点 osd 启动不起来,报 Unable to create a new OSD id

1
2
3
4
5
6
7
8
9
10
11
12
ceph osd crush remove k8s-ceph-153
removed item id -9 name 'k8s-ceph-153' from crush map
# 查看osd状态
ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.58589 root default
-5 0.19530 host k8s-ceph-100
0 hdd 0.19530 osd.0 up 1.00000 1.00000
-3 0.19530 host k8s-ceph-136
1 hdd 0.19530 osd.1 up 1.00000 1.00000
-7 0.19530 host k8s-ceph-142
2 hdd 0.19530 osd.2 up 1.00000 1.00000

4.1 删除配置文件里的节点

1
2
3
4
5
6
7
8
9
10
11
vim cluster.yaml
nodes:
- name: "10.1.1.1"
devices:
- name: "sdb"
- name: "10.1.1.2"
devices:
- name: "sdb"
- name: "10.1.1.3"
devices:
- name: "sdb"

4.2 更新配置

kubectl apply -f cluster.yaml

4.3 移除 pod 和对应的 job

1
2
kubectl delete deploy -n rook-ceph rook-ceph-osd-3
kubectl delete job -n rook-ceph rook-ceph-osd-prepare-k8s-ceph-153

4.4 查看

1
2
3
4
kubectl get pod -n rook-ceph |grep osd
rook-ceph-osd-0-bf44ccb8-qhlwx 1/1 Running 1 (78m ago) 22h
rook-ceph-osd-1-568fbf7fbd-x7wbv 1/1 Running 1 (5h26m ago) 4d18h
rook-ceph-osd-2-6d5d5b7f8-gvtqj 1/1 Running 0 23h

5 恢复集群

1
2
ceph osd unset noup
kubectl -n rook-ceph scale deployment rook-ceph-operator --replicas=1

六, 遇到的问题

1 daemons have recently crashed

重启后产生的

1
2
3
4
5
6
7
8
9
10
11
# 查看状态
ceph status
# 查看系统中所有的崩溃
ceph crash ls
# 查看新的崩溃
ceph crash ls-new
ID ENTITY NEW
2022-09-23T08:03:43.783384Z_4fce84ae-9947-4c5c-8623-c2e70cf0565f osd.2 *
2022-09-23T08:19:42.357142Z_3417133f-ba77-40cb-9203-b76b2bdca374 osd.2 *
# 所有id都要进行操作
ceph crash archive 2022-09-23T08:03:43.783384Z_4fce84ae-9947-4c5c-8623-c2e70cf0565f

2 pgs not scrubbed in time

PG 没有 deep-scrubbed 造成,手动对异常 PG 进行 deep-scrubb 清理就可以了,应该是 OSDs 掉线后,CEPH 自动进行数据恢复。再将相应的 OSDs 重新加入后,则需要将恢复的数据再擦除掉。于是提示相应的警告信息,正在进行删除相关的操作,且其 pgs 的数量会不断变少。等待一段时间后,则恢复正常,此时 ceph 文件系统性能很差。

1
2
3
4
5
6
7
# ceph -s
cluster:
id: b5b9953a-5f24-498e-8d51-ab377e0e3376
health: HEALTH_WARN
23 pgs not scrubbed in time
# ceph health detail
# ceph health detail |grep 'since'|awk '{print "ceph pg deep-scrub "$2}'|bash

3 active+clean+remapped

出现这种情况,一般是做了 osd 的  reweight  操作引起的,这是因为一般在做  reweight  的操作的时候,根据算法,这个上面的 pg 是会尽量分布在这个主机上的,而  crush reweight  不变的情况下,去修改 osd 的  reweight  的时候,可能算法上会出现无法映射的问题。

osd2 的 REWEIGHT 为 0.x, 需要手动调整到 1.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# ceph -s
......
data:
volumes: 1/1 healthy
pools: 12 pools, 209 pgs
objects: 18.66k objects, 69 GiB
usage: 138 GiB used, 462 GiB / 600 GiB avail
pgs: 49/37714 objects misplaced (0.130%)
203 active+clean # 正常
6 active+clean+remapped # 非正常
# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.58589 root default
-5 0.19530 host k8s-ceph-100
0 hdd 0.19530 osd.0 up 1.00000 1.00000
-3 0.19530 host k8s-ceph-136
1 hdd 0.19530 osd.1 up 1.00000 1.00000
-7 0.19530 host k8s-ceph-142
2 hdd 0.19530 osd.2 up 0.95001 1.00000
# ceph osd reweight 2 1.0
reweighted osd.2 to 1 (10000)
# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.58589 root default
-5 0.19530 host k8s-ceph-100
0 hdd 0.19530 osd.0 up 1.00000 1.00000
-3 0.19530 host k8s-ceph-136
1 hdd 0.19530 osd.1 up 1.00000 1.00000
-7 0.19530 host k8s-ceph-142
2 hdd 0.19530 osd.2 up 1.00000 1.00000