kubernetes 直接调用 ceph 作为后端存储

目的

ceph 作为独立的后端存储
利用 kubernets 连接该 ceph 存储
ceph 自行独立管理
kubernets 只需要获取连接 ceph 的 mon 地址, 只需要具备连接到该 ceph 的用户权限即可

优点

ceph 维护, 管理比较灵活
多个 kubernets 可以连接到相同的一个 ceph 集群中

概念

PV

persistentvolume(pv) 集群中由管理员提供的一块存储。PV 跟节点一样,是群集中的资源
pv 和 volumes 一样是 volume 插件,但其生命周期独立于使用 pv 的任何单个pod
此 API 对象捕获存储实现的详细信息,包括NFS、iSCSI或特定于云提供程序的存储系统

volume plugin ReadWriteOnce ReadOnlyMany ReadWriteMany
CephFS
Cinder - -
Glusterfs
iSCSI -
NFS
RBD -

PVC

PersistentVolumeClaim(PVC)是用户对存储的请求
它类似于一个 pod, pods 消耗节点资源
pvc消耗pv资源
POD 可以请求特定级别的资源(CPU和内存)
POD 声明可以请求特定的 pvc 大小和访问模式(例如,可以装载一次读/写或多次只读)

读写模式

ReadWriteOnce – 卷可以由单个节点以读写方式挂载
ReadOnlyMany – 卷可以由多个节点以只读方式挂载
ReadWriteMany – 卷可以由多个节点以读写方式挂载

ceph 授权

准备 ceph 池

[root@ns-ceph-208183 ceph]# ceph osd pool create kubernets 256 256
pool 'kubernets' created

初始化 ceph 池

[root@ns-ceph-208183 ceph]# ceph osd pool application enable kubernets rbd
enabled application 'rbd' on pool 'kubernets'

[root@ns-ceph-208183 ceph]# rbd pool init kubernets

用户授权

[root@ns-ceph-208183 ceph]# ceph auth add client.terry mon 'allow r' osd 'allow rwx pool=kubernets'

导出用户信息

[root@ns-ceph-208183 ceph]# ceph auth get client.terry -o  /etc/ceph/ceph.client.terry.keyring
exported keyring for client.terry

kubernets

软件包

所有节点都需要安装

yum install -y ceph-common 

创建 namespace

[root@ns-yun-020065 ceph-storage]# cat ceph-namespace-ceph.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: ceph
[root@ns-yun-020065 ceph-storage]# kubectl apply -f ceph-namespace-ceph.yaml

创建用户授权

[root@ns-ceph-208183 ceph]# grep key /etc/ceph/ceph.client.terry.keyring |awk '{printf "%s", $NF}'|base64
QVFCaEI0SmNPZ3laREJBQXZxZHlMQ3RmbUFQd1JPWklaN1NCNVE9PQ==

[root@ns-yun-020065 ceph-storage]# cat ceph-terry-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: ceph-terry-secret
  namespace: ceph
type: "kubernetes.io/rbd"
data:
  key: QVFCaEI0SmNPZ3laREJBQXZxZHlMQ3RmbUFQd1JPWklaN1NCNVE9PQ==

[root@ns-yun-020065 ceph-storage]# kubectl apply -f ceph-terry-secret.yaml

查询授权

[root@ns-yun-020065 ceph-storage]# kubectl -n ceph get secret
NAME                  TYPE                                  DATA      AGE
ceph-terry-secret     kubernetes.io/rbd                     1         3d
default-token-hg6sl   kubernetes.io/service-account-token   3         2h

创建 storageclass

[root@ns-yun-020065 ceph-storage]# cat ceph-volume-kubernets.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: "ceph-kubernets"
   namespace: ceph
provisioner: kubernetes.io/rbd
parameters:
  monitors: 10.189.208.183:6789,10.189.208.197:6789,10.189.208.192:6789
  adminId: terry
  adminSecretName: ceph-terry-secret
  adminSecretNamespace: ceph
  pool: kubernets
  userId: terry
  userSecretName: ceph-terry-secret
  userSecretNamespace: ceph
  fsType: xfs
  imageFormat: "2"
  imageFeatures: "layering"
reclaimPolicy: Delete

[root@ns-yun-020065 ceph-storage]# kubectl apply -f ceph-volume-kubernets.yaml

策略 (reclaimPolicy) 说明

