我们都知道ceph集群是一个开源的分布式存储系统,支持对象存储,块存储,文件系统。本篇文章就是要讲解下k8s下如何挂载使用ceph的块存储系统。

示意图

python k8s构建配置 k8s部署ceph_docker

一:ceph集群创建存储池及存储镜像

#在ceph机器中创建名字为lilh-rbd-pool 的存储池

ceph osd pool create lilh-rbd-pool 9 9


#创建完成后查看ceph机器存储池信息

ceph osd pool ls


#启用快存储

ceph osd pool application enable lilh-rbd-pool rbd


#对块存储进行初始化

rbd pool init -p lilh-rbd-pool

#创建一个固定大小的块存储镜像

rbd create lilh-img-img1 --size 1G --pool lilh-rbd-pool --image-format 2 --image-feature layering

#查看创建的磁盘镜像信息

rbd ls --pool lilh-rbd-pool
rbd --image lilh-img-img1 --pool lilh-rbd-pool info

二:在k8s机器服务器上安装ceph-common

##在k8s机器上配置yum源

#各节点的base源和epel源都改为阿里云镜像源此处不做介绍
参考地址:https://developer.aliyun.com/mirror/


#在各节点配置ceph.repo文件
vim /etc/yum.repos.d/ceph.repo
 
[ceph]
name=ceph
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el7/x86_64/
gpgcheck=0
[ceph-noarch]
name=cephnoarch
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch/
gpgcheck=0


##在各节点安装ceph-common
yum install ceph-common

三:存储镜像授权及k8s上配置ceph权限

#存储镜像创建管理用户

ceph auth get-or-create client.lilh mon 'allow r' osd 'allow * pool=lilh-rbd-pool'



#创建完成会出现用户信息及key信息查看用户信息可以执行

ceph auth get client.llh



#导出用户信息到指定keyring文件

ceph auth get client.lilh -o ceph.client.lilh.keyring


#导出认证文件到k8s集群各节点 /etc/ceph/ 路径下

四:k8s基于keyring配置挂载ceph块存储

#在k8s机器查看ceph集群信息,可以查看书面证书有效

ceph --user lilh -s

#创建挂载ceph的pod

kind: Pod
apiVersion: v1
metadata:
  name: busybox-ceph-lilh
  namespace: default
spec:
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    imagePullPolicy: Always
    name: busybox-ceph
    volumeMounts:
    - name: rbd-data  #此处要和下面volumes.name的名字一样
      mountPath: /data #ceph块存储挂载在pod里路径
  volumes:
    - name: rbd-data  
      rbd:
        monitors: #ceph集群mon节点
        - '10.19.14.23:6789'
        - '10.19.14.25:6789'
        - '10.19.14.27:6789'
        pool: lilh-rbd-pool   #ceph集群存储池
        image: lilh-img-img1  #ceph集群存储镜像
        fsType: ext4 #磁盘类型
        readOnly: false
        user: lilh #此处为ceph集群创建的使用用户
        keyring: /etc/ceph/ceph.client.lilh.keyring #此处为ceph的证书信息

五:创建POD及挂载CEPH块存储

#创建pod
kubectl apply -f case1-busybox-keyring.yam

#查看pod信息
kubectl get pod -o wide

#查看pod详细信息
kubectl describe pod busybox-ceph-lilh

 输出的Volumes信息 

python k8s构建配置 k8s部署ceph_python k8s构建配置_02

 pod创建events详细信息

python k8s构建配置 k8s部署ceph_linux_03

 登录pod验证

python k8s构建配置 k8s部署ceph_云原生_04

六:k8s基于Secret配置挂载ceph块存储

#对用户key进行base64加密

[root@k8smaster ceph]# cat ceph.client.lilh.keyring
[client.lilh]
	key = AQAXHopiUd/REhAA4dlk880dtG0R4wmtEqX9Nw==
	caps mon = "allow r"
	caps osd = "allow * pool=lilh-rbd-pool"
[root@k8smaster ceph]# echo AQAXHopiUd/REhAA4dlk880dtG0R4wmtEqX9Nw== | base64
QVFBWEhvcGlVZC9SRWhBQTRkbGs4ODBkdEcwUjR3bXRFcVg5Tnc9PQo=


