小阿轩yx-云原生存储Rook部署Ceph

小阿轩yx-云原生存储Rook部署Ceph

前言

Rook

  • 一款云原生存储编排服务工具
  • 由云原生计算基金会(CNCF)孵化,且于2020年10月正式进入毕业阶段。
  • 并不直接提供数据存储方案,而是集成了各种存储解决方案,并通过一种自管理、自扩容、自修复的云原生存储服务。
  • 社区官方资料显示,目前最新的稳定版本中,只有 Rook+Ceph 存储集成方案处于 stable 状态,版本升级较平滑。
  • 本身并不是存储系统,在存储和 Kubernetes 之间搭建了一个桥梁,使存储系统的搭建或维护变得特别简单
  • 让一些存储操作部署、配置、扩容、升级、迁移、灾难恢复、监视和资源管理变得自动化,无需人工处理
  • 支持 CSI,可利用 CSI 做一些 PVC 的快照、扩容、克隆等操作

Rook 可以快速搭建一个 Ceph 存储系统,用来持久化一些必需的数据,不仅降低了运维复杂度,也能更加方便体验 Kubernetes 带来的收益,同时也可以通过 Rook 来演示更多的 Kubernetes 存储的高级功能

Ceph

  • 一种广泛使用的开源分布式存储方案,通过 Rook 可以大大简化 Ceph 在 Kubernetes 集群中的部署和维护工作。
  • 基于 Rook+Ceph 的储存方案,能为云原生环境提供文件、块及对象存储服务。
  • 建立 Ceph 集群不仅需要大量的服务器资源,本身的复杂度也需要人力成本。
  • 企业内部使用 Kubemetes 时,无论是在部署业务服务还是中间件服务,都能很明显地体会到Kubernetes 的便利性和强大之处,所以我们在企业内部使用Kubernetes 时,同时也会把中间件服务(比如 MySQLRabbitMQ、Zookeeper等)部署在 Kubernetes 集群中。

相对于生产环境,也需要保留它们的数据,但是非生产环境可能并没有现成的,存储平台供Kubernetes 使用,新建一个平台供其使用也会浪费很多精力。

Rook 诞生原因

  • 解决非生产环境的数据持久化问题
  • 公司都采用了 NFS 作为后端,但是一旦使用的容器较多或者存储的数据量比较大,就容易造成性能问题,并且 NFS 服务器一旦出现问题,整个数据可能会全部丢失
  • 非生产环境也需要一个高可用、分布式并且免运维的存储平台

Rook 的安装

  • Rook 是专门为 Kubernetes 设计的云原生存储,它本身和由 Rook 创建的 Ceph 集群都是部署在 Kubernetes 平台上的

本案例中,是一台 master,两台 node,因为 ceph 集群的最小要求是三个节点,因此需要在包含 master 主机在内的三台主机都添加磁盘。所有主机添加一块 100G 的磁盘

  • 数据盘可以是一块硬盘 sdb,也可以是硬盘的一个分区 sdb2,或者是逻辑卷,但是这些都必须没有被格式过,没有指定文件系统类型。
  • 可以使用 lsblk -f 来确认数据盘有没有被文件系统格式化过。
  • FSTYPE 字段为空即代表未被文件系统格式化过。

为所有主机添加磁盘(100G)

101

102

103

首先将 images 镜像文件通过 Xftp 上传至 master、node01、node02(101、102、103)

将 k8s-ha-install、rook 两个文件单独上传至 master(101)

这一步开启会话同步

进入镜像文件三个节点同时导入镜像

主机一

复制代码
[root@k8s-master ~]# cd images/
[root@k8s-master images]# bash imp_docker_img.sh

主机二

复制代码
[root@k8s-node01 ~]# cd images/
[root@k8s-node01 images]# bash imp_docker_img.sh

主机三

复制代码
[root@k8s-node02 ~]# cd images/
[root@k8s-node02 images]# bash imp_docker_img.sh

vdb 可以作为 ceph 的数据盘

复制代码
[root@k8s-master ~]# lsblk -f
NAME    FSTYPE    LABLE        UUID                    MOUNTPOINT
sr0     iso9660   config-2     2024-09-02-01-50-00
vda
|------vda1 xfs                    624b9bfb-904e-4d69-b7e0-cf598f443497 /boot
|__vda2 xfs                    974b2a82-1668-42c8-a4b6-bb1d24eada2f/
vdb

保证所有安装 ceph 的节点都安装了 lvm2

  • Ceph OSD 在某些情况下(比如启用加密或指定元数据设备)依赖于 LVM(Logical VolumeManager)。
  • 如果没有安装 LVM2 软件包,则虽然 Rook 可以成功创建 Ceph OSD,但是当节点重新启动时,重新启动的节点上运行的 OSD pod 将无法启动。

三台节点都要安装

复制代码
[root@k8s-master ~]# yum -y install lvm2
[root@k8s-node01 ~]# yum -y install lvm2
[root@k8s-node02 ~]# yum -y install lvm2

三台节点查看已安装的包的列表

复制代码
[root@k8s-master ~]# yum list installed | grep lvm2
lvm2.x86_64        7:2.02.187-6.el7_9.5    @updates
lvm2-libs.x86_64   7:2.02.187-6.el7_9.5    @updates

[root@k8s-node01 ~]# yum list installed | grep lvm2
lvm2.x86_64        7:2.02.187-6.el7_9.5    @updates
lvm2-libs.x86_64   7:2.02.187-6.el7_9.5    @updates

[root@k8s-node02 ~]# yum list installed | grep lvm2
lvm2.x86_64        7:2.02.187-6.el7_9.5    @updates
lvm2-libs.x86_64   7:2.02.187-6.el7_9.5    @updates

加载 rbd 内核

  • Ceph 存储需要包含了 RBD 模块的 Linux 内核来支持。

  • 使用 Kubernetes 环境中运行 ceph 存储之前,需要在 Kubernetes 节点上运行 modprobe rbd 命令来测试当前内核中是否已经加载了RBD 内核。

    [root@k8s-master ~]# modprobe rbd

查看内核模块(三个节点都要有)

复制代码
[root@k8s-master ~]# lsmod | grep rbd
rbd                    118784    0
libceph                483328    1    rbd

