Kubernetes(k8s) 1.24 csiceph rbd使用手册

在Kubernetes中经常需要持久化的地方,很早之前都是使用nfs。但是nfs不支持rbd格式,不支持块存储级别。ceph目前是在kubernetes属于比较流行的存储引擎,支持rbd、cephfs等。本次我使用最新版kubernetes 1.24以及N版ceph进行演示
Ceph相关文档
Kubernetes(k8s) 1.24 csiceph rbd使用手册-每日运维网

Ceph-deploy 快速部署Ceph集群

新闻联播老司机

  • 2月18日
  • 1
  • 428
  • 本次环境使用Kubernetes 1.24,相关搭建文档见下方
    Kubernetes(k8s) 1.24 csiceph rbd使用手册-每日运维网

    Kubeadm搭建高可用(k8s)Kubernetes v1.24.0集群

    新闻联播老司机

  • 5月19日
  • 1
  • 1.5k
  • Kubernetes 和Ceph集成提供了三种实现方式

  • volumes存储卷
  • PV/PVC 持久化卷/持久化卷声明ß
  • Storageclass 动态存储,动态创建pv、pvc
  • 目前Ceph支持Kubernetes存储有两种类型,一般来说用RBD比较多

  • Cephfs
  • Ceph RBD
  • 本文章主要介绍Ceph RBD使用场景ß
    目前StorageClass 驱动器(Provisioner),可以使用的卷类型, 该字段必须指定

    当我们需要使用StorageClass来动态创建pv,pvc时,需要指定一个Provisioner,k8s支持Provisioner的服务有以下几种类型

    卷插件
    内置制备器
    配置例子
    AWSElasticBlockStore AWS EBS
    AzureFile Azure File
    AzureDisk Azure Disk
    CephFS - -
    Cinder OpenStack Cinder
    FC - -
    FlexVolume - -
    Flocker -
    GCEPersistentDisk GCE PD
    Glusterfs Glusterfs
    iSCSI - -
    Quobyte Quobyte
    NFS - NFS
    RBD Ceph RBD
    VsphereVolume vSphere
    PortworxVolume Portworx Volume
    ScaleIO ScaleIO
    StorageOS StorageOS
    Local - Local

    官方文档说明https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

    环境准备

    Ceph环境信息

    [root@ceph-01 ~]# ceph version
    ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable)
    
    #Ceph集群状态
    [root@ceph-01 ~]# ceph -s
      cluster:
        id:     c8ae7537-8693-40df-8943-733f82049642
        health: HEALTH_OK
    
      services:
        mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 5h)
        mgr: ceph-02(active, since 5d), standbys: ceph-03, ceph-01
        mds: cephfs-abcdocker:1 {0=ceph-01=up:active} 2 up:standby
        osd: 4 osds: 4 up (since 5h), 4 in (since 5h)
        rgw: 2 daemons active (ceph-01, ceph-02)
    
      task status:
    
      data:
        pools:   9 pools, 384 pgs
        objects: 3.16k objects, 11 GiB
        usage:   36 GiB used, 144 GiB / 180 GiB avail
        pgs:     384 active+clean

    Kubernetes版本相关信息

    ☁  ~  kubectl get node -o wide
    NAME     STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
    k8s-01   Ready    control-plane   11d   v1.24.0   192.168.31.10   <none>        CentOS Linux 7 (Core)   5.17.8-1.el7.elrepo.x86_64    containerd://1.6.4
    k8s-02   Ready    control-plane   11d   v1.24.0   192.168.31.11   <none>        CentOS Linux 7 (Core)   5.17.8-1.el7.elrepo.x86_64    containerd://1.6.4
    k8s-03   Ready    control-plane   11d   v1.24.0   192.168.31.12   <none>        CentOS Linux 7 (Core)   5.17.8-1.el7.elrepo.x86_64    containerd://1.6.4
    k8s-04   Ready    <none>          11d   v1.24.0   192.168.31.13   <none>        CentOS Linux 7 (Core)   5.17.8-1.el7.elrepo.x86_64    containerd://1.6.4
    k8s-05   Ready    <none>          11d   v1.24.0   192.168.31.14   <none>        CentOS Linux 7 (Core)   3.10.0-1160.62.1.el7.x86_64   containerd://1.6.4

    Ceph Csi 驱动部署

    CSI全称Container Storage Interface(容器存储接口)
    CSI的目的是定义行业标准"容器存储接口",使存储供应商(SP)可以开发一个符合CSI标准的插件并使其能够在多个容器编排(CO)系统中工做。CO包括Cloud Foundry, Kubernetes, Mesos等
    Ceph块设备rbd与Kubernetes v1.13以及更高版本通过 ceph -csi一起使用,它动态地提供 RBD 映像以支持 Kubernetes 卷并将这些 RBD 映像映射为工作节点上的块设备(可选地挂载映像中包含的文件系统)运行引用 RBD 支持的卷的pod 。
    要将 Ceph 块设备与 Kubernetes v1.13 及更高版本一起使用,ceph-csi需要安装在Kubernetes 环境中
    Kubernetes(k8s) 1.24 csiceph rbd使用手册-每日运维网
    通过kubernetes sidecar部署provisioner, attacher, resizer, driver-registrar 和 snapshotter 组件,以支持CSI功能。
    Ceph CSI插件实现了支持CSI的Container Orchestrator (CO)和Ceph集群之间的接口。它允许动态供应Ceph卷并将它们附加到工作负载

    ceph-csi默认使用RBD内核模块,可能不支持所有 Ceph CRUSH 可调参数或RBD 映像特性。

    安装ceph-csi驱动

    #默认情况下,Ceph 块设备使用rbd池。为 Kubernetes 卷存储创建一个池。确保您的 Ceph 集群正在运行,然后创建池。
    
    [root@ceph-01 ~]# ceph osd pool create kubernetes 128 128
    pool 'kubernetes' created

    新创建的池必须在使用前进行初始化。使用该rbd工具初始化池:

    [root@ceph-01 ~]# rbd pool init kubernetes

    配置CEPH-CSI
    设置 CEPH 客户端身份验证
    为 Kubernetes 和 ceph -csi创建一个新用户,当然也可以直接使用client.admin用户

    [root@ceph-01 ~]# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes'
    [client.kubernetes]
        key = AQBYpZRiY/JmHRAAD6/jr3cE9E0B/7QjLGi8/w==

    接下来我们执行 ceph auth list就可以看到
    Kubernetes(k8s) 1.24 csiceph rbd使用手册-每日运维网
    生成CEPH-CSI CONFIGMAP
    ceph -csi需要一个存储在 Kubernetes 中的ConfigMap对象来定义Ceph集群的 Ceph mon地址

    [root@ceph-01 ~]# ceph mon dump
    epoch 3
    fsid c8ae7537-8693-40df-8943-733f82049642           #集群ID,后面需要使用
    last_changed 2022-01-10 22:52:57.150281
    created 2022-01-10 22:45:09.178972
    min_mon_release 14 (nautilus)
    0: [v2:192.168.31.20:3300/0,v1:192.168.31.20:6789/0] mon.ceph-01   #mon节点
    1: [v2:192.168.31.21:3300/0,v1:192.168.31.21:6789/0] mon.ceph-02
    2: [v2:192.168.31.80:3300/0,v1:192.168.31.80:6789/0] mon.ceph-03
    dumped monmap epoch 3
    ...
    
    #当然ceph -s也可以看到
    [root@ceph-01 ~]# ceph -s |grep mon
        mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 16h)
        rgw: 2 daemons active (ceph-01, ceph-02)

    修改ceph mon节点ip地址,修改集群clusterID。

    [root@k8s-01 ~]# mkdir /root/ceph
    
    #将cpeh configmap存储在/root/ceph目录中
    #clusterID需要和上面获取到的id保持一致,并且需要修改mon地址,多个地址后面需要使用逗号分隔。
    
    cat <<EOF > /root/ceph/csi-config-map.yaml
    ---
    apiVersion: v1
    kind: ConfigMap
    data:
      config.json: |-
        [
          {
            "clusterID": "c8ae7537-8693-40df-8943-733f82049642",
            "monitors": [
              "192.168.31.21:6789",
              "192.168.31.22:6789",
              "192.168.31.23:6789"
            ]
          }
        ]
    metadata:
      name: ceph-csi-config
    EOF

    在Kubernetes中创建

    [root@k8s-01 ceph]# cd /root/ceph
    [root@k8s-01 ceph]# kubectl apply -f csi-config-map.yaml
    configmap/ceph-csi-config created

    在Kubernetes中就可以看到已经创建的configmap
    Kubernetes(k8s) 1.24 csiceph rbd使用手册-每日运维网
    最新版本的ceph-csi还需要一个额外的ConfigMap对象来定义密钥管理服务 (KMS) 提供者的详细信息。如果未设置 KMS,请将空配置放入csi-kms-config-map.yaml

    必须填写,后面可以不使用,但是要有这个configmap,下面的pod会调用

    cat <<EOF > /root/ceph/csi-kms-config-map.yaml
    ---
    apiVersion: v1
    kind: ConfigMap
    data:
      config.json: |-
        {}
    metadata:
      name: ceph-csi-encryption-kms-config
    EOF
    
    #创建空配置文件即可
    [root@k8s-01 ceph]# kubectl apply -f csi-kms-config-map.yaml

    ceph-csi还需要创建一个configmap,用于读取ceph节点中的ceph.conf中的配置文件,csi容器会读取这个配置文件

    cat <<EOF > /root/ceph/ceph-config-map.yaml
    ---
    apiVersion: v1
    kind: ConfigMap
    data:
      ceph.conf: |
        [global]
        auth_cluster_required = cephx
        auth_service_required = cephx
        auth_client_required = cephx
      # keyring is a required key and its value should be empty
      keyring: |
    metadata:
      name: ceph-config
    EOF

    ceph-csi还需要另一个ConfigMap对象来定义 Ceph 配置以添加到 CSI 容器内的 ceph.conf 文件中

     cat <<EOF > /root/ceph/ceph-config-map.yaml
    ---
    apiVersion: v1
    kind: ConfigMap
    data:
      ceph.conf: |
        [global]
        auth_cluster_required = cephx
        auth_service_required = cephx
        auth_client_required = cephx
      # keyring is a required key and its value should be empty
      keyring: |
    metadata:
      name: ceph-config
    EOF
    
    [root@k8s-01 ~]# kubectl  apply -f ceph-config-map.yaml
    
    #请注意,所有的yaml文件都放在/root/ceph目录中

    ceph -csi需要 cephx 凭据才能与 Ceph 集群通信。使用新创建的 Kubernetes 用户 id 和 cephx 密钥生成类似于以下示例的csi-rbd-secret.yaml文件
    ceph auth list 获取ceph用户,找到admin用户,复制后面的Key

    使用kubernetes用户会存在pvc创建失败的问题

     cat <<EOF > /root/ceph/csi-rbd-secret.yaml
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: csi-rbd-secret
      namespace: default
    stringData:
      userID: admin
      userKey: JmHRAAD6/jr3cE9E0B/7QjLGi8/w==
    EOF
    
    #创建secret
    [root@k8s-01 ~]# kubectl apply -f csi-rbd-secret.yaml

    到目前为止,ceph-csi的相关配置文件已经创建完毕

    [root@k8s-01 ~]# kubectl get secret
    NAME             TYPE     DATA   AGE
    csi-rbd-secret   Opaque   2      79s
    [root@k8s-01 ~]# kubectl get cm
    NAME                             DATA   AGE
    ceph-config                      2      6m32s
    ceph-csi-config                  1      28m
    ceph-csi-encryption-kms-config   1      20m

    CEPH-CSI RBD 创建

    ceph中不推荐在ceph rbd模式下使用RWX访问控制,如果应用层没有访问锁机制,可能会造成数据损坏。所以rbd模式我们只可以使用一个节点
    部署CEPH-CSI RBAC
    ceph-csi需要创建ServiceAccount和RBAC用于访问Kubernetes集群内部信息

    #官方下载地址
    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
    
    #abcdocker提供下载地址
    kubectl apply -f https://d.frps.cn/file/tools/ceph-csi/csi-provisioner-rbac.yaml
    kubectl apply -f https://d.frps.cn/file/tools/ceph-csi/csi-nodeplugin-rbac.yaml

    部署ceph-csi provisioner

    默认情况下,provisioner和节点插件YAML将拉取ceph -csi容器的开发版本 (quay.io/cephcsi/cephcsi:canary)

    这里需要我们提前导入镜像

    #在k8s-01上下载,scp到其他节点
    wget -P /tmp/ https://d.frps.cn/file/tools/ceph-csi/k8s_1.24_ceph-csi.tar
    #在k8s-01导入镜像
    ctr -n k8s.io i import  k8s_1.24_ceph-csi.tar
    
    #在其他节点导入镜像,根据需求修改for循环即可
    for i in  k8s-02 k8s-03 k8s-04 k8s-05;
    do
        scp /tmp/k8s_1.24_ceph-csi.tar root@$i:/tmp/
        ssh root@$i ctr -n k8s.io i import  /tmp/k8s_1.24_ceph-csi.tar
    done

    导入完镜像就可以安装deployment

    #官方下载地址
    cd /root/ceph
    wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
    wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml
    
    #abcdocker提供下载地址
    wget https://d.frps.cn/file/tools/ceph-csi/csi-rbdplugin.yaml
    wget https://d.frps.cn/file/tools/ceph-csi/csi-rbdplugin-provisioner.yaml

    创建provisioner

    [root@k8s-01 ~]# cd /root/ceph
    [root@k8s-01 ceph]# kubectl apply -f csi-rbdplugin.yaml
    [root@k8s-01 ceph]# kubectl apply -f csi-rbdplugin-provisioner.yaml

    查看pod和deployment状态
    Kubernetes(k8s) 1.24 csiceph rbd使用手册-每日运维网
    Ceph Storageclass 动态存储
    ceph-csi定义好之后,我们就可以定义storageClass

  • 首先要获取集群id ceph -s|grep id|awk -F "[ ]+" '{print $3}'
  • 需要根据实际情况修改集群id

    cat <<EOF > /root/ceph/csi-rbd-sc.yaml
    ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
       name: csi-rbd-sc     #storageclass名称
    provisioner: rbd.csi.ceph.com   #驱动器
    parameters:
       clusterID: c8ae7537-8693-40df-8943-733f82049642    #ceph集群id
       pool: kubernetes       #pool空间
       imageFeatures: layering   #rbd特性
       csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
       csi.storage.k8s.io/provisioner-secret-namespace: default
       csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
       csi.storage.k8s.io/controller-expand-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   #pvc回收机制
    allowVolumeExpansion: true   #对扩展卷进行扩展
    mountOptions:           #StorageClass 动态创建的 PersistentVolume 将使用类中 mountOptions 字段指定的挂载选项
       - discard
    EOF
    kubectl apply -f /root/ceph/csi-rbd-sc.yaml

    layering特性使得克隆image的时候,父子image之间采用COW,他们之间的对象文件存在依赖关系,flatten操作的目的是解除父子image的依赖关系,但是子image的快照并没有解除依赖,deep-flatten特性使得快照的依赖也解除。

    ceph支持 layering,striping exclusive lock, object map,fast diff ,deep-flatten 等新的new features

    类型
    特性
    layering image的克隆操作。可以对image创建快照并保护,然后从快照克隆出新的image出来,父子image之间采用COW技术,共享对象数据。
    striping v2 条带化对象数据,类似raid 0,可改善顺序读写场景较多情况下的性能。
    exclusive lock 保护image数据一致性,对image做修改时,需要持有此锁。这个可以看做是一个分布式锁,在开启的时候,确保只有一个客户端在访问image,否则锁的竞争会导致io急剧下降。 主要应用场景是qemu live-migration。
    object map 此特性依赖于exclusive lock。因为image的对象分配是thin-provisioning,此特性开启的时候,会记录image所有对象的一个位图,用以标记对象是否真的存在,在一些场景下可以加速io。
    fast diff 此特性依赖于object map和exlcusive lock。快速比较image的snapshot之间的差异。
    deep-flatten layering特性使得克隆image的时候,父子image之间采用COW,他们之间的对象文件存在依赖关系,flatten操作的目的是解除父子image的依赖关系,但是子image的快照并没有解除依赖,deep-flatten特性使得快照的依赖也解除。
    journaling 依赖于exclusive lock。将image的所有修改操作进行日志化,并且复制到另外一个集群(mirror),可以做到块存储的异地灾备。这个特性在部署的时候需要新部署一个daemon进程,目前还在试验阶段,不过这个特性很重要,可以做跨集群/机房容灾。
    Exclusive Lock 从上面可以看出,很多特性都依赖于exclusive lock,重点介绍一下。
    exclusive lock 是分布式锁,实现的时候默认是客户端在第一次写的时候获取锁,并且在收到其他客户端的锁请求时自动释放锁。这个特性在jewel默认开启后,本身没什么问题, 客户端可以自动获取和释放锁,在客户端crash后也能够正确处理。

    查看StorageClass状态

    [root@k8s-01 ~]# kubectl get sc
    NAME         PROVISIONER        RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    csi-rbd-sc   rbd.csi.ceph.com   Delete          Immediate           true                   3m26s

    创建pvc测试

    cat <<EOF > /root/ceph/raw-block-pvc.yaml
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: raw-block-pvc     #pvc名称
    spec:
      accessModes:
        - ReadWriteOnce     #访问模式
      volumeMode: Block     #数据卷类型
      resources:
        requests:
          storage: 1Gi      #存储空间
      storageClassName: csi-rbd-sc   #后端storageclass名称
    EOF
    kubectl apply -f /root/ceph/raw-block-pvc.yaml

    查看pvc创建情况

    当我们创建pvc后,pv会自动帮我们创建好

    [root@k8s-01 ~]# kubectl get pvc
    NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    raw-block-pvc   Bound    pvc-20bc551a-2e28-44f1-94f4-7025a0e01aa5   1Gi        RWO            csi-rbd-sc     82s
    [root@k8s-01 ~]# kubectl get pv
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
    pvc-20bc551a-2e28-44f1-94f4-7025a0e01aa5   1Gi        RWO            Delete           Bound    default/raw-block-pvc   csi-rbd-sc              84s

    我ceph中的pool里,就可以看到新创建的rbd

    [root@ceph-01 ~]# rbd ls kubernetes
    csi-vol-88e24aae-e279-11ec-867c-562ca7dbc101
    [root@ceph-01 ~]# ceph df
    
    RAW STORAGE:
        CLASS     SIZE        AVAIL       USED       RAW USED     %RAW USED
        hdd       180 GiB     144 GiB     32 GiB       36 GiB         20.06
        TOTAL     180 GiB     144 GiB     32 GiB       36 GiB         20.06
    
    POOLS:
        POOL                          ID     PGS     STORED      OBJECTS     USED        %USED     MAX AVAIL
        abcdocker                      1      64     618 MiB         350     1.8 GiB      1.39        43 GiB
        .rgw.root                      2      32     1.2 KiB           4     768 KiB         0        43 GiB
        default.rgw.control            3      32         0 B           8         0 B         0        43 GiB
        default.rgw.meta               4      32     1.7 KiB           7     1.1 MiB         0        43 GiB
        default.rgw.log                5      32         0 B         207         0 B         0        43 GiB
        default.rgw.buckets.index      6      32         0 B           2         0 B         0        43 GiB
        default.rgw.buckets.data       7      32         0 B           0         0 B         0        43 GiB
        cephfs_data                    8      64      10 GiB       2.56k      30 GiB     18.87        43 GiB
        cephfs_metadata                9      64     671 KiB          23     3.6 MiB         0        43 GiB
        kubernetes                    11     128        36 B           8     384 KiB         0        43 GiB

    我们可以详细的看一下ceph rbd中的镜像使用情况

    [root@ceph-01 ~]# rbd info kubernetes/csi-vol-88e24aae-e279-11ec-867c-562ca7dbc101
    rbd image 'csi-vol-88e24aae-e279-11ec-867c-562ca7dbc101':
        size 1 GiB in 256 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 4565b1a1dbd46
        block_name_prefix: rbd_data.4565b1a1dbd46
        format: 2
        features: layering
        op_features:
        flags:
        create_timestamp: Thu Jun  2 21:40:15 2022
        access_timestamp: Thu Jun  2 21:40:15 2022
        modify_timestamp: Thu Jun  2 21:40:15 2022

    在ceph中不推荐在ceph rbd模式下使用RWX访问控制,如果应用层没有访问锁机制,可能会造成数据损坏。所以rbd模式我们只可以使用一个节点

    首先创建一个pvc

    [root@k8s-01 nginx]# cat pvc.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nginx-pvc-abcdocker
      labels:
        app: abcdocker-test
    spec:
      storageClassName: csi-rbd-sc   #这里的storageclass是我们之前申请的
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi

    创建nginx配置文件

    [root@k8s-01 nginx]# cat nginx-pvc.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx-frontend-abcdocker
      name: nginx-frontend-abcdocker
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: nginx-frontend-abcdocker
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: nginx-frontend-abcdocker
        spec:
          containers:
          - image: nginx:latest
            imagePullPolicy: IfNotPresent
            name: nginx-frontend-abcdocker
            ports:
            - containerPort: 80
              protocol: TCP
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: abcdocker-volume
          restartPolicy: Always
          volumes:
          - name: abcdocker-volume
            persistentVolumeClaim:
              claimName: nginx-pvc-abcdocker
              readOnly: false
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-frontend-abcdocker
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx-frontend-abcdocker
      sessionAffinity: None
      type: NodePort

    kubectl apply -f .当我们创建好pvc和deployment的时候,我们就可以访问看一下

    [root@k8s-01 ~]# kubectl exec -it nginx-frontend-abcdocker-6d797446f4-djjgb bash
    kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
    root@nginx-frontend-abcdocker-6d797446f4-djjgb:/# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    overlay          79G   11G   69G  14% /
    tmpfs            64M     0   64M   0% /dev
    tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
    shm              64M     0   64M   0% /dev/shm
    /dev/sda3        79G   11G   69G  14% /etc/hosts
    /dev/rbd0       974M   28K  958M   1% /usr/share/nginx/html
    tmpfs           7.7G   12K  7.7G   1% /run/secrets/kubernetes.io/serviceaccount
    tmpfs           3.9G     0  3.9G   0% /proc/acpi
    tmpfs           3.9G     0  3.9G   0% /proc/scsi
    tmpfs           3.9G     0  3.9G   0% /sys/firmware
    
    #我们可以看到已经挂载好的/dev/rbd0目录

    容器events没有报错以及异常

    StatefulSet使用StorageClass生产实践

    生产环境中,StatefulSet一般直接在Kubernetes使用volumeClaimTemplates来申请存储空间,用而减少pvc的创建步骤

    cat >/root/ceph/nginx-st.yaml <<EOF
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      replicas: 3
      revisionHistoryLimit: 10
      serviceName: nginx
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:  #name没写,会默认生成的
          labels:  
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 80
            volumeMounts:
            - name: web #填vcp名字
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: web
        spec:
          accessModes: ["ReadWriteOnce"]
          storageClassName: csi-rbd-sc
          volumeMode: Filesystem
          resources:
            requests:
              storage: 512M
    EOF
    
    #创建持久化存储
    [root@k8s-01 nginx]# kubectl apply -f /root/ceph/nginx-st.yaml

    默认会创建3个pod,为有序

    [root@k8s-01 nginx]# kubectl get pod|grep web
    web-0                                        1/1     Running   0               101m
    web-1                                        1/1     Running   0               101m
    web-2                                        1/1     Running   0               100m

    并且会为每一个pod创建一个rbd文件

    [root@k8s-01 nginx]# kubectl get pvc
    NAME                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    nginx-pvc-abcdocker   Bound    pvc-5e314f99-c0c4-45b7-9c08-3a3a39ea9bb3   1Gi        RWO            csi-rbd-sc     135m
    raw-block-pvc         Bound    pvc-be023d3f-af00-4207-b804-d531ffcaa421   1Gi        RWO            csi-rbd-sc     151m
    web-web-0             Bound    pvc-332a937f-f97d-4270-9115-081cb3d60a44   489Mi      RWO            csi-rbd-sc     102m
    web-web-1             Bound    pvc-ea192941-fc9b-4e3e-8142-b531e7ead8da   489Mi      RWO            csi-rbd-sc     102m
    web-web-2             Bound    pvc-09ad9cae-9207-4e68-8c58-5cfe38c40dc3   489Mi      RWO            csi-rbd-sc     101m
    [root@k8s-01 nginx]# kubectl get pv
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS   REASON   AGE
    pvc-09ad9cae-9207-4e68-8c58-5cfe38c40dc3   489Mi      RWO            Delete           Bound    default/web-web-2             csi-rbd-sc              101m
    pvc-332a937f-f97d-4270-9115-081cb3d60a44   489Mi      RWO            Delete           Bound    default/web-web-0             csi-rbd-sc              102m
    pvc-5e314f99-c0c4-45b7-9c08-3a3a39ea9bb3   1Gi        RWO            Delete           Bound    default/nginx-pvc-abcdocker   csi-rbd-sc              135m
    pvc-be023d3f-af00-4207-b804-d531ffcaa421   1Gi        RWO            Delete           Bound    default/raw-block-pvc         csi-rbd-sc              151m
    pvc-ea192941-fc9b-4e3e-8142-b531e7ead8da   489Mi      RWO            Delete           Bound    default/web-web-1             csi-rbd-sc              102m

    查看容器挂载情况

    [root@k8s-01 nginx]# kubectl exec -it web-1 bash
    kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
    root@web-1:/# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    overlay          50G   20G   31G  40% /
    tmpfs            64M     0   64M   0% /dev
    tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
    shm              64M     0   64M   0% /dev/shm
    /dev/sda3        50G   20G   31G  40% /etc/hosts
    /dev/rbd0       466M  2.3M  460M   1% /usr/share/nginx/html             #默认挂载点
    tmpfs           3.7G   12K  3.7G   1% /run/secrets/kubernetes.io/serviceaccount
    tmpfs           1.9G     0  1.9G   0% /proc/acpi
    tmpfs           1.9G     0  1.9G   0% /proc/scsi
    tmpfs           1.9G     0  1.9G   0% /sys/firmware

    并且我们查看rbd文件,也可以看到对应的镜像

    StatefulSet常用于Redis、Mysql、ES做集群的时候,数据相互隔离,互相主备的关系

    相关文章:

    1. Ceph-deploy 快速部署Ceph集群
    2. Ceph OSD扩容与缩容
    3. Ceph集群日常使用命令
    4. Ceph RBD 备份与恢复