Ceph-RBD

本文将介绍如何在kubernetes集群中使用RBD进行PV的动态供给。

准备ceph集群

首先,我们需要准备一个Ceph集群(安装见https://pshizhsysu.gitbooks.io/ceph/an-zhuang.html),然后提前创建好一个pool给kubernetes集群使用,假设我们创建的pool名字叫kube

在kubernetes集群的节点上安装好ceph-common(见https://pshizhsysu.gitbooks.io/ceph/an-zhuang/an-zhuang-ke-hu-duan.html)。

创建secret以保存keyring

由于访问ceph集群需要身份验证(在kubernetes中我们打算直接使用ceph的admin用户),所以我们先把admin用户的keyring保存在kubernetes的secret中。

我们不能把keyring的内容直接保存在secret中,而要先经过base64编码。假设ceph.client.admin.keyring的内容如下:

[client.admin]
key = AQBRCtFci+UPKxAAvifYirfhtgEMGP46mkre+A==

我们对key进行base64编码,得到

$ echo -n "AQBRCtFci+UPKxAAvifYirfhtgEMGP46mkre+A==" | base64
QVFCUkN0RmNpK1VQS3hBQXZpZllpcmZodGdFTUdQNDZta3JlK0E9PQ==

当然我们也可以通过以下的命令获取:

$ grep key /etc/ceph/ceph.client.admin.keyring | awk '{printf "%s", $NF}' | base64
QVFCUkN0RmNpK1VQS3hBQXZpZllpcmZodGdFTUdQNDZta3JlK0E9PQ==

$ ceph auth get-key client.admin | base64
QVFCUkN0RmNpK1VQS3hBQXZpZllpcmZodGdFTUdQNDZta3JlK0E9PQ==

接下来,我们在kubernetes中来创建这个secret,我们把它创建在命名空间kube-system中,名字叫ceph-admin-secret,注意下面的type字段的值必须为kubernetes.io/rbd

安装RBD-Provisioner

注意:如果你使用二进制安装的k8s集群,该步骤可以省略

本文中我们使用的是kubeadm安装的k8s集群,由于kube-controller-manager镜像中没有安装ceph-common组件(没有rbd可执行文件),那么controller-manager无法在ceph中创建image。所以,我们需要借助第三方插件RBD-Provisioner

https://github.com/kubernetes-incubator/external-storage/tree/master/ceph/rbd/deploy/rbac中有六个文件,下载下来

  • clusterrole.yaml

  • clusterrolebinding.yaml

  • deployment.yaml

  • role.yaml

  • rolebinding.yaml

  • serviceaccount.yaml

然后把clusterrolebinding.yamlrolebinding.yaml中的namespace的值更改为上一步中的kube-system

我们在kube-system这个命名空间中创建这些资源

然后验证以上六个资源已经创建成功:

创建StorageClass

然后在kubernetes集群中创建provisionerceph.com/rbd的StorageClass(如果你使用的是二进制安装的k8s集群,则provisioner应该为kubernetes.io/rbd):

  • monitors:ceph集群的monitor,使用,隔开

  • adminId:用来在Pool中创建image的用户,默认为admin;这里我们就是使用ceph的admin用户

  • adminSecretNameadminId用户的secret名字,就是我们上一步创建的ceph-admin-secret

  • adminSecretNamespaceadminSecretName的命名空间,上一步中我们把它放在了kube-system

  • pool:kubernetes集群会在这个pool中创建image,第一步我们提前准备的pool的名字叫kube

  • userId:用来把ceph中的image映射到kubernetes节点上的ceph用户,默认与adminId相同。这里我们显示设置与adminId相同

  • userSecretNameuserId的secret名字

  • userSecretNamespaceuserId的命名空间

  • fsType:kubernetes支持文件系统类型,默认为ext4。当把ceph的image挂载到k8s节点上时,kubernetes会将其格式化为fsType

创建一个PVC

接下来,我们创建一个StorageClassNamerbd的PVC

然后我们查看该PVC的情况,发现已经自动为其创建了一个PV,名字叫pvc-5d26aba6-7169-11e9-98c4-000c29483500

然后,我们查看自动创建好的PV及其详情,从PV的yaml文件可以看出,该PV对应的是ceph集群的kube存储池中的kubernetes-dynamic-pvc-608f2028-7169-11e9-81a0-2ec1066e948e镜像

我们去ceph集群中查看是否存在这个image

创建Pod

接下来,我们创建一个Pod,来使用这个PVC

等待Pod为Running状态

然后我们查看这个Pod所在主机的块设备情况,发现ceph中的这上image已经attach到这个node上了,并且格式化为ext4的文件系统,mount到了/var/lib/kubelet/pods/eeb62f01-716c-11e9-98c4-000c29483500/volumes/kubernetes.io~rbd/pvc-5d26aba6-7169-11e9-98c4-000c29483500目录上

删除Pod

接着,我们删除这个Pod,然后再查看Pod所在节点上的block情况,发现image已经deattach了

删除PVC

删除PVC,然后检查PV,发现PV也已经被删除了

然后去ceph中查看image,发现image也被删除了

Reference

Last updated

Was this helpful?