[root@k8s-node01 ~]# lsmod | grep rbd
rbd                    118784    0
libceph                483328    1    rbd

[root@k8s-node02 ~]# lsmod | grep rbd
rbd                    118784    0
libceph                483328    1    rbd

取消 master 污点

  • 由于 ceph 集群默认最小三个节点,当前 kubernetes 也是三节点,1个master+2 个worker,所以需要使用 master 节点来充当 ceph 节点,因此需要取消 master 节点上的污点,否是 ceph 相关 pod 无法调度到 master 节点,导致部署失败。如果 worker 节点足够则无需此操作。

查看当前 kubernetes 环境中的污点

复制代码
[root@k8s-master ~]# kubectl get no -o yaml | grep taint -A 5
    taints:
    - effect: Noschedule
      key: node-role.kubernetes.io/master
  status:
    addresses:
    - address: 192.168.10.101
  • -A 5 表示显示出 taint 行以及往下的5行
  • 此命令能够取消所有设备的污点

这里取消会话同步

下载 v1.11.5 版本的 Rook 源码

https://github.com/rook/rook.git

  • git clone --single-branch --branch v1.11.5
  • v1.11.5 的版本可以支持 kubernetes:v1.21.0 以上的版本
  • 本案例已经下载过,直接使用离线文件

拉取镜像(若本地已有这些镜像,可以不执行此步骤)

进入目录

复制代码
[root@k8s-master ~]# cd rook/deploy/example

查看都需要哪些镜像

复制代码
[root@k8s-master examples]# cat images.txt
rook_ceph_v1.11.5
quay.io_ceph_ceph_v17.2.6
quay.io_cephcsi_cephcsi_v3.8.0
registry.k8s.io_sig-storage_csi-attacher_v4.1.0
registry.k8s.io_sig-storage_csi-node-driver-registrar_v2.7.0
registry.k8s.io_sig-storage_csi-provisioner_v3.4.0
registry.k8s.io_sig-storage_csi-resizer_v1.7.0
registry.k8s.io_sig-storage_csi-snapshotter_v6.2.1

用脚本拉取所有镜像

  • 该脚本从阿里云镜像仓库拉取到本地,再用 docker image tag 命令修改为为原镜像名称

    [root@k8s-master examples]# vim ceph-images.sh
    #!/bash/bin
    image_list=(
    csi-node-driver-registrar:v2.7.0
    csi-attacher:v4.1.0
    csi-snapshotter:v6.2.1
    csi-resizer:v1.7.0
    csi-provisioner:v3.4.0
    rook/ceph:v1.11.5
    quay.io/ceph/ceph:v17.2.6
    quay.io/cephcsi/cephcsi:v3.8.0
    )

    aliyuncs="registry.aliyuncs.com/it00021hot"
    google_gcr="registry.k8s.io/sig-storage"
    for image in {image_list[*]} do docker image pull {aliyuncs}/{image} docker image tag {aliyuncs}/{image} {google_gcr}/{image} docker image rm {aliyuncs}/{image} echo "{aliyuncs}/{image} {google_gcr}/${image} downloaded."
    done

  • aliyuncs="registry.aliyuncs.com/it00021hot"

  • google_gcr="registry.k8s.io/sig-storage"

  • for image in ${image_list\*}

  • do

  • docker image pull {aliyuncs}/{image}

  • docker image tag {aliyuncs}/{image} {google_gcr}/{image}

  • docker image rm {aliyuncs}/{image}

  • echo "{aliyuncs}/{image} {google_gcr}/{image} downloaded."

  • done

#执行脚本进行拉取

复制代码
[root@k8s-master examples]# bash ceph-images.sh

部署 rook operator

复制代码
[root@k8s-master examples]# kubectl create -f crds.yaml -f common.yaml -f operator.yaml

查看 Pod

复制代码
[root@k8s-master examples]# kubectl -n rook-ceph get pod
NAME                                    READY    STATUS    RESTARTS    AGE
rook-ceph-operator-6c54c49f5f-swn5h     1/1      Running   0           5m20s

部署 ceph 集群

复制代码
[root@k8s-master examples]# kubectl create -f cluster.yaml
  • 此步骤需要较长的时间(5 分钟)。
  • 总共需要启动 25 个pod,其中 ceph-osd-prepare 是 job,所以状态是 Completed。

部署 ceph 工具

进入目录

复制代码
[root@k8s-master examples]# cd /root/rook/deploy/example

部署 ceph-tools

复制代码
[root@k8s-master examples]# kubectl apply -f toolbox.yaml

查看 pod

复制代码
[root@k8s-master examples]# kubectl get pod -n rook-ceph
NAME                                                    READY  STATUS    RESTARTS     AGE
csi-cephfsplugin-2c741                                  2/2    Running   1(26m ago)   37m
csi-cephfsplugin-945b7                                  2/2    Running   2(26m ago)   37m
csi-cephfsplugin-krvst                                  2/2    Running   2(26m ago)   37m
csi-cephfsplugin-provisioner-6f5d88b7ff-ghg8h           5/5    Running   5(26m ago)   37m
csi-cephfsplugin-provisioner-6f5d88b7ff-swzfm           5/5    Running   5(26m ago)   37m
csi-rbdplugin-5kz6w                                     2/2    Running   2(26m ago)   37m
csi-rbdplugin-fc5nb                                     2/2    Running   2(26m ago)   37m
csi-rbdplugin-provisioner-57f5ddbd7-8vv71               5/5    Running   5(26m ago)   37m
csi-rbdplugin-provisioner-57f5ddbd7-bz9jv               5/5    Running   5(26m ago)   37m
csi-rbdplugin-s6b25                                     2/2    Running   2(26m ago)   37m
rook-ceph-crashcollector-k8s-master-55f555dc8f-h9qfx    1/1    Running   0            32m
rook-ceph-crashcollector-k8s-node01-58c754c998-54zV2    1/1    Running   1(26m ago)   32m
rook-ceph-crashcollector-k8s-node02-7fd96945d9-55vg8    1/1    Running   1(26m ago)   32m
rook-ceph-mgr-a-7dd565d4dd-lczcb                        3/3    Running   2(26m ago)   37m
rook-ceph-mgr-b-86668b6dcf-fwbbv                        3/3    Running   3(26m ago)   37m
rook-ceph-mon-a-55b48b74d9-7wVg2                        2/2    Running   2(26m ago)   41m
rook-ceph-mon-b-76fd68dc4f-fnkmf                        2/2    Running   2(26m ago)   40m
rook-ceph-mon-c-55df87d96b-swgs4                        2/2    Running   0            37m
rook-ceph-operator-6c54c49f5f-swn5h                     1/1    Running   1(26m ago)   52m
rook-ceph-osd-0-7bb5989fd7-4bjt7                        2/2    Running   2(26m ago)   32m
rook-ceph-osd-1-664dddd5c9-5lg42                        2/2    Running   2(26m ago)   37m
rook-ceph-osd-2-886bcbfb6-qpph4                         2/2    Running   0            9m27s
rook-ceph-osd-prepare-k8s-master-ldz9z                  0/1    Completed 0            9m27s
rook-ceph-osd-prepare-k8s-node01-zkbj9                  0/1    Completed 0            8m55s  
rook-ceph-osd-prepare-k8s-node02-lp7d8                  0/1    Completed 0            8m49s
rook-ceph-tools-598b59df89-gjfvz                        1/1    Running   0            32m

