一、具体相关文档可以查看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就可以了;