ceph对接kubernetes storage class
作者 | 谢泽钦 |
---|---|
团队 | Filed&&Suppoort |
编写时间 | 2020/12/31 |
类型 | 存储相关解决方案 |
环境
主机名 | IP | role | 操作系统 |
---|---|---|---|
ceph-01 | 172.16.31.11 | mon osd | CentOS7.8 |
ceph-02 | 172.16.31.12 | Osd | CentOS7.8 |
ceph-03 | 172.16.31.13 | osd | CentOS7.8 |
这个是官网的图
步骤
安装ceph
主机名设置
添加主机映射
关闭防火墙
时间同步
ssh无密钥访问
准备repo
国内用户可以用阿里的仓库
安装ceph-deploy软件包
ceph-1节点
其他节点安装
创建一个ceph目录
ceph-01节点
初始化ceph集群
(可选)修改网络接口
如果有两个网卡,可以将管理和存储网分离
安装ceph软件包
国内加速可以指定阿里云镜像地址,先在所有节点添加这个仓库
然后执行
创建mon
执行完后会创建*.keyring 密钥环
复制配置和秘钥到对应的节点上
部署mgr
mgr是ceph-12.x版本(luminous)新增的组件
部署osd
检查集群状态
测试
创建pool
上传到存储池中
查看存储池和对象映射
删除
这里删不掉的话,需要添加这个配置
然后重启mon
ceph rbd对接kubernetes
参考github连接:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/#ceph-rbd
创建pool
导入admin keyring
获取admin keyring
将key换成上一步输出的结果
创建 user secret
创建StorageClass
worker节点安装ceph-common
创建PVC
创建deployment
常见问题
问题1:rbd未加载报错
原因
主要就是没有加载rbd模块,需要到所有的worker节点上加载rbd模块
解决
参考:https://forums.cnrancher.com/q_445.html
问题2:挂载失败
解决
参考:https://github.com/rancher/rancher/issues/13198#issuecomment-391920740
问题3:ceph HEALTH_WARN
解决
部署cephfs文件系统
k8s默认没有cephfs的provisioner,所以需要手动部署一个provisioner去对接cephfs
参考github链接:https://github.com/kubernetes-retired/external-storage/tree/master/ceph/cephfs
部署mds(元数据服务)
创建两个存储池,用来存放实际的数据以及元数据
创建cephfs文件系统
查看mds状态
部署provisioner
这里有两种方式部署provisioner,其中一种是直接docker run
的方式部署,另一种是通过deployment
的方式部署到k8s中
docker run方式部署ceph-provisioner
deployment方式部署到k8s中
rbac相关yaml
ceph-provisioner-deployment.yaml
保存上述两个文件,并执行kubectl apply
导入秘钥
创建Storage class
创建pvc
创建deployment
常见问题
问题:无法挂载cephfs
此时手动在后台使用mount.ceph挂载对应的目录也挂载不上
原因
在 cephfs_provisoner.py 的实现中,默认添加了对 cephfs namespace 的支持,因此在对 volume 授权时会添加对 namespace 相关的权限设置。因为,我们使用的 ceph 版本 luminous 没有对 namespace 进行支持,所以,在使用时产生了创建的 volume 挂载到 pod 内后没有读写权限"input/output error"的问题。 此时,你在 cephfs 端查看卷的读写权限时,你可以看到目录读写权限都是问号。于是我们修改了这部分逻辑,去掉了 namespace 相关的部分。
解决
设置ceph-provisioner启动时添加该参数-disable-ceph-namespace-isolation
参考:https://www.infoq.cn/article/jqhjzvvl11escvfydruc
扩展
高可用
添加多个mon
当ceph集群有多个mon时,ceph会同步mon并形成仲裁,检查仲裁状态命令如下:
添加mgr
查看集群状态