Ceph 和 Kubernetes 集成
方式
- 静态 如果没有合适的 pv, pvc 会一直 pending
- 动态
说明
使用 RBD 做存储,因为 cephFS 不稳定
准备环境
-
安装 ceph
- 大工程,暂时跳过,有空补
- 有单节点的快速安装脚本
-
ceph 创建存储池 并启用 RBD 功能
ceph osd pool create csj 1024
- 查看:
ceph osd pool ls
-
创建 Ceph 用户,提供给 K8s 使用
ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children,allow rwx pool=rbdpool'
- 上条命令会生产 keyring 密钥
- 查看用户:
ceph auth ls
有的要这样ceph auth list
-
在 k8s 节点上安装 ceph-common rpm 包
- 会生产 /etc/ceph 目录
- 可以使用 ceph 等命令
-
复制 ceph.conf 和 admin 用户的 keyring 文件到 k8s 节点(master + node)上 的 /etc/ceph 下
- 集群 拷贝命令:
for i in {2..5};do scp /etc/yum.repos.d/ceph.repo 192.168.100.18$i:/rec/yum.repos.d/.xxx;done
- 集群安装软件:
for i in {2..5};do ssh 192.168.100.18$i yum install -y xxx;done
- 可以在 k8s 节点上查看 ceph
ceph -s
- 查看用户 admin 的 keyring:
ceph auth get-key client.admin
,需要进行 base64 加密 - 所有用户的,否则 pod 启动时会报错:在 /etc/ceph/ 下找不到对应用户的 keyring
- 集群 拷贝命令:
-
创建 Secret:
key:base64(keyring)
kind: Secret
命令
- 创建存储池: ceph osd pool create csj 1024
- 创建用户:ceph auth get-or-create client.csj mon ‘allow r’ osd ‘allow class-read object_prefix rbd_children, allow rwx pool=csj’ -o ceph.client.csj.keyring
- ceph health
- ceph health detail
- ceph auth get-key client.admin | base64
正式开工
- 静态 PV 使用
- 创建 PV
- monitor 可以用 域名:port,只要配合域名解析就好
- ceph 创建 rbd image:
rbd create -p mypool -s 5G ceph-image
- -p 存储池
- ceph-image 是 image 的命名
- -s 是容量
- 查看 image:
rbd ls -p mypool
- 查看 :
rbd info ceph-image -p mypool
- 查看
rbd map ...
- 需要关掉部分 feature ,否则创建 pod 时会报错,报错信息会指出那些 feature 需要关闭——和内核不兼容
- 创建 PVC
- 最好截下图
- pvc 和 pv 状态(status) 为 bound,之前 pv 为 available
- 创建 pod ,使用 PVC
- 查看报错信息,关闭 ceph image 部分特性
- 重新创建 pod
- watch kuebctl describe pod ceph-pod 可以 watch 信息
- 创建 PV
- 总结:太麻烦,还需要在过程中创建 rbd image, 所以引入 动态方式
- 删除 pod pvc ,pv released,还需要清空
- 动态 PV 使用
- 创建 StorageClass(sc)
- is-default-class=true, 默认被使用
- 创建 PVC
- 会自动创建一个 pv
- 创建 Pod
- 进 pod 进行验证 对应目录下优 lost+found
- rbd ls -p mypool, 可以看到自动创建的 rbd image: 名字包含 dynamic-pvc
- 创建 StorageClass(sc)
- 总结:也可以 使用 cephFS ,对象存储
FAQ
-
pod has unbound immediate PersistentVolumeClaims
-
使用静态方式创建:pv-pvc-pod
pool=csj,user=csj,image=ceph-image
已验证 pv pvc 创建 成功,且状态为 Bound
describe pod:
ados: client.csj authentication error (1) Operation not permitted
rbd: couldn't connect to the cluster!
)
Warning FailedMount 51s kubelet, node01 Unable to mount volumes for pod "ceph-static_default(88e5278d-22fc-11ea-ad6c-fa163e295dbf)": timeout expired waiting for volumes to attach or mount for pod "default"/"ceph-static". list of unmounted volumes=[ceph-vol1]. list of unattached volumes=[ceph-vol1 default-token-btnmr]
Warning FailedMount 51s kubelet, node01 MountVolume.WaitForAttach failed for volume "csj-pv" : fail to check rbd image status with: (exit status 1), rbd output: (2019-12-20 15:46:24.719857 7f08fab55d80 0 librados: client.csj authentication error (1) Operation not permitted
rbd: couldn't connect to the cluster!
)
Warning FailedMount 49s kubelet, node01 MountVolume.WaitForAttach failed for volume "csj-pv" : fail to check rbd image status with: (exit status 1), rbd output: (2019-12-20 15:46:26.001775 7f5185306d80 0 librados: client.csj authentication error (1) Operation not permitted
rbd: couldn't connect to the cluster!
- 静态创建 pod 错误 2:
pool=kube user=kube image=ceph-image
Warning FailedMount 4s (x4 over 8s) kubelet, node01 MountVolume.WaitForAttach failed for volume "ceph-pv" : rbd: map failed exit status 6, rbd output: rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail" or so.
rbd: map failed: (6) No such device or address
- 静态 使用 admin 用户 试试
- 单独 pod 进行声明 volume 挂载
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 17s default-scheduler Successfully assigned default/rbd to node01
Normal SuccessfulAttachVolume 17s attachdetach-controller AttachVolume.Attach succeeded for volume "rbdpd"
Warning FailedMount 6s (x5 over 14s) kubelet, node01 MountVolume.WaitForAttach failed for volume "rbdpd" : fail to check rbd image status with: (exit status 2), rbd output: (rbd: error opening image foo: (2) No such file or directory
)
解决方式:自己再重新搭建一套 ceph 环境吧,然后再重新测试
使用 一分钟部署单节点 Ceph(el7+hammer) 快速部署
新问题:
- pod rbd: strict_strtoll: garbage at end of string. got: ‘2G’
- kubectl get pvc ceph-kube-claim -o yaml Failed to provision volume with StorageClass “rbd”: failed to create rbd image: executable file not found in $PATH, command output: 据说是个经典的问题
参考
- 问题:为啥视频里可以不用 csi 就能创建 storageclass 和 pvc 回去看看吧
- 自己就是实现不了
- 原文作者:战神西红柿
- 原文链接:https://tomatoares.github.io/posts/storage/ceph+k8s/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。