新钛云服已为您服务1205天

大咖专栏 | 祝祥
Rook介绍
Operator:由一些CRD和一个All in one镜像构成,包含包含启动和监控存储系统的所有功能。
Cluster:负责创建CRD对象,指定相关参数,包括ceph镜像、元数据持久化位置、磁盘位置、dashboard等等…
故障场景
新的Pod无法从Ceph挂载RBD镜像; 诸如 lsblk
和df
之类的命令在Kubernetes节点上不起作用。这表明挂载在节点上的RBD镜像出了点问题。您无法读取它们,这意味着Ceph Mon不可用。Ceph Mon和OSD/MGR Pod都无法在集群中运行。
rook-ceph-operatorPod是什么时候开始启动的?事实证明,这是最近才发生的。为什么?菜鸟运维人员可能会突然决定创建一个新的集群!那么,我们又该如何还原旧群集及其数据?
Rook的手工恢复历程
恢复Ceph Monitor节点
rook-ceph-config和
rook-config-override。它们是在部署集群成功后创建的。
ls/dev/RBD*)的服务器进行硬重启。您可以使用sysrq。此步骤对于卸载所有已挂载的RBD镜像是必须的,因为在这种情况下,常规重新启动将不起作用(系统无法正常的卸载镜像)。
Volumes:
rook-ceph-config:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: rook-ceph-config
rook-ceph-mons-keyring:
Type: Secret (a volume populated by a Secret)
SecretName: rook-ceph-mons-keyring
rook-ceph-log:
Type: HostPath (bare host directory volume)
Path: var/lib/rook/kube-rook/log
ceph-daemon-data:
Type: HostPath (bare host directory volume)
Path: var/lib/rook/mon-a/data
Mounts:
etc/ceph from rook-ceph-config (ro)
etc/ceph/keyring-store/ from rook-ceph-mons-keyring (ro)
var/lib/ceph/mon/ceph-a from ceph-daemon-data (rw)
var/log/ceph from rook-ceph-log (rw)
rook-ceph-mons-keyring secret的内容:
kind: Secret
data:
keyring: LongBase64EncodedString=
[mon.]
key = AQAhT19dlUz0LhBBINv5M5G4YyBswyU43RsLxA==
caps mon = "allow *"
[client.admin]
key = AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
caps mgr = "allow *"
rook-ceph-admin-keyring secret的内容:
kind: Secret
data:
keyring: anotherBase64EncodedString=
[client.admin]
key = AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
caps mgr = "allow *"
rook-ceph-mgr-a-keyring secret:
[mgr.a]
key = AQBZR19dbVeaIhBBXFYyxGyusGf8x1bNQunuew==
caps mon = "allow *"
caps mds = "allow *"
caps osd = "allow *"
rook-ceph-monConfigMap中发现了更多
secret:
kind: Secret
data:
admin-secret: AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
cluster-name: a3ViZS1yb29r
fsid: ZmZiYjliZDMtODRkOS00ZDk1LTczNTItYWY4MzZhOGJkNDJhCg==
mon-secret: AQAhT19dlUz0LhBBINv5M5G4YyBswyU43RsLxA==
keyrings列表,并且是上述所有
keyrings的来源。
keyring,这些
keyring已安装到包含Ceph Monitor和OSD的Pod中。为此,我们必须在
/var/lib/rook/mon-a/data/keyring节点上找到相应的目录并检查其内容:
# cat var/lib/rook/mon-a/data/keyring
[mon.]
key = AXAbS19d8NNUXOBB+XyYwXqXI1asIzGcGlzMGg==
caps mon = "allow *"
secret不同于ConfigMap中的
secret。
keyring又是怎么的呢?它也是存在的:
# cat var/lib/rook/kube-rook/client.admin.keyring
[client.admin]
key = AXAbR19d8GGSMUBN+FyYwEqGI1aZizGcJlHMLgx=
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
caps mgr = "allow *"
secret包含新的
keyring,并且与我们的旧群集不匹配。这就是为什么我们必须:
使用 /var/lib/rook/mon-a/data/keyring
文件(或备份)中的Ceph Monitorkeyring
;更换 rook-ceph-mons-keyring
secret中的keyring;在 rook-ceph-mon
ConfigMap中指定admin和monitorkeyring
;删除Ceph Monitor的Pod。
还原OSD
rook-operatorPod。执行
ceph mon dump后显示所有Ceph Monitor均已就位,
ceph -s表示它们已达到法定人数。但是,如果我们查看OSD Tree(
ceph osd tree),则会发现一些奇怪的现象:OSD开始出现,但它们为空。看来我们必须以某种方式还原它们。但是如何做?
rook-ceph-config,
rook-config-override(以及其他比如名称为rook-ceph osd-$nodename-config的ConfigMaps):
kind: ConfigMap
data:
osd-dirs: '{"/mnt/osd1":16,"/mnt/osd2":18}'
如果我们深入研究节点上的 /mnt/osd[1–2]
目录,也许,在那里可以找到一些东西。在 /mnt/osd1
中有两个子目录,它们是osd0
和osd16
。第二个子文件夹与ConfigMap(16)中定义的子文件夹相同。查看它们的大小,我们看到 osd0
比osd16
更大。
/mnt/osd1(因为我们使用基于目录的osd)。
“我是集群的管理员”; “我在节点上找到物理磁盘”; “我发现了Ceph Monitor”; “好的,Ceph Monitor已达到法定人数;” “我正在开始OSD部署……”。
HEALTH_OK!
# rbd ls -p kube
pvc-9cfa2a98-b878-437e-8d57-acb26c7118fb
pvc-9fcc4308-0343-434c-a65f-9fd181ab103e
pvc-a6466fea-bded-4ac7-8935-7c347cff0d43
pvc-b284d098-f0fc-420c-8ef1-7d60e330af67
pvc-b6d02124-143d-4ce3-810f-3326cfa180ae
pvc-c0800871-0749-40ab-8545-b900b83eeee9
pvc-c274dbe9-1566-4a33-bada-aabeb4c76c32
…
快速偷懒的恢复方法
将Rook-operator的部署规模缩小到零;
删除除Rook operator之外的所有部署;
从备份还原所有secret和ConfigMap;
恢复
/var/lib/rook/mon-*
节点上目录的内容;还原
CephCluster
,CephFilesystem
,CephBlockPool
,CephNFS
,CephObjectStore
CRD(如果他们不知何故丢失);将Rook-operator的部署扩展回1。
提示和技巧
如果您打算对集群进行一些涉及服务器重启的大规模操作,我们建议将rook-operator部署缩减为零,以防止它“触发故障”。
预先为Ceph Monitor指定nodeAffinity;
密切注意预配置
ROOK_MON_HEALTHCHECK_INTERVAL
和ROOK_MON_OUT_TIMEOUT
值。
结论
原文:https://blog.flant.com/manual-recovery-of-a-rook-cluster-in-kubernetes/
每月第1周 大咖专栏
新钛云服布道师 祝祥
· 资深云计算架构师
· OpenStack官方特邀讲师
· 上万台云主机和几十PB分布式存储的建设管理经验

点👇分享

戳👇在看