会多出一个名为 rook-ceph-tools 的pod

  • rook-ceph-tools-598b59df89-gjfvz 1/1 Running 0 32m

查看 pod 总数

复制代码
[root@k8s-master examples]# kubectl get pod -n rook-ceph | wc -l
26

登录 rook-ceph-tools

复制代码
[root@k8s-master examples]# kubectl exec -it rook-ceph-tools-598b59df89-gjfvz -n rook-ceph -- bash
#查看 ceph 集群状态
bash-4.4$ ceph -s
  cluster:
    id:    7cd53c0e-4691-4550-8c7a-b2ce7ded9bfe
    health: HEALTH_OK
  services:
    mon:      3 daemons,quorum a,b,c(age 13m)
    mgr:      a(active,since 12m),standbys:b
    osd:      3 osds:3up(since 13m),3in(since 13m)
  data:
    pools:    1 pools,1 pgs
    objects:  2 objects, 449 KiB
    usage:    63 MiB used,180 GiB /180 GiB avail
    pgs:      1 active+clean
#查看 osd 目录树
bash-4.4$ ceph osd tree
ID CLASS WEIGHTT    YPE NAME    STATUS REWEIGHT PRI-AFF
-1       0.17578    root default
-7       0.05859    host k8s-master
 2       0.05859    osd        up      1.00000  1.00000
-3       0.05859    host k8s-node01
 0 hdd   0.05859    osd.0      up      1.00000  1.00000
-5       0.05859    host k8s-node02
 1 hdd   0.05859    osd.1       up     1.00000  1.00000
#查看 osd 存储状态
bash-4.4$ ceph osd status
ID  HOST        USED    AVAIL  WR OPS   WR DATA    RD OPS    RD DATA  STATE
0   k8s-node01  21.0M   59.9G      0       0          0          0    exists,up
1   k8s-node02  21.0M   59.9G      0       0          0          0    exists,up
2   k8s-master  20.6M   59.9G      0       0          0          0    exists,up
#列出 osd 储存池
bash-4.4$ ceph osd pool ls
.mgr

安装 snapshot 控制器

  • 要想实现 PVC 的快照功能,需要 snapshot 控制器,在 kubernetes1.19 版本以上需要单独安装 snapshot 控制器。
  • 如果是 1.19 以下的版本,则不需要单独安装。

软件包下载地址

https://github.com/dotbalo/k8s-ha-install.git

  • git clone
  • 如果已经下载好离线包,直接使用即可

进入安装包目录

复制代码
[root@k8s-master ~]# cd k8s-ha-install/

部署

复制代码
[root@k8s-master k8s-ha-install]# kubectl create -f snapshotter/ -n kube-system

获取 pod 状态

复制代码
[root@k8s-master k8s-ha-install]# kubectl get pod -n kube-system -l app=snapshot-controller
NAME                 READY   STATUS     RESTARTS   AGE
snapshot-controller  1/1     Running    0          4m11s

部署 ceph-dashboard

进入目录

复制代码
[root@k8s-master ~]# cd /root/rook/deploy/example

部署 dashboard

复制代码
[root@k8s-master example]# kubectl create -f dashboard-external-https.yaml

查看 svc

复制代码
[root@k8s-master example]# kubectl get svc -n rook-ceph
NAME                                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)              AGE
rook-ceph-mgr                           ClusterIP  10.107.221.122  <none>        9283/TCP             43m
rook-ceph-mgr-dashboard                 ClusterIP  10.101.196.95   <none>        8443/TCP             43m
rook-ceph-mgr-dashboard-external-https  NodePort   10.111.32.176   <none>        8443:31540/TCP       14s
rook-ceph-mon-a                         ClusterIp  10.102.236.97   <none>        6789/TCP,3300/TCP    52m
rook-ceph-mon-c                         ClusterIp  10.98.200.63    <none>        6789/TCP,3300/TCP    49m

红色的 svc 是原有的 dashboard,要把它删掉。

  • rook-ceph-mgr-dashboard ClusterIP 10.101.196.95 <none> 8443/TCP 43m

绿色部分是我们部署 dashboard 的时候创建出来的。

  • rook-ceph-mgr-dashboard-external-https NodePort 10.111.32.176 <none> 8443:31540/TCP 14s

删除原有的 svc

复制代码
[root@k8s-master example]# kubectl delete svc/rook-ceph-mgr-dashboard -n rook-ceph

获取 ceph-dashboard 的登录密码

复制代码
[root@k8s-master example]# kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
IVSYe1`Ne*6%Mzf@;dzf
  • 账号:admin
  • 密码:IVSYe1`Ne*6%Mzf@;dzf

登录 ceph-dashboard

