Kubernetes(k8s) 1.24 csiceph rbd使用手册

2023年 5月 4日 52.2k 0

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

Ceph-deploy 快速部署Ceph集群

新闻联播老司机

  • 2月18日
  • 1
  • 428
  • 本次环境使用Kubernetes 1.24,相关搭建文档见下方

    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 环境中
    1653905661435.png
    通过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就可以看到
    1653908894024.png
    生成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
    1654148451361.png
    最新版本的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状态
    1654163078159.png
    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 备份与恢复

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论