k8s中使用ceph-csi在ceph中进行数据持久化

一、具体相关文档可以查看ceph官网:

https://docs.ceph.com/docs/master/rbd/rbd-kubernetes/

二、要将Ceph块设备与Kubernetes v1.13及更高版本一起使用,必须ceph-csi在Kubernetes环境中安装和配置

该映像会动态配置RBD映像以支持Kubernetes 卷并将这些RBD映像映射为工作节点上的块设备(可选地安装映像中包含的文件系统)引用RBD支持的卷的运行 Pod

三、首先我们需要一个部署一个ceph存储集群以及k8s集群,如果没有部署相关集群(可以参数之前文档部署ceph存储以及k8s集群)

1、首先需要在我们ceph上面创建一个存储池:

默认情况下,Ceph块设备使用该rbd池。为Kubernetes卷存储创建一个池。确保您的Ceph集群正在运行,然后创建池。

[root@ceph-admin ceph]# ceph osd pool create kubernetes

pool ' kubernetes' created

查看ceph里面有哪些存储池:

[root@ceph-admin ceph]# ceph osd pool ls
rbd
cephfs_data
cephfs_metadata
jenkins
kubernetes

三、配置ceph-csi

1、首先需要在k8s上面安装ceph客户端:

yum -y install ceph # 注意需要配置ceph的相关yum源,可以从ceph集群那台主机上面将ceph的yum源拷贝到k8s集群的所有节点上面

2、设置CEPH客户端身份验证:

[root@ceph-admin ceph]# cat /etc/ceph/ceph.client.admin.keyring 
[client.admin]
key = AQAs89depA23NRAA8yEg0GfHNC/uhKU9jsgp6Q==
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"

这里我们需要将/etc/ceph/ceph.client.admin.keyring 复制到k8s集群的所有节点上。

在CEPH-CSI需要ConfigMap存储在Kubernetes以限定一个Ceph监视器地址为Ceph的群集对象。收集Ceph集群唯一的fsid和监视器地址:

查看cephfsid和监视器地址:

[root@ceph-admin ceph]# ceph mon dump
dumped monmap epoch 1
epoch 1
fsid be5bb59c-4033-4a7a-82b5-5ef6f098548d
last_changed 2020-06-04 02:59:56.424318
created 2020-06-04 02:59:56.424318
0: 192.168.111.169:6789/0 mon.ceph-admin

3、生成类似于以下示例的csi-config-map.yaml文件,将fsid替换为“ clusterID”,并将监视器地址替换为“ monitors”:

注意 ceph-csi当前仅支持旧版V1协议。

cat <<EOF> csi-config-map.yaml

apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "be5bb59c-4033-4a7a-82b5-5ef6f098548d",   # 这是上面使用ceph mon dump查看
"monitors": [
"192.168.111.169:6789"
]
}
]
metadata:
    name: ceph-csi-config

EOF

部署config-map:

kubectl apply -f csi-config-map.yaml

4、使用新创建的admin 用户ID和cephx密钥生成secret

cat <<EOF > csi-rbd-secret.yaml

apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: default
stringData:
userID: admin
userKey: AQAs89depA23NRAA8yEg0GfHNC/uhKU9jsgp6Q==

EOF

部署secret

kubectl apply -f csi-rbd-secret.yaml

5、配置CEPH-CSI插件

创建必需的ServiceAccount和RBAC ClusterRole / ClusterRoleBinding Kubernetes对象。这些对象不一定需要针对您的Kubernetes环境进行自定义,因此可以从 ceph -csi部署YAML中按原样使用

kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml

6、最后,创建ceph-csi设置程序和节点插件

wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml

vim csi-rbdplugin-provisioner.yaml

 按照上图注释:ceph-csi-encryption-kms-config (因为本地没有ceph-csi-encryption-kms-config配置,所以需要注释点,否则部署是失败)

kubectl apply -f csi-rbdplugin-provisioner.yaml

wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml

vim csi-rbdplugin.yaml

......

找到( 进行注释)

# - name: ceph-csi-encryption-kms-config
# mountPath: /etc/ceph-csi-encryption-kms-config/

