k8s使用ceph-csi插件的cephfs方式持久化存储

环境说明

操作系统:centos-7.9 x86_64,内核版本3.10.0,所有组件安装均在该操作系统
ceph版本:ceph version 14.2.22 nautilus (stable)
kubernetes版本:v1.17.4
ceph-csi版本:v3.0.0
docker版本:19.03.9

部署

前置条件:docker、k8s、ceph均已部署完毕

ceph集群需要完成的工作

ceph 集群开启安全模式ceph config set mon auth_allow_insecure_global_id_reclaim true默认应该是开启的

创建存储池和文件系统

使用cephfs必须开启mds服务(元数据服务的守护进程),此进程管理与CephFS上存储的文件相关的元数据,并协调对Ceph存储集群的访问。因此,若要使用CephFS接口,需要在存储集群中至少部署一个MDS实例

# 在admin节点使用ceph-deploy命令开启mds服务,将mds服务运行在node1节点上
ceph-deploy mds create node1

查看是否启动成功systemctl status ceph-mds@node1
在这里插入图片描述

使用cephfs之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池,本次测试创建名为k8s-cephfs的文件系统,使用k8s-cephfs-metadata作为元数据存储池,使用k8s-cephfs为数据存储池

# 创建存储池
ceph osd pool create k8s-cephfs 16
ceph osd pool create k8s-cephfs-metadata 16
# 创建文件系统
ceph fs new k8s-cephfs k8s-cephfs-metadata k8s-cephfs
# 查看创建的cephfs
[root@node1 ~]# ceph fs ls
name: k8s-cephfs, metadata pool: k8s-cephfs-metadata, data pools: [k8s-cephfs ]

查看cluster id以及用户的key

本次操作使用ceph的admin用户,不再另外创建用户,如有需要可自行另外创建

获取admin用户的key

[root@node1 ~]# ceph auth get client.admin  
[client.admin]
	key = AQCV4n5j60KACxAA0ZX1s/ABTrWFcJN5Tnun9w==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"
exported keyring for client.admin

获取ceph集群monitor信息,主要是需要其中的fsid和mon的node信息

[root@node1 ~]# ceph mon dump
epoch 1
fsid f38a95d3-b932-480c-89bc-161a4f81c160  // 后续k8s使用的ceph的cluster id是这个
last_changed 2022-11-24 11:18:44.328712
created 2022-11-24 11:18:44.328712
min_mon_release 14 (nautilus)
0: [v2:192.168.221.141:3300/0,v1:192.168.221.141:6789/0] mon.node1  // 这里的3300和6789测试均可使用
dumped monmap epoch 1

k8s集群需要完成的工作

命名空间直接使用default,如果有需要自行创建新的命名空间

在k8s集群拉取ceph-csi代码

本次是在master节点操作,其他节点未做尝试

git clone --branch v3.0.0 https://github.com/ceph/ceph-csi.git
cd ceph-csi/deploy/cephfs/kubernetes

修改yaml文件

  • csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    [
      {
    
    
        "clusterID": "f38a95d3-b932-480c-89bc-161a4f81c160", # 前面的fsid
        "monitors": [
          "192.168.221.141:6789"
        ]
      }
    ]
metadata:
  name: ceph-csi-config-fs  # 加了fs目的是个rbd的操作做区分
  • csi-provisioner-rbac.yaml和csi-nodeplugin-rbac.yaml里面的命名空间,如果不适用default,需要自行修改为要使用的namespace

  • csi-provisioner-psp.yaml和csi-nodeplugin-psp.yaml这两个文件,因为集群没有开启PodSecurityPolicy ,因此也不设置,也不会部署

部署cephfs csi

kubectl apply -f csi-config-map.yaml 
kubectl apply -f csi-provisioner-rbac.yaml 
kubectl apply -f csi-nodeplugin-rbac.yaml 
kubectl apply -f csi-cephfsplugin-provisioner.yaml 
kubectl apply -f csi-cephfsplugin.yaml 