复制代码
[root@k8s-master example]# kubectl get svc -n rook-ceph
NAME                                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)              AGE
rook-ceph-mgr                           ClusterIP  10.107.221.122  <none>        9283/TCP             43m
rook-ceph-mgr-dashboard-external-https  NodePort   10.111.32.176   <none>        8443:31540/TCP       14s
rook-ceph-mon-a                         ClusterIp  10.102.236.97   <none>        6789/TCP,3300/TCP    52m
rook-ceph-mon-c                         ClusterIp  10.98.200.63    <none>        6789/TCP,3300/TCP    49m
  • 31540

浏览器访问地址

  • 可以在此处做一个快照,方便后续重复实验

Ceph 块存储的使用

  • 一般是一个 Pod 挂载一个块存储,相当于一个服务器新挂了一个磁盘,只给一个应用使用
  • 比如中间件服务 MySQL、RabbitMQ、Redis 等。

首先进入 Ceph 的代码目录,找到 RBD 目录的 storageclass 配置

复制代码
[root@k8s-master ~]# cd /root/rook/deploy/examples/csi/rbd

根据需求修改对应参数

复制代码
[root@k8s-master rbd]# vim storageclass.yaml
    replicated:
      size: 2
  • 此处主要修改的是副本数,在生产环境中,副本数至少为3,且不能超过 0SD 的数量。
  • 此处为实验环境,本案例设置为2。

创建 StorageClass 和存储池

复制代码
[root@k8s-master rbd]# kubectl create -f storageclass.yaml -n rook-ceph

查看创建结果

复制代码
[root@k8s-master rbd]# kubectl get cephblockpool -n rook-ceph
NAME            PHASE
replicapool     Ready

获取 sc 结果

复制代码
[root@k8s-master rbd]# kubectl get sc
NAME               PROVISIONER                    RECLAIMPOLICY VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-block    rook-ceph.rbd.csi.ceph.com     Delete        Immediate            true                 39s
  • 这里创建的 storageclass 的名字为rook-ceph-b1ock,在创建 PVC的时候指定这个名字即可让 PVC 和这个存储关联起来。

通过 Ceph Dashboard 查看

挂载测试

进入目录

复制代码
[root@k8s-master ~]# cd /root/rook/deploy/example

#rook 自带了一个 MySQL 的测试样例

创建一个 MySQL 服务使用该存储

复制代码
[root@k8s-master example]# vim mysql.yaml
apiVersion: v1
  kind: service
metadata:
  name: wordpress-mysql
  labels:
  app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIp: None
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  ##PVC 的名字
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  ##此处要的名字要关联前面创建的StorageClass
  storageClassName: rook-ceph-block
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      ##实验环境设置的可以小一点
      storage: 10Gi
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
  app: wordpress
  tier: mysql
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
        - image: mysql:5.6
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: changeme
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumes:
        - name:mysql-persistent-storage
          persistentVolumeClaim:
            ##对应前面的 PVC 名字
            claimName: mysql-pv-claim
  • 这个文件中有一段 PVC 的配置,该 PVC 会连接刚才创建的 storageclass,然后动态创建 PV供 Pod 使用,之后如果有其他的存储需求,只需要创建 PVc指定 storageclassName 为刚才创建的Storageclass 名称即可连接到 Rook的ceph。
  • 如果是 statefulset,只需要将volumeTemplateclaim 里面的 Claim 名称改为 Storageclass 名称即可动态地为每个 Pod 创建个单独的 PV。

将文件创建出来

复制代码
[root@k8s-master example]# kubectl create -f mysql.yaml

查看创建的 PVC 和 PV

  • 因为 MySQL 的数据不允许多个 MySQL 实例连接同一个存储,所以一般只能用块存储。

  • 相当于新加了一块盘给 MySQL 使用。

  • 创建完成后可以査看创建的 PVC 和 PV。

    [root@k8s-master examples]# kubectl get pvc
    NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    mysql-pv-claim Bound pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 20Gi RWO rook-ceph-block 12m

    [root@k8s-master examples]# kubectl get pv
    NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASONAGE AGE
    pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 10Gi RWO Delete Bound default/mysql-pv-claim rook-ceph-block 12m

Ceph Dashboard 上查看对应的 Image

查看 pod 中的卷

复制代码
[root@k8s-master examples]# kubectl get pod
NAME                                READY    STATUS    RESTARTS    AGE
wordpress-mysq1-79966d6c5b-htnbl    1/1      Running   0           12m

登入卷中并查看利用率

复制代码
[root@k8s-master examples]# kubectl exec -it wordpress-mysql-79966d6c5b-htnbl --df -Th
Filesystem                    Type    Size Used Avail Use% Mounted on
overlay                       overlay 194G18G 177G    10% /
tmpfs                         tmpfs    64M    0    64M    0% /dev
tmpfs                         tmpfs    1.9G   0    1.9G   0% /sys/fs/cgroup
/dev/mapper/centos-root xfs   194G      18G    177G    10%    /etc/hosts
shm                           tmpfs    64M    0    0%    /dev/shm
/dev/rbd0                     ext4     9.8G    116M    9.7G    2%    /var/lib/mysql
tmpfs                         tmpfs    3.7G    12k    1.7G    1%
/run/secrets/kubernetes.io/serviceaccount
tmpfs                        tmpfs    1.9G    0     1.9G    0% /proc/acpi
tmpfs                        tmpfs    1.9G    0     1.9G    0% /proc/scsi
tmpfs                        tmpfs    1.9G    0     1.9G    0% /sys/firmware

statfulset volumeclaimTemplates

  • 之前的章节提到过 StatfulSet 用于有状态的应用部署,在实际使用时,可以很方便地利用StatfulSet 创建一个 Eureka 集群、Redis 集群或者其他集群。
  • 使用 statfulset 创建应用时会给每个 Pod 创建一个固定的标识符比如 redis-0、 redis-1等。
  • 根据 Statfulset 的特性,可以很方便地组建一个集群,但是需要注意的是,受 statfulset管理的 Pod 可能每个 Pod 都需要自己独立的存储,并非和其他 Pod 共享数据。

用一个简单的示例介绍 volumeclaimTemplates 的使用

编辑示例文件

#volumeClaimTemplates 没有提供样例文件,需要自己编辑

