kubernetes上部署rook-ceph存储系统

作者: ygqygq2 分类: 系统/运维,虚拟化/容器 发布时间: 2019-11-11 18:09

[TOC]

1. 简单说说为什么用rook

rook这里就不作详细介绍了,具体可以到官网查看。

说说为什么要在kubernetes上使用rook部署ceph集群。
众所周知,当前kubernetes为当前最佳云原生容器平台,随着pod在kubernetes节点内被释放,其容器数据也会被清除,即没有持久化存储数据能力。而ceph作为最好的开源存储之一,也是结合kubernetes最好的存储之一。利用kubernetes的调度功能,rook的自我扩展和自我修复能力,相互紧密配合。

2. rook-ceph部署

2.1 环境

版本 备注
系统 CentOS7.6 一块200G数据盘
kubernetes v1.14.8-aliyun.1 有挂载数据盘的节点调度为osd节点
rook v1.1.4 -
ceph v14.2.4 -

注:
OSD至少3个节点,直接使用裸盘而不使用分区或者文件系统的方式性能最好。

2.2 Rook Operator部署

这里我们使用helm方式,helm的优势不必多说。

参考文档:
https://rook.io/docs/rook/v1.1/helm-operator.html

注:
根据kubernetes版本支持,可将values.yaml中设置enableFlexDriver: true

部署结果:

2.3 Ceph集群创建

2.3.1 标识osd节点

为了更好的管理控制osd,标识指定节点,便于pod只在这些节点调度。

2.3.2 yaml创建Ceph集群

vim rook-ceph-cluster.yaml

查看结果:

2.4 Rook toolbox验证ceph

将Rook toolbox部署至kubernetes中,以下为部署yaml:

vim rook-ceph-toolbox.yam

进入toolbox后查看ceph相关状态:

注:
自定义configmap rook-config-override中的config,会自动挂载到ceph pod中为/etc/ceph/ceph.conf,达到自定义配置目的。(推荐使用Ceph Cli管理,而不推荐这种方式)

2.5 暴露Ceph

ceph部署在kubernetes中,需要被外面访问,则需要暴露相关服务,比如dashboard、ceph monitor。

2.5.1 暴露ceph dashboard

推荐使用ingress方式暴露dashboard,其它方式参考kubernetes相关用法。

vim rook-ceph-dashboard-ingress.yaml

获取dashboard密码:

用户名为admin,登录后:

2.5.2 暴露ceph monitor

这步只为验证kubernetes外部能否连接ceph monitor,而结果表明,确实不行。

新创建monitor的service,service type为LoadBalancer,以便k8s外部能使用,因为我使用的是阿里云kubernetes,而我又只想使用内网负载均衡,因此还要添加以下service:

vim rook-ceph-mon-svc.yaml

注:
1. 自建kubernetes推荐MetalLB提供LoadBalancer方式负载均衡。
2. 现在rook并不支持kubernetes外部连接ceph monitor。

3. 配置rook-ceph

配置ceph,达到kubernetes能使用动态卷管理。

vim rook-ceph-block-pool.yaml

vim rook-ceph-filesystem.yaml

vim rook-ceph-storage-class.yaml

进入toolbox查看结果:

4. kubernetes使用动态卷验证ceph

成功验证flex的ceph rbd。

而cephfs验证失败,pod一直处于等待挂载中,下文作详细说明。

5. 解决rook-ceph的csi-cephfs不能在flex的阿里云kubernetes上挂载问题

查看到使用cephfs pvc的pod所有节点的/var/log/message日志,

按日志提示,开始以为是权限不足:

kubectl get clusterrole system:node -oyaml

通过添加这个clusterrole的权限,报错仍旧一样。

才想起,创建cephfs storageclass时使用的是csi插件方式的。
而阿里云kubernetes只支持flex或者csi,我的集群选择的是使用flex插件方式的。

其flex插件方式下,集群节点kubelet参数,enable-controller-attach-detachfalse
若需要修改成csi方式,需要自行修改此参数为true

说干就干,进到ContainerCreating状态的pod所在节点,

vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf,修改enable-controller-attach-detachtrue,然后systemctl daemon-reload && systemctl restart kubelet重启kubelet,结果发现POD已正常挂载了。

可以得出结论,确实是阿里云kubernetes的kubelet参数enable-controller-attach-detachfalse导致不能使用csi。

修改这个参数显然是不现实的,因为在购买阿里云托管版kubernetes时已经选择了flex插件方式,本来不需要维护kubelet,现在因为这个参数要维护所有节点的kubelet。那不修改kubelet参数,又有什么其它办法解决呢?
以前我用的是kubernetes-incubator/external-storage/ceph方式提供的provisioner,参考我以前的文章:
https://blog.51cto.com/ygqygq2/2163656

5.1 创建cephfs-provisioner

首先,将toolbox里的/etc/ceph/keyring内key后面的字符串,写到文件/tmp/ceph.client.admin.secret,做成secret,并启动cephfs-provisioner。

等待启动成功

然后创建cephfs storageclass。
vim cephfs-storageclass.yaml

kubernetes节点还是要安装ceph-common和ceph-fuse。

使用阿里云的ceph yum源,cat /etc/yum.repos.d/ceph.repo

5.2 验证cephfs

继续之前的测试,可以看到已经正常使用。

6. 小结

  1. Kubernetes外部并不能访问ceph monitor,由于这个局限,还是直接部署在机器上好得多。
  2. rook-ceph可同时提供flex和csi驱动方式的rbd类型storageclass,而cephfs当前只支持csi驱动方式的storageclass,基于flex驱动的cephfs存储卷用法可参考示例:kube-registry.yaml

  3. 最后附上文中使用的相关Yaml文件:
    https://github.com/ygqygq2/kubernetes/tree/master/kubernetes-yaml/rook-ceph

参考资料:
[1] https://rook.io/docs/rook/v1.1/ceph-quickstart.html
[2] https://rook.io/docs/rook/v1.1/helm-operator.html
[3] https://rook.io/docs/rook/v1.1/ceph-toolbox.html
[4] https://rook.io/docs/rook/v1.1/ceph-advanced-configuration.html#custom-cephconf-settings
[5] https://rook.io/docs/rook/v1.1/ceph-pool-crd.html
[6] https://rook.io/docs/rook/v1.1/ceph-block.html
[7] https://rook.io/docs/rook/v1.1/ceph-filesystem.html
[8] https://github.com/kubernetes-incubator/external-storage/tree/master/ceph

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据