查看现在情况:
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
31
|
# top -p $(pidof ceph-osd)
top - 11:30:08 up 26 days, 16:38, 3 users, load average: 0.74, 0.57, 0.72
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.5 us, 1.6 sy, 0.0 ni, 94.1 id, 1.3 wa, 0.0 hi, 0.5 si, 0.0 st
MiB Mem : 91.5/16008.3 [|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ]
MiB Swap: 0.0/0.0 [ ]
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5831 167 20 0 12.7g 11.0g 7720 S 2.7 70.5 617:42.90 ceph-osd
# kubectl -n rook-ceph exec -it rook-ceph-tools-6ccb958485-j7pvb -- bash
# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 3.00000 root default
-3 1.00000 host node1
1 hdd 1.00000 osd.1 up 1.00000 1.00000
-7 1.00000 host node2
2 hdd 1.00000 osd.2 up 1.00000 1.00000
-5 1.00000 host node3
0 hdd 1.00000 osd.0 up 1.00000 1.00000
### 太残忍了, 就 15,6G 的内存你就要 13G, 还要不要其他进程活了?
# ceph tell osd.0 config show | grep -w osd_memory_target
"osd_memory_target": "13344836812",
# ceph tell osd.1 config show | grep -w osd_memory_target
"osd_memory_target": "13344836812",
# ceph tell osd.2 config show | grep -w osd_memory_target
"osd_memory_target": "13344836812",
### 安? 没有限制资源?难怪敢用那么多的内存。
# kubectl -n rook-ceph get pods rook-ceph-osd-0-7c76474f7-tnhc6 -ojson | jq .spec.containers[].resources
{}
|
资源限制:
再看看现在的情况
1
|
# kubectl -n rook-ceph get pods rook-ceph-osd-0-6ff54bb9c7-vbk59 -ojson | jq .spec.containers[].resources
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
### 这下看着舒服了
# top -p $(pidof ceph-osd)
top - 11:50:13 up 26 days, 16:58, 3 users, load average: 0.71, 0.97, 0.89
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.7 us, 1.1 sy, 0.0 ni, 96.0 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st
MiB Mem : 23.6/16008.3 [||||||||||||||||||||||||]
MiB Swap: 0.0/0.[]
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2172679 167 20 0 1462020 455712 33268 S 2.3 2.8 0:11.17 ceph-osd
# kubectl -n rook-ceph exec -it rook-ceph-tools-6ccb958485-j7pvb -- bash
# ceph tell osd.0 config show | grep -w osd_memory_target
"osd_memory_target": "3435973836",
|
备忘
1,如何在运行中的 ROOK CEPH 集群中设置 resource limit?
这就要使用 K8s 提供的功能了。K8s 不支持对运行中的 Pod 进行更新(除非你 delete 掉 pod,更新 pod 对应的 yaml,再使用该 yaml 重新创建 Pod),但是支持对运行中的 deployment 进行 resource limit 更新(注意:该更新同样会自动重启该 deployment 下的 Pod!)。
举个例子,假设 OSD0 之前没有设置 resource limit:
1
2
3
4
|
gemfield@ThinkPad-X1C:~$ kubectl -n rook-ceph describe pod rook-ceph-osd-0-6b89596bd8-tm966 | grep -i limit
POD_MEMORY_LIMIT: node allocatable (limits.memory)
POD_CPU_LIMIT: node allocatable (limits.cpu)
SizeLimit: <unset>
|
现在针对 OSD0 的 deployment 进行 resource limit 的更新(这里 limit 了 memory)针对运行后的 osd 进行资源限制:
1
2
|
gemfield@ThinkPad-X1C:~$ kubectl -n rook-ceph set resources deployment.v1.apps/rook-ceph-osd-0 --limits=memory=8192Mi
deployment.apps/rook-ceph-osd-0 resource requirements updated
|
最小硬件配置
安装 Ceph 集群的一个最小硬件推荐,如果小于这个配置的话,你就不用安装了,不然只会更痛苦。尤其是 recovery 的时候,呵呵,痛不欲生。
简而言之,CPU 一般不是问题,主要就是内存和网络。OSD 之间的网络最好是 10GbE+;内存会消耗多少呢?以 ROOK 为例,默认配置部署完成后(假设 14 块磁盘,每块 4TB),会启动:
- 14 个 ceph-osd;
- 3 个 ceph-mon;
- 2 个 ceph-mds;
- 1 个 ceph-rgw;
- 1 个 ceph-mgr;
对于 OSD 进程来说,每个 daemon 每 TB 需要 1GB,那么在这个上下文里:
- 每个 OSD 需要 4GB 内存,14 个 OSD 就需要 56GB 内存;
- 3 个 ceph-mon 就需要 6GB 内存;
- 2 个 mds 需要 4GB 内存。
但是,这是官方最小的内存推荐;下面 Gemfield 给出自己的推荐:
- 每个 OSD 每 TB 配置 2GB 内存,因为要考虑 recovery,这个是很耗费内存的,于是上述配置需要 112GB 内存;
- 每个 ceph-mon 配置 4GB 内存;
- 每个 ceph-mds 需要配置 10G 内存。
经过上述实践,我们发现在现有k8s
集群搭建一套ceph
存储只要满足以下两点即可:
整个部署流程对比非容器化部署更容易上手,利用k8s
天生优势,保证了存储服务的高可用性。