#创建secret.yaml文件

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret-lilh
type: "kubernetes.io/rbd"
data:
  key: QVFBWEhvcGlVZC9SRWhBQTRkbGs4ODBkdEcwUjR3bXRFcVg5Tnc9PQo=


#创建secret

kubectl apply -f secret.yaml


#查看secret

kubectl get secret


#创建含有secret资源的pod 
vim busybox-secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: busybox-ceph-secret-lilh
  namespace: default
spec:
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    imagePullPolicy: Always
    name: busybox-ceph-secret
    volumeMounts:
    - name: rbd-data
      mountPath: /data
  volumes:
    - name: rbd-data
      rbd:
        monitors:
        - '10.19.14.23:6789'
        - '10.19.14.25:6789'
        - '10.19.14.27:6789'
        pool: lilh-rbd-pool
        image: lilh-img-img1
        fsType: ext4
        readOnly: false
        user: lilh
        secretRef:
          name: ceph-secret-lilh  #为上面Secret.metadata.name


#创建pod
kubectl apply -f busybox-secret.yaml

 登录pod验证

python k8s构建配置 k8s部署ceph_python k8s构建配置_05

八:自动创建并挂载

    如果集群是用kubeadm安装,因为默认以docker 运行的kube-controller-manager容器内没有ceph命令。

   要想实现k8s挂载ceph,需要用ceph-csi

    k8smaster 在ceph创建pv ----> 在k8s上创建pvc关联pv ---->  pod挂载pvc到pod本地

#安装ceph-csi-3.4.0版本

1)k8s创建ceph的configmap资源
#修改csi-config-map.yaml

apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    [{
        "clusterID": "931b9ae6-7767-49d9-a775-0d2760ee2530", #ceph机器ID
        "monitors": [
          "10.19.14.27:6789",  #ceph机器的mon节点
          "10.19.14.23:6789"
        ]
      }]
metadata:
  name: ceph-csi-config


#部署 ConfigMap
kubectl apply -f csi-config-map.yaml


2)创建secret
vim secret-lilh.yaml


apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret-lilh
  namespace: default
stringData:
  userID: lilh
  userKey: AQAXHopiUd/REhAA4dlk880dtG0R4wmtEqX9Nw==

#部署 Secret
kubectl apply -f secret-lilh.yaml


3)创建必须的 ServiceAccount 和 RBAC ClusterRole/ClusterRoleBinding 资源对象

kubectl create -f csi-provisioner-rbac.yaml
kubectl create -f csi-nodeplugin-rbac.yaml


4)创建 PodSecurityPolicy

kubectl create -f csi-provisioner-psp.yaml
kubectl create -f csi-nodeplugin-psp.yaml


5)部署CSI 资源
 
将csi-rbdplugin-provisioner.yaml和csi-rbdplugin.yaml中的 kms 部分配置注释掉

kubectl apply -f csi-rbdplugin-provisioner.yaml
kubectl apply -f csi-rbdplugin.yaml


6)创建 Storageclass

vim mysql-rbd-pvc-lilh.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: ceph-storage-class-lilh
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: 931b9ae6-7767-49d9-a775-0d2760ee2530 #ceph集群ID
   pool: lilh-rbd-pool  #存储池名称
   imageFeatures: layering  #存储特性
   csi.storage.k8s.io/provisioner-secret-name: ceph-secret-lilh  #ceph集群secret信息
   csi.storage.k8s.io/provisioner-secret-namespace: default
   csi.storage.k8s.io/controller-expand-secret-name: ceph-secret-lilh
   csi.storage.k8s.io/controller-expand-secret-namespace: default
   csi.storage.k8s.io/node-stage-secret-name: ceph-secret-lilh
   csi.storage.k8s.io/node-stage-secret-namespace: default
   csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
   - discard

部署storageclass
kubectl apply -f mysql-rbd-pvc-lilh.yaml


7)创建PVC
vim mysql-rbd-pvc-lilh.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-rbd-pvc-lilh
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi
  storageClassName: ceph-storage-class-lilh #此处名称要和storgeclass名称一样

部署PVC 
kubectl apply -f  mysql-rbd-pvc-lilh.yaml

验证

python k8s构建配置 k8s部署ceph_云原生_06