查看启动的pods是否正常kubectl get pods
在这里插入图片描述

验证

k8s集群操作

创建秘钥

[root@master cephfs]# cd ceph-csi/examples/cephfs
[root@master cephfs]# vim secret.yaml
// 内容如下,其中的userid和userkey都是ceph集群的用户和key,本文第一步已经获取得到了
---
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: default
stringData:
  userID: admin
  userKey: AQCV4n5j60KACxAA0ZX1s/ABTrWFcJN5Tnun9w==

  adminID: admin
  adminKey: AQCV4n5j60KACxAA0ZX1s/ABTrWFcJN5Tnun9w==
[root@master cephfs]# kubectl apply -f secret.yaml

编辑storageclass.yaml

vim storageclass.yaml

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
  # (required) String representing a Ceph cluster to provision storage from.
  # Should be unique across all Ceph clusters in use for provisioning,
  # cannot be greater than 36 bytes in length, and should remain immutable for
  # the lifetime of the StorageClass in use.
  # Ensure to create an entry in the configmap named ceph-csi-config, based on
  # csi-config-map-sample.yaml, to accompany the string chosen to
  # represent the Ceph cluster in clusterID below
  clusterID: f38a95d3-b932-480c-89bc-161a4f81c160  # 此处就是填写上面的clusterID
  
  # (required) CephFS filesystem name into which the volume shall be created
  # eg: fsName: myfs
  fsName: k8s-cephfs # 填写上面的文件系统
  
  # (optional) Ceph pool into which volume data shall be stored
  # pool: <cephfs-data-pool>
  
  # (optional) Comma separated string of Ceph-fuse mount options.
  # For eg:
  # fuseMountOptions: debug
  
  # (optional) Comma separated string of Cephfs kernel mount options.
  # Check man mount.ceph for mount options. For eg:
  # kernelMountOptions: readdir_max_bytes=1048576,norbytes
  
  # The secrets have to contain user and/or Ceph admin credentials.
  # 注意,这里的命名空间如有修改,请做修改
  csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/provisioner-secret-namespace: default 
  csi.storage.k8s.io/controller-expand-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/controller-expand-secret-namespace: default 
  csi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/node-stage-secret-namespace: default 
  
  # (optional) The driver can use either ceph-fuse (fuse) or
  # ceph kernelclient (kernel).
  # If omitted, default volume mounter will be used - this is
  # determined by probing for ceph-fuse and mount.ceph
  # mounter: kernel
  
  # (optional) Prefix to use for naming subvolumes.
  # If omitted, defaults to "csi-vol-".
  # volumeNamePrefix: "foo-bar-"
  
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
  - discard
kubectl apply -f storageclass.yaml
kubectl get sc

在这里插入图片描述

创建pvc

kubectl apply -f pvc.yaml
kubectl get pvc

在这里插入图片描述

创建pod

kubectl apply -f pod.yaml
kubectl get pods

在这里插入图片描述
验证成功

日志查看方法

先获取pods信息
在这里插入图片描述
上图中的几个pod,不一定log在哪个pod中,可以试试,因为对k8s还不是很熟悉,暂时不知道更多方式

kubectl logs csi-cephfsplugin-provisioner-7c46d589d9-7m5b4 -c csi-cephfsplugin

安装过程中出现的问题

在安装pvc时,pod一直是pending状态,日志内提示pvc-31c28f95-cf1e-4746-81ce-51d24f34a5b2 an operation with the given Volume ID pvc-31c28f95-cf1e-4746-81ce-51d24f34a5b2 already exists,根据网上教程设置monitor端口为3300后还是不可以。
后来发现是没有启动ceph集群没有开启mds服务,开启之后,pod状态直接转为bound了,后续操作完成。

about

欢迎关注我的博客

猜你喜欢

转载自blog.csdn.net/HYESC/article/details/128039771