新钛云服已为您服务1205天
大咖专栏 | 祝祥
Rook介绍
Rook将文件、数据块和对象存储系统引入到Kubernetes集群,与其他正在使用存储的应用程序和服务一起无缝运行。
通过这种方式,云原生集群可以在公有云和本地部署中自给自足并且具备可移植性。该项目的开发目的是使企业能够通过动态应用编排,为在本地和公有云环境中运行的分布式存储系统实现数据中心现代化。
Rook 将存储软件转变成自我管理、自我扩展和自我修复的存储服务,通过自动化部署、启动、配置、供应、扩展、升级、迁移、灾难恢复、监控和资源管理来实现。Rook 底层使用云原生容器管理、调度和编排平台提供的能力来提供这些功能。
Rook由Operator和Cluster两部分组成:
Operator:由一些CRD和一个All in one镜像构成,包含包含启动和监控存储系统的所有功能。
Cluster:负责创建CRD对象,指定相关参数,包括ceph镜像、元数据持久化位置、磁盘位置、dashboard等等…
Rook使Kubernetes集群中的存储工作变得轻松了许多。但是,这种简单性同时也带来了一些复杂性。我们希望本文能帮助您避免其中的一些复杂性,从而使它们简单化。
为了让本文更加有趣,让我们假设我们刚刚遇到了集群的一个问题……
故障场景
想象一下,您已经在K8s集群中配置并启动了Rook。当前的所有任务操作都很正常,然后在某些时候出现了以下状况:
新的Pod无法从Ceph挂载RBD镜像;
诸如
lsblk
和df
之类的命令在Kubernetes节点上不起作用。这表明挂载在节点上的RBD镜像出了点问题。您无法读取它们,这意味着Ceph Mon不可用。Ceph Mon和OSD/MGR Pod都无法在集群中运行。
现在是时候回答这个问题了,rook-ceph-operator
Pod是什么时候开始启动的?事实证明,这是最近才发生的。为什么?菜鸟运维人员可能会突然决定创建一个新的集群!那么,我们又该如何还原旧群集及其数据?
让我们从一个更长更有趣的地方开始,一步一步地研究Rook的内部机制并手动恢复其组件。显然,有一种更简短、更恰当的方法:使用备份。如您所知,有两种类型的管理员:一种是还没有使用备份的管理员,另一种是已经痛苦地学会始终使用备份的管理员(我们稍后再讨论)。
Rook的手工恢复历程
恢复Ceph Monitor节点
首先,我们必须检查ConfigMap的列表:rook-ceph-config
和rook-config-override
。它们是在部署集群成功后创建的。
注意:在新版本的Rook中,ConfigMaps不再是部署群集成功的唯一标志。
为了继续下去,我们必须对所有安装了RBD镜像(ls/dev/RBD*
)的服务器进行硬重启。您可以使用sysrq。此步骤对于卸载所有已挂载的RBD镜像是必须的,因为在这种情况下,常规重新启动将不起作用(系统无法正常的卸载镜像)。
如您所知,Ceph Monitor守护程序的正常运行是所有Ceph集群的先决条件。下面,让我们来确认一下它。
Rook将以下组件安装到Monitor的Pod中:
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=
解码后,我们将获得具有管理员和Ceph Monitor权限的常规密钥keyring:
[mon.]
key = AQAhT19dlUz0LhBBINv5M5G4YyBswyU43RsLxA==
caps mon = "allow *"
[client.