小阿轩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

浏览器访问地址

  • https://192.168.10.101: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 查看

  • https://192.168.10.101:31540

挂载测试

进入目录

[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

  • https://192.168.10.101:31540

查看 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 刷新查看

  • https://192.168.10.101:31540

创建共享型文件系统的 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

  • https://192.168.10.101:31540

获取 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

修改大小

  • 之前是 1G,此处改为 2G
[root@k8s-master ~]# kubectl edit pvc cephfs-pvc -n kube-system
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.cephfs.csi.ceph.com
    volume.kubernetes.io/storage-provisioner: rook-ceph.cephfs.csi.ceph.com
    creationTimestamp: "2023-07-23T02:04:49Z"
    finalizers:
    - kubernetes.io/pvc-protectionname: cephfs-pvc
    namespace: kube-system
    resourceVersion: "42320'
    uid: d025b469-3d30-4a45-b7bb-e62ab8bf21e8
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      ##提供的大小
      storage:2Gi
      storageclassName: rook-cephfs
      volumeMode: Filesystem
      volumeName: pvc-d025b469-3d30-4a45-b7bb-e62ab8bf21e8
status:
  accessModes:
  - ReadWriteMany
  capacity:
    ##允许访问的大小
    storage: 2Gi
  phase: Bound

保存退出后自动更新

  • 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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值