常见策略三种:

Delete (默认) 删除 pvc 同时会删除 rbd 池中对应的 rbd 文件
Retain 删除 pvc 时并不会删除 rbd 池中对应 rbd 文件, 需要手动执行删除操作
Recycle (新版本已经弃用, 推荐使用 动态支持)删除 pod 时候,会自动清空 pvc 中的内容, 可以再次被其他 pod 调用(需要插件支持)

查询当前 storageclass

[root@ns-yun-020065 ceph-storage]# kubectl -n ceph get storageclass
NAME                       PROVISIONER         AGE
ceph-kubernets             kubernetes.io/rbd   3m

创建 PersistentVolumeClaim

[root@ns-yun-020065 ceph-storage]# cat create-volume-ceph.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: webdata
  namespace: ceph
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ceph-kubernets
  resources:
    requests:
      storage: 5Gi

[root@ns-yun-020065 ceph-storage]# kubectl apply -f create-volume-ceph.yaml

检测状态

[root@ns-yun-020065 ceph-storage]# kubectl -n ceph get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM          STORAGECLASS     REASON    AGE
pvc-190e4683-43c9-11e9-a778-ec388f792726   5Gi        RWO            Delete           Bound     ceph/webdata   ceph-kubernets             12m

[root@ns-yun-020065 ceph-storage]# kubectl -n ceph get pvc
NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
webdata   Bound     pvc-190e4683-43c9-11e9-a778-ec388f792726   5Gi        RWO            ceph-kubernets   12m

状态说明

Available – 资源尚未被 claim 使用
Bound – 卷已经被绑定到 claim
Released – claim 被删除,卷处于释放状态,但未被集群回收
Failed – 卷自动回收失败

ceph rbd 池中 rbd 文件对应如下

[root@ns-yun-020065 ceph-storage]# kubectl -n ceph  get PersistentVolumeClaim
NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
webdata   Bound     pvc-190e4683-43c9-11e9-a778-ec388f792726   5Gi        RWO            ceph-kubernets   56m

[root@ns-yun-020065 ceph-storage]# rbd --user terry -p kubernets ls
kubernetes-dynamic-pvc-190fc9b6-43c9-11e9-b23f-ec388f792726 

挂载 pvc 到 pod 方法

[root@ns-yun-020065 ceph-storage]# cat centos-test01.yaml
kind: Pod
apiVersion: v1
metadata:
  name: centos7-test01
  namespace: ceph
spec:
  containers:
  - name: cenotos7-test01
    image: registry.aliyuncs.com/google_containers/centos7:7.5.1804
    command:
    - "sleep"
    - "30000000"
    volumeMounts:
    - name: ceph-vol
      mountPath: /media
      readOnly: false
  volumes:
    - name: ceph-vol
      persistentVolumeClaim:
        claimName: webdata
  nodeSelector:
    node: kube-node

挂载说明

PVC 对应到 rbd 池中文件 kubernetes-dynamic-pvc-190fc9b6-43c9-11e9-b23f-ec388f792726
rbd 文件将会被 map 到物理机, 并命名为 /dev/rbd0 (第一个,第二个则为 rbd1 如此类推 )
物理机会把 /dev/rbd0 挂载到对应 pod 中
pod 会自动把 /dev/rbd0 挂载到 /media 目录中
pod 已经可以直接对 /media 挂载目录进行访问, 无需管理 /etc/fstab 文件

删除 pod

pod 删除后, 物理机 /dev/rbd0 自动 unmap
ceph rbd 池中文件 仍然存在

删除 pvc

当执行 kubectl delete -f create-volume-ceph.yaml 后
针对 delete 策略

kubectl -n ceph get pvc 发现 pvc 文件已经被删除
ceph rbd 池中对应的 rbd 文件也会自动被删除

针对 Retain 策略

kubectl -n ceph get pvc 发现 pvc 文件仍然存在, 需要手动执行 kubectl -n ceph delete pvc xxxx 进行删除
ceph rbd 池中对应 rbd 文件依旧存在, 就算执行 kubectl -n ceph delete pvc xxx 操作也不会自动删除
ceph rbd 池中对应 rbd 文件必须手动通过 rbd -p kubenetes remove xxxx 执行删除操作

上一篇:Scan Context——论文学习


下一篇:Hello, gSoap: 用 gSoap 创建自己的第一个 Web Services 程序。