复制代码
[root@k8s-master examples]# vim volumeClaimTemplates.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
  matchLabels:
    app: nginx #has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodseconds: 10
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
    volumeClaimTemplates:
    - metadata:
        name: www
       spec:
         accessModes: [ "ReadWriteOnce" ]
         storageClassName: "rook-ceph-block"
         resources:
           requests:
             storage: lGi
  • name: www ##和 volume 的 name 类似,通过 volumeMounts 指定该名字挂载到 pod accessModes: "ReadWriteOnce" ##访问模式
  • storageClassName: "rook-ceph-block" ##Storageclass名字
  • resources: 存储配置##
  • 超过 terminationGracePeriodseconds 等待时间后,K8S会强制结束老 POD

创建 StatefulSet

复制代码
[root@k8s-master examples]# kubectl create -f volumeClaimTemplates.yaml

获取 pod 状态

复制代码
[root@k8s-master examples]# kubectl get pod -l app=nginx
NAME        READY    STATUS    RESTARTS    AGE
web-0       1/1      Running   0           38s
web-1       1/1      Running   0           29s
web-2       1/1      Running   0           9s

获取 pvc 状态

复制代码
[root@k8s-master examples]# kubectl get pvc
NAME                STATUS    VOLUME                                    CAPACITY    ACCESS    MODES    STORAGECLASS    AGE
mysql-pv-claim      Bound     pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8   20Gi        ROW    rook-ceph-block    53m
www-web-0           Bound     pvc-57c8626d-a370-4345-abf3-d212465b5635   1Gi        ROW    rook-ceph-block    53s
www-web-1           Bound     pvc-4ea4b53f-acab-4731-aa7d-bb4470c35c42   1Gi        ROW    rook-ceph-block    33s
www-web-2           Bound     pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611   1Gi        ROW    rook-ceph-block    33s
  • 此时,3个Pod 分别有了自己的存储数据互不共享,在使用 statefulset 建立 Redis、MySQL、RabbitM0 集群时,如果需要持久化数据,就需要使用 volumeclaimTemplates 参数为每个 Pod 提供存储。

共享型文件系统的使用

  • 一般用于多个 Pod 共享一个存储,比如用户上传的头像、需要被多个前端访问

创建共享型文件系统

  • 与块存储类似,也需要创建共享型文件存储的 poo1。

进入目录

复制代码
[root@k8s-master ~]# cd /root/rook/deploy/examples

为共享型文件系统创建 poo1

复制代码
[root@k8s-master examples]# kubectl create -f filesystem.yaml

查看 pod 启动状态

  • 由于文件存储需要使用 metadata server 存储元数据,因此创建完成后会启动 mds 容器,需要等待 mds 容器启动后才可以创建 PV。

    [root@k8s-master examples]# kubectl get pod -n rook-ceph -l app=rook-ceph-mds
    NAME READY STATUS RESTARTS AGE
    rook-ceph-mds-myfs-a-d4bfd947f-t8cjc 2/2 Running 0 6m26s
    rook-ceph-mds-myfs-b-85798855d6-sjx5d 2/2 Running 0 6m25s

在 Ceph dashboard 刷新查看

创建共享型文件系统的 StorageClass

  • 文件存储也需要一个 storageclass 动态创建 PV。

进入目录

复制代码
[root@k8s-master ~]# cd /root/rook/deploy/examples/csi/cephfs

将文件创建出来

复制代码
[root@k8s-master examples]# kubectl create -f storageclass.yaml
  • 之后将 PVC 的 storageclassName 设置成 rook-cephfs 即可创建共享文件类型的存储(指向块存储的 storageclass 即为创建块存储),可以供多个 Pod 共享数据。

挂载测试

进入目录

复制代码
[root@k8s-master ~]# cd /root/rook/deploy/examples/csi/cephfs

创建一个 pod 挂载测试

复制代码
#rook 提供了此测试样例
[root@k8s-master cephfs]# cat kube-registry.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cephfs-pvc
  namespace: kube-system
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: rook-cephfs
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-registry
  namespace: kube-system
  labels:
    k8s-app: kube-registry
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 3
  selector:
    matchLabels:
      k8s-app: kube-registry
  template:
    metadata:
      labels:
        k8s-app: kube-registry
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
        - name: registry
          image: registry:2
          imagePullPolicy: Always
          resources:
            limits:
              cpu: 100m
              memory: 100Mi
          env:
            # Configuration reference: https://docs.docker.com/registry/configuration/
            - name: REGISTRY_HTTP_ADDR
              value: :5000
            - name: REGISTRY_HTTP_SECRET
              value: "Ple4seCh4ngeThisN0tAVerySecretV4lue"
            - name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY
              value: /var/lib/registry
          volumeMounts:
            - name: image-store
              mountPath: /var/lib/registry
          ports:
            - containerPort: 5000
              name: registry
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: registry
          readinessProbe:
            httpGet:
              path: /
              port: registry
      volumes:
        - name: image-store
          persistentVolumeClaim:
            claimName: cephfs-pvc
            readOnly: false
  • volumeMounts:
    • name: image-store
  • mountPath: /var/lib/registry
  • volumes:
    • name: image-store
  • persistentVolumeClaim:
  • claimName: cephfs-pvc
  • readOnly: false

将文件创建出来

复制代码
[root@k8s-master cephfs]# kubectl create -f kube-registry.yaml

获取 pod 状态信息

复制代码
[root@k8s-master examples]# kubectl get pod -n rook-ceph -l app=rook-ceph-mds
NAME                                READY   STATUS    RESTARTS   AGE
kubectl-registry-5b677b6c87-fxltv   1/1     Running   0          2m30s      
kubectl-registry-5b677b6c87-1hkfr   1/1     Running   0          2m30s
kubectl-registry-5b677b6c87-sbzs4   1/1     Running   0          2m30s

获取 pvc 状态信息

复制代码
[root@k8s-master examples]# kubectl get pvc -n kube-system
NAME          STATUS    VOLUME                                     CAPACITY   ACCESS    MODES    STORAGECLASS    AGE
cephfs-pvc    Bound     pvc-d025b469-3d30-4a45-b7bb-e62abgbf21e8    1Gi       RWX       rook-cephfs    2m56s     
  • 此时一共创建了3个 Pod,这3个 Pod 共用一个存储,并都挂载到了/var/lib/registry,该目录中的数据由3个容器共享。

