我们都知道ceph集群是一个开源的分布式存储系统,支持对象存储,块存储,文件系统。本篇文章就是要讲解下k8s下如何挂载使用ceph的块存储系统。
示意图
一: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信息
pod创建events详细信息
登录pod验证
六: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验证
八:自动创建并挂载
如果集群是用kubeadm安装,因为默认以docker 运行的kube-controller-manager容器内没有ceph命令。
要想实现k8s挂载ceph,需要用ceph-csi
参考文档:Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储 - SegmentFault 思否
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
验证