#- name: ceph-csi-encryption-kms-config
# configMap:
# name: ceph-csi-encryption-kms-config

kubectl apply -f csi-rbdplugin.yaml

7、查看启动插件的pod:(如下图情况说明相关插件部署完成)

 8、用CEPH块设备:

首先创建StorageClass

Kubernetes StorageClass定义了一个存储类。 可以创建多个StorageClass对象以映射到不同的服务质量级别(即NVMe与基于HDD的池)和功能。

cat <<EOF > csi-rbd-sc.yaml

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: be5bb59c-4033-4a7a-82b5-5ef6f098548d
pool: kubernetes
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
mountOptions:
- discard

EOF

[root@k8s-master ceph-csi]# kubectl apply -f csi-rbd-sc.yaml

storageclass.storage.k8s.io/csi-rbd-sc created

查看storageclass:

[root@k8s-master ceph-csi]# kubectl get storageclass

NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
course-nfs-storage nfs-storage Delete Immediate false 21d
csi-rbd-sc rbd.csi.ceph.com Delete Immediate false 6h14m

9、创建PVC

PersistentVolumeClaim是由用户为抽象存储资源的请求。
该PersistentVolumeClaim然后将关联到波德资源提供一个PersistentVolume,这将由Ceph的块图像进行备份。
可以包括可选的volumeMode以在已挂载的文件系统(默认)或基于原始块设备的卷之间进行选择。

例如:基于块的PersistentVolumeClaim

cat <<EOF > raw-block-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: raw-block-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
EOF

[root@k8s-master ceph-csi]# kubectl apply -f raw-block-pvc.yaml 
persistentvolumeclaim/raw-block-pvc created

PersistentVolumeClaim绑定 到作为原始块设备的Pod资源

cat <<EOF > raw-block-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: pod-with-raw-block-volume
spec:
containers:
- name: fc-container
image: fedora:26
command: ["/bin/sh", "-c"]
args: ["tail -f /dev/null"]
volumeDevices:
- name: data
devicePath: /dev/xvda
volumes:
- name: data
persistentVolumeClaim:
claimName: raw-block-pvc
EOF

kubectl apply -f raw-block-pod.yaml

基于文件系统挂载的PVC

cat <<EOF > rbd-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
EOF

[root@k8s-master ceph-csi]# kubectl apply -f rbd-pvc.yaml

查看PVC绑定情况:

[root@k8s-master ceph-csi]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
jenkins Bound pvc-0592fc6a-4bca-44e1-8d3e-b4d27bfd84be 15Gi RWX course-nfs-storage 21d
jenkins-slave-mvn-pvc Bound jenkins-slave-mvn-pv 10Gi RWX 21d
jenkins-slave-mvnconfig-pvc Bound jenkins-slave-mvnconfig-pv 100Mi RWX 21d
jenkins-slave-pvc Bound jenkins-slave-pv 10Gi RWX 21d
rbd-pvc Bound pvc-a2b62c13-756c-4b67-af42-35569ecc0d47 1Gi RWO csi-rbd-sc 6h6m

这里使用以文件系统PersistentVolumeClaim绑定 到Pod资源作为已挂载的文件系统

cat <<EOF > rbd-demo-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: rbd-demo-pod
spec:
containers:
- name: web-server
image: nginx
volumeMounts:
- name: mypvc
mountPath: /var/lib/www/html
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: rbd-pvc
readOnly: false
EOF

[root@k8s-master ceph-csi]# kubectl apply -f rbd-demo-pod.yaml

查看pod是否正常启动

备注:如果出现改pod一直处于ContainerCreating 状态:

我们可以使用kubectl describe pod/rbd-demo-pod 查看如果提示以下报错:

 原因是OS kernel不支持块设备镜像的一些特性,所以映射失败:

我们可以根据报错提示在ceph集群admin主机上面直接diable这个rbd镜像的不支持的特性:

[root@ceph-admin ceph]# rbd feature disable kubernetes/csi-vol-da1372f8-bb3d-11ea-a040-76cc35818538 object-map fast-diff deep-flatten

然后在重启下pod就可以了;

原文地址:https://www.cnblogs.com/abner123/p/13220075.html