PVC 扩容

扩容块存储

查看当前容量

复制代码
[root@k8s-master examples]# kubectl get pvc -n kube-system
NAME              STATUS    VOLUME                                     CAPACITY   ACCESS    MODES    STORAGECLASS    AGE
mysql-pv-claim    Bound     pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8    1Gi       RWO       rook-ceph-block          78m
www-web-0         Bound     pvc-57c8626d-a370-4345-abf3-d212465b5635    1Gi       RWO       rook-ceph-block          26m
www-web-1         Bound     pvc-57c8626d-a370-4345-abf3-d212465b5635    1Gi       RWO       rook-ceph-block          25m
www-web-2         Bound     pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611    1Gi       RWO       rook-ceph-block          24m
  • mysql-pv-claim Bound pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 1Gi RWO rook-ceph-block

扩容

复制代码
[root@k8s-master ~]# kubectl edit pvc mysql-pv-claim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes
    pv.kubernetes.io/bound-by-controller: "yes
    volume.beta.kubernetes.io/storage-provisioner: rook-ceph.rbd.csi.ceph.com
    volume.kubernetes.io/storage-provisioner: rook-ceph.rbd.csi.ceph.com
  creationTimestamp: "2023-07-23T00:52:41Z"
  finalizers:
  - kubernetes.io/pvc-protection
  labels:
    app: wordpress
  name: mysql-pv-claim
  namespace: default
  resourceVersion: "34451"
  uid: d8ae6350-186a-4deb-b301-ed7a7a71e9b8
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      ##修改为 15G,原来是 10G,总共分配的大小
      storage: 15Gi
  storageclassName:rook-ceph-block
  volumeMode: Filesystem
  volumeName: pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8
status:
  accessModes:
  - ReadWriteonce
  capacity:
    ##修改为 15G,原来是 10G,允许访问的大小
    storage:15Gi
  phase: Bound
  • 保存退出后会同步更新

查看 PVC 修改结果

复制代码
[root@k8s-master examples]# kubectl get pvc -n kube-system
NAME              STATUS    VOLUME                                     CAPACITY   ACCESS    MODES    STORAGECLASS    AGE
mysql-pv-claim    Bound     pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8    15Gi      RWO       rook-ceph-block          89m
www-web-0         Bound     pvc-57c8626d-a370-4345-abf3-d212465b5635    1Gi       RWO       rook-ceph-block          26m
www-web-1         Bound     pvc-57c8626d-a370-4345-abf3-d212465b5635    1Gi       RWO       rook-ceph-block          25m
www-web-2         Bound     pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611    1Gi       RWO       rook-ceph-block          24m
  • mysql-pv-claim Bound pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 15Gi RWO rook-ceph-block 89m

查看 PV 扩容结果

复制代码
[root@k8s-master examples]# kubectl get pvc
NAME                                        STATUS    VOLUME  CAPACITY  ACCESS    MODES                   STORAGECLASS        AGE
pvc-4ea4b53f-acab-4731-aa7d-bb4470c35c42    1Gi        RWO    Delete    Bound    default/www-web-1        rook-ceph-block    37m
pvc-57c8626d-a370-4345-abf3-d212465b5635    1Gi        RWO    Delete    Bound    default/www-web-0        rook-ceph-block    38m
pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611    1Gi        RWO    Delete    Bound    default/www-web-2        rook-ceph-block    37m
pvc-d025b469-3d30-4a45-b7bb-e62ab8bf21e8    1Gi        RWO    Delete    Bound    default/www-web-1        rook-ceph-block    37m
pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8    15Gi       RWO    Delete    Bound    default/mysql-pv-claim   rook-ceph-block    90m
  • pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 15Gi RWO Delete Bound default/mysql-pv-claim rook-ceph-block 90m

查看 Ceph Dashboard

获取 pod 状态信息

