方式

  • 静态 如果没有合适的 pv, pvc 会一直 pending
  • 动态

说明

使用 RBD 做存储,因为 cephFS 不稳定

准备环境

  1. 安装 ceph

    1. 大工程,暂时跳过,有空补
    2. 有单节点的快速安装脚本
  2. ceph 创建存储池 并启用 RBD 功能

    1. ceph osd pool create csj 1024
    2. 查看:ceph osd pool ls
  3. 创建 Ceph 用户,提供给 K8s 使用

    1. ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children,allow rwx pool=rbdpool'
    2. 上条命令会生产 keyring 密钥
    3. 查看用户:ceph auth ls 有的要这样 ceph auth list
  4. 在 k8s 节点上安装 ceph-common rpm 包

    1. 会生产 /etc/ceph 目录
    2. 可以使用 ceph 等命令
  5. 复制 ceph.conf 和 admin 用户的 keyring 文件到 k8s 节点(master + node)上 的 /etc/ceph 下

    1. 集群 拷贝命令:for i in {2..5};do scp /etc/yum.repos.d/ceph.repo 192.168.100.18$i:/rec/yum.repos.d/.xxx;done
    2. 集群安装软件:for i in {2..5};do ssh 192.168.100.18$i yum install -y xxx;done
    3. 可以在 k8s 节点上查看 ceph ceph -s
    4. 查看用户 admin 的 keyring:ceph auth get-key client.admin,需要进行 base64 加密
    5. 所有用户的,否则 pod 启动时会报错:在 /etc/ceph/ 下找不到对应用户的 keyring
  6. 创建 Secret: key:base64(keyring)

    kind: Secret
    

命令

  1. 创建存储池: ceph osd pool create csj 1024
  2. 创建用户: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
  3. ceph health
  4. ceph health detail
  5. ceph auth get-key client.admin | base64

正式开工

  1. 静态 PV 使用
    1. 创建 PV
      1. monitor 可以用 域名:port,只要配合域名解析就好
      2. ceph 创建 rbd image:rbd create -p mypool -s 5G ceph-image
        1. -p 存储池
        2. ceph-image 是 image 的命名
        3. -s 是容量
        4. 查看 image:rbd ls -p mypool
        5. 查看 : rbd info ceph-image -p mypool
        6. 查看 rbd map ...
        7. 需要关掉部分 feature ,否则创建 pod 时会报错,报错信息会指出那些 feature 需要关闭——和内核不兼容
    2. 创建 PVC
      1. 最好截下图
      2. pvc 和 pv 状态(status) 为 bound,之前 pv 为 available
    3. 创建 pod ,使用 PVC
      1. 查看报错信息,关闭 ceph image 部分特性
      2. 重新创建 pod
      3. watch kuebctl describe pod ceph-pod 可以 watch 信息
  • 总结:太麻烦,还需要在过程中创建 rbd image, 所以引入 动态方式
  • 删除 pod pvc ,pv released,还需要清空
  1. 动态 PV 使用
    1. 创建 StorageClass(sc)
      1. is-default-class=true, 默认被使用
    2. 创建 PVC
      1. 会自动创建一个 pv
    3. 创建 Pod
      1. 进 pod 进行验证 对应目录下优 lost+found
      2. rbd ls -p mypool, 可以看到自动创建的 rbd image: 名字包含 dynamic-pvc
  • 总结:也可以 使用 cephFS ,对象存储

FAQ

  1. pod has unbound immediate PersistentVolumeClaims

  2. 使用静态方式创建: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!
  1. 静态创建 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
  1. 静态 使用 admin 用户 试试
  2. 单独 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) 快速部署

新问题:

  1. pod rbd: strict_strtoll: garbage at end of string. got: ‘2G’
  2. 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: 据说是个经典的问题

参考

【存储 & 容器】Ceph 与 Kubernetes 集成

  • 问题:为啥视频里可以不用 csi 就能创建 storageclass 和 pvc 回去看看吧
  • 自己就是实现不了