• 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
    
    • 1
    • 2

    查看是否启动成功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 ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    查看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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    获取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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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
    
    • 1
    • 2

    修改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的操作做区分
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 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 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看启动的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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    编辑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: 
      
      # (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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    kubectl apply -f storageclass.yaml
    kubectl get sc
    
    • 1
    • 2

    在这里插入图片描述

    创建pvc

    kubectl apply -f pvc.yaml
    kubectl get pvc
    
    • 1
    • 2

    在这里插入图片描述

    创建pod

    kubectl apply -f pod.yaml
    kubectl get pods
    
    • 1
    • 2

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

    日志查看方法

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

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

    安装过程中出现的问题

    在安装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

    欢迎关注我的博客

  • 相关阅读:
    【运维项目经历|040】高可用Web服务平台:LVS+Apache集群+NFS共享存储系统
    音频应用编程
    MySQL数据库查询对象空值判断与Java代码示例【含面试题】
    CSS 选择器:精通网页样式的基础
    EN 12259-2固定消防系统湿式报警阀组件—CE认证
    Java:SpringBoot整合JDBC实现对数据库的CURD增删改查
    手写diff算法
    天翼云为这场酷炫的元宇宙会议做了这件事
    C语言程序设计笔记(浙大翁恺版) 第五周:循环控制
    【算法笔记】多源最短路问题——Floyd算法
  • 原文地址:https://blog.csdn.net/HYESC/article/details/128039771