复制代码
[root@k8s-master ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
web-0                                1/1     Running   0          2m30s      
web-1                                1/1     Running   0          2m30s
web-2                                1/1     Running   0          2m30s
wordpress-mysq1-79966d6c5b-wltpg     1/1     Running   0          115m
  • wordpress-mysq1-79966d6c5b-wltpg 1/1 Running 0 115m

查看容器中的扩容结果

复制代码
[root@k8s-master ~]# kubectl exec -it wordpress-mysql-79966d6c5b-wltpq -- df -Th
File                        Type        Size    Used    Avail    Use%    Mounted on
overlay                     overlay     194G    20G     175G     11%     /
tmpfs                       tmpfs       64M     0       64M      0%      /dev
tmpfs                       tmpfs       1.9G    0       1.9G     0%      /sys/cgroup
/dev/mapper/centos-root     xfs         194G    20G     175G     11%     /etc/hosts
shm                         tmpfs       64M     0        64M     0%      /dev/shm
/dev/rbd0                   ext4        15G     116M    30G       1%    /var/lib/mysql
tmpfs                        =tmpfs     3.7G    12K     3.7G      1%    /run/secrets/kubernetes.io/serviceaccount
tmpfs                        tmpfs      1.9G    0       1.9G     0%    /proc/acpi
tmpfs                        tmpfs      1.9G    0       1.9G     0%    /proc/scsi
tmpfs                        tmpfs      1.9G    0       1.9G     0%    /sys/firmware

扩容文件共享型 PVC

获取之前创建的文件共享型 PVC

复制代码
[root@k8s-master ~]# kubectl get pvc -n kube-system
NAME    STATUS   VOLUME                                       CAPACITY   ACCESS    MODES    STORAGECLASS AGE
MODES   Bound    pvc-d025b469-3d30-4a45-b7bb-e62ab8bf21e8      1Gi       RWX      rook-cephfs    25m

修改大小

保存退出后自动更新

  • requests:
  • storage: 2Gi #提供的大小
  • capacity:
  • storage: 2Gi #提供的大小

查看修改后的 PVC 大小

复制代码
[root@k8s-master examples]# kubectl get pvc -n kube-system
NAME          STATUS    VOLUME                                     CAPACITY   ACCESS    MODES    STORAGECLASS    AGE
cephfs-pvc    Bound     pvc-d025b469-3d30-4a45-b7bb-e62abgbf21e8    2Gi       RWX       rook-cephfs    2m56s     

查看修改后的 PV 大小

复制代码
[root@k8s-master examples]# kubectl get pvc
NAME                                        STATUS    VOLUME  CAPACITY  ACCESS    MODES                   STORAGECLASS        AGE
pvc-4ea4b53f-acab-4731-aa7d-bb4470c35c42    1Gi        RWO    Delete    Bound    default/www-web-1        rook-ceph-block    37m
pvc-57c8626d-a370-4345-abf3-d212465b5635    1Gi        RWO    Delete    Bound    default/www-web-0        rook-ceph-block    38m
pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611    1Gi        RWO    Delete    Bound    default/www-web-2        rook-ceph-block    37m
pvc-d025b469-3d30-4a45-b7bb-e62ab8bf21e8    2Gi        RWO    Delete    Bound    default/www-web-1        rook-ceph-block    37m
pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8    15Gi       RWO    Delete    Bound    default/mysql-pv-claim   rook-ceph-block    90m
  • pvc-d025b469-3d30-4a45-b7bb-e62ab8bf21e8 2Gi RWO Delete Bound default/www-web-1 rook-ceph-block 37m

查看容器中的扩容结果

复制代码
[root@k8s-master examples]# kubectl get pod -n rook-ceph -l app=rook-ceph-mds
NAME                                READY   STATUS    RESTARTS   AGE
kubectl-registry-5b677b6c87-fxltv   1/1     Running   0          41m      
kubectl-registry-5b677b6c87-1hkfr   1/1     Running   0          41m
kubectl-registry-5b677b6c87-sbzs4   1/1     Running   0          41m

[root@k8s-master ~]# kubectl exec -it wordpress-mysql-79966d6c5b-wltpq -- df -Th
Filesystem                  Type        Size    Used    Avail    Use%    Mounted on
overlay                     overlay     193.9G  14.5G   179.4G   7%      /
tmpfs                       tmpfs       64M     0       64M      0%      /dev
tmpfs                       tmpfs       1.9G    0       1.9G     0%      /sys/cgroup

/dev/mapper/centos-root     xfs         193.9G  14.5G   179.4G   7%     /etc/hosts
/dev/mapper/centos-root     xfs         193.9G  14.5G   179.4G   7%     /etc/resolv.conf
/dev/mapper/centos-root     xfs         193.9G  14.5G   179.4G   7%     /etc/hostname
/dev/mapper/centos-root     xfs         193.9G  14.5G   179.4G   7%     /etc/hosts
shm                         tmpfs       64.0M    0    64.0M      0%     /dev/shm    10.98.200.63:6789,10.102.236.97:6789,10.107.235.178:6789:/volumes/csi/csi-vo1-04cde2de-7b3a-44fb-a41a-785d9c7c13e1/53f34b26-8568-4308-be57-6053276a5f99    ceph    2.0G    0    2.0G    0%    /var/lib/registry

shm                         tmpfs       64M     0        64M     0%      /dev/shm
/dev/rbd0                   ext4        15G     116M    30G       1%    /var/lib/mysql
tmpfs                        =tmpfs     3.7G    12K     3.7G      1%    /run/secrets/kubernetes.io/serviceaccount
tmpfs                        tmpfs      1.9G    0       1.9G     0%    /proc/acpi
tmpfs                        tmpfs      1.9G    0       1.9G     0%    /proc/scsi
tmpfs                        tmpfs      1.9G    0       1.9G     0%    /sys/firmware
  • ceph 2.0G 0 2.0G 0% /var/lib/registry

PVC 快照

  • PVC快照功能和使用云服务器或者虚拟机的快照功能类似,可以针对存储某一刻的状态进行个快照,无论数据出现严重丢失或者其他情况,都可以回滚数据。

进入目录

复制代码
[root@k8s-master ~]# cd /root/rook/deploy/examples/csi/rbd

创建文件

复制代码
[root@k8s-master rbd]# kubectl create -f snapshotclass.yaml

创建快照

  • 首先在之前创建的 MySQL 容器中创建一个文件夹,并创建一个文件。

查看之前创建的 MySQL

复制代码
[root@k8s-master ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
web-0                                1/1     Running   0          95m      
web-1                                1/1     Running   0          94m
web-2                                1/1     Running   0          93m
wordpress-mysq1-79966d6c5b-wltpg     1/1     Running   0          148m

登录 MysQL 容器创建测试用的文件

复制代码
[root@k8s-master rbd]# kubectl exec -it wordpress-mysql-79966d6c5b-wltpq -- bash
root@wordpress-mysq1-79966d6c5b-wltpg:/#ls
bin boot dev docker-entrypoint-initdb.d entrypoint.sh etcliblib64homemedia mnt opt proc rootrunsbinsrvsys tmp usr var
root@wordpress-mysq1-79966d6c5b-wltpq:/#cd /var/lib/mysql
root@wordpress-mysq1-79966d6c5b-wltpq:/var/lib/mysql# mkdir test snapshot
root@wordpress-mysq1-79966d6c5b-wltpq:/var/lib/mysql# cd test _snapshot/
root@wordpress-mysq1-79966d6c5b-wltpq:/var/lib/mysql/test snapshot# echo"testfor snapshot">test snapshot01.txt

修改 snapshot.yaml 文件

  • 指定为哪个 PVC 创建快照

    [root@k8s-master examples]# kubectl get pvc
    NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    mysql-pv-claim Bound pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 15Gi RWO rook-ceph-block 152m
    www-web-0 Bound pvc-57c8626d-a370-4345-abf3-d212465b5635 1Gi RWO rook-ceph-block 26m
    www-web-1 Bound pvc-57c8626d-a370-4345-abf3-d212465b5635 1Gi RWO rook-ceph-block 25m
    www-web-2 Bound pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611 1Gi RWO rook-ceph-block 24m

  • mysql-pv-claim Bound pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 15Gi RWO rook-ceph-block 152m

创建文件

复制代码
[root@k8s-master rbd]# vim snapshot.yaml
---
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: rbd-pvc-snapshot
spec:
  volumeSnapshotClassName: csi-rbdplugin-snapclass
  source:
    persistentVolumeClaimName: mysql-pv-claim
  • persistentVolumeClaimName: mysql-pv-claim #修改为需要做快照的 PVC

创建快照

复制代码
[root@k8s-master rbd]# kunectl create -f snapshot.yaml

查看快照结果

复制代码
[root@k8s-master rbd]# kunectl get volumesnapshot
NAME                        READYTOUSE    SOURCEPVC        SOURCESNAPSHOTCONTENT    RESTORSIZE    SNAPSHOTCLASS    SNAPSHOTCONTENT    CREATIONTIME    AGE
rbd-pvc-snapshot            true          mysql-pv-claim    15Gi
csi-rbdplugin-snapclass     snapcontent-1f6a8a49-1f78-4def-a998-f4353a964fb3        18s        18s
  • true

恢复快照

使用快照恢复数据

复制代码
[root@k8s-master rbd]# vim pvc-restore.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc-restore
spec:
  storageClassName: rook-ceph-block
  dataSource:
    name: rbd-pvc-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  • torageclassName: rook-ceph-block 新建 PVC的 StorageClasss
  • dataSource: 快照名称
  • storage: 20Gi 大小不能小于原来的值

执行恢复动作

复制代码
[root@k8s-master rbd]# kubectl create -f pvc-restore.yaml

查看结果

复制代码
[root@k8s-master examples]# kubectl get pvc
NAME              STATUS    VOLUME                                     CAPACITY   ACCESS    MODES    STORAGECLASS  AGE
mysql-pv-claim    Bound     pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8    15Gi      RWO        rook-ceph-block       152m
rbd-pvc-restore   Bound     pvc-e3fc4194-ee54-4682-954e-496d5d4c92f1    20Gi      RWO        rook-ceph-block       152m
www-web-0         Bound     pvc-57c8626d-a370-4345-abf3-d212465b5635    1Gi       RWO       rook-ceph-block        26m
www-web-1         Bound     pvc-57c8626d-a370-4345-abf3-d212465b5635    1Gi       RWO       rook-ceph-block        25m
www-web-2         Bound     pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611    1Gi       RWO       rook-ceph-block        24m
  • rbd-pvc-restore Bound pvc-e3fc4194-ee54-4682-954e-496d5d4c92f1 20Gi RWO rook-ceph-block 152m

检查快照的数据

创建容器

  • 创建一个容器,挂载用快照恢复的PVC,并查看里面我们创建的文件

    [root@k8s-master examples]# vim restore-check-snapshot-rbd.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: check-snapshot-restore
    spec:
    selector:
    matchLabels:
    app: check
    strategy:
    type: Recreate
    template:
    metadata:
    labels:
    app: check
    spec:
    containers:
    - image: alpine:3.8
    name: check
    command:
    - sh
    - -c
    - sleep 36000
    volumeMounts:
    - name: check-mysql-persistent-storage
    mountPath: /mnt
    volumes:
    - name: check-mysql-persistent-storage
    persistentVolumeClaim:
    claimName: rbd-pvc-restore

将文件创建出来

复制代码
[root@k8s-master examples]# kubectl create -f restore-check-snapshot-rbd.yaml

查看结果

复制代码
[root@k8s-master ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
check-snapshot-restore-6df758bdd6-srjg2 1/1  Running   0          38s
web-0                                1/1     Running   0          95m      
web-1                                1/1     Running   0          94m
web-2                                1/1     Running   0          93m
wordpress-mysq1-79966d6c5b-wltpg     1/1     Running   0          148m

登入容器

复制代码
[root@k8s-master ~]# kubectl exec -it check-snapshot-restore-6df758bdd6-srjg2 -- sh
/ # cat /mnt/test_snapshot/test_snapshot01.txt
test for snapshot

PVC 克隆

  • 和虚拟机类似,PVC也支持克隆,可以基于某个 PVC 复制出一个一模一样数据的新的 PVC。

查看当前在那个目录下

复制代码
[root@k8s-master rbd]# pwd
/root/rook/deploy/example/csi/rbd

创建克隆

复制代码
[root@k8s-master rbd]# vim pvc-clone.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc-clone
spec:
  storageClassName: rook-ceph-block
  dataSource:
    name: mysql-pv-claim
    kind: PersistentVolumeClaim
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 15Gi
  • datasource 的 name 是被克隆的 PVC 的名字,在此是 mysql-pv-claim
  • StorageclassName 是新建的 PVC 的 Storageclass 名称
  • Storage 大小不能小于之前的 PVC 的大小

开始克隆

复制代码
[root@k8s-master rbd]# kubectl create -f pvc-clone.yaml

获取 pvc 状信息

复制代码
[root@k8s-master examples]# kubectl get pvc
NAME              STATUS    VOLUME                                     CAPACITY   ACCESS    MODES    STORAGECLASS  AGE
rbd-pvc-clone     Bound     pvc-ba6a9657-394a-42c3-8382-6d2178493649    15Gi      RWO        rook-ceph-block       37s
mysql-pv-claim    Bound     pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8    15Gi      RWO       rook-ceph-block       152m
rbd-pvc-restore   Bound     pvc-e3fc4194-ee54-4682-954e-496d5d4c92f1    20Gi      RWO        rook-ceph-block       152m
www-web-0         Bound     pvc-57c8626d-a370-4345-abf3-d212465b5635    1Gi       RWO       rook-ceph-block        26m
www-web-1         Bound     pvc-57c8626d-a370-4345-abf3-d212465b5635    1Gi       RWO       rook-ceph-block        25m
www-web-2         Bound     pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611    1Gi       RWO       rook-ceph-block        24m
  • rbd-pvc-clone Bound pvc-ba6a9657-394a-42c3-8382-6d2178493649 15Gi RWO rook-ceph-block 37s

小阿轩yx-云原生存储Rook部署Ceph

相关推荐
2035去旅行6 小时前
bootcmd 详细讲解
linux·嵌入式·arm·soc
陈希1237 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡7 小时前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
且从容.11 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道11 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
且从容.14 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落16 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨16 小时前
WSL2的安装与使用
linux·wsl
微小的鱼16 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng16 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器