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

news2024/11/15 15:58:23

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SprinBoot+Vue图书馆预约与占座微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

“Flash闪存”介绍 及 “SD NAND Flash”产品的测试含例程

文章目录 前言一、“FLASH闪存”是什么&#xff1f;1. 简介2. 特点3. 未来发展 二、SD NAND Flash1. 概述2. 特点3. 引脚分配4. 数据传输模式5. SD NAND寄存器6. 通电图7. 参考设计 三、STM32测试例程1. 初始化2. 但数据块测试3. 多数据块测试4. 状态缓冲 前言 本篇除了对flas…

Java JVM 垃圾回收算法详解

Java 虚拟机&#xff08;JVM&#xff09;是运行 Java 应用程序的核心&#xff0c;它的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制是 JVM 中非常重要的一个部分。垃圾回收的主要任务是自动管理内存&#xff0c;回收那些不再被使用的对象&#xff0c;从而释放内…

VOCs将纳入征税,LDAR系统的排放量计算准确度将要求更加规范,VOCs排放量计算准确度会更加重视,直接影响到税费

笔者见过很多不同公司的LDAR管理系统以及和很多检测公司技术人员沟通&#xff0c;部分技术人员在排放量计算方面尽然不知道中间点等关键要素&#xff0c;有的系统计算排放量不考虑中间点算法、有的计算一年四轮次检测 每轮都是独立计算和上轮检测数据没有任何关系&#xff08;这…

YOLOv8改进实战 | 引入多维协作注意模块MCA,实现暴力涨点

YOLOv8专栏导航&#xff1a;点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习&#xff0c;并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8是一种尖端的、最先进的 (SOTA)…

Windows安装anaconda注意事项及jupyter notebook更换目录

anaconda的介绍就不罗嗦了&#xff0c;既然准备安装了&#xff0c;说明你已经有所了解了。直入主题&#xff0c;Anaconda官网下载&#xff0c;实在太慢&#xff0c;可到https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/下载&#xff0c;注意&#xff0c;这是清华镜像站…

Mysql中的锁机制详解

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除了传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决…

新电脑Win11系统想要降级为Win10怎么操作?

前言 现在的电脑大部分都是Windows 11系统&#xff0c;组装机还好一些&#xff0c;如果想要使用Windows 10&#xff0c;只需要在安装系统的时候选择Windows 10镜像即可。 但是对于新笔记本、厂商的成品机、一体机来说&#xff0c;只要是全新的电脑&#xff0c;基本上都是Wind…

黑马JavaWeb开发笔记14——Tomcat(介绍、安装与卸载、启动与关闭)、入门程序解析(起步依赖、SpringBoot父工程、内嵌Tomcat)

文章目录 前言一、Web服务器-Tomcat1. 简介1.1服务器概述1.2 Web服务器1.3 Tomcat 2. 基本使用2.1 下载2.2 安装与卸载2.3 启动与关闭2.4 常见问题 二、入门程序解析1. 起步依赖2. SpringBoot父工程3. 内嵌Tomcat 总结 前言 本篇文章是2023年最新黑马JavaWeb开发笔记14&#x…

[Java]SpringBoot登录认证流程详解

登录认证 登录接口 1.查看原型 2.查看接口 3.思路分析 登录核心就是根据用户名和密码查询用户信息,存在则登录成功, 不存在则登录失败 4.Controller Slf4j RestController public class LoginController {Autowiredprivate EmpService empService;/*** 登录的方法** param …

【Python】一文详细向您介绍 bisect_left 函数

【Python】一文详细向您介绍 bisect_left 函数 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#x…

shell脚本1----编程规范与变量

shell脚本 shell的功能 Shell&#xff08;壳程序&#xff09;是一个特殊的应用程序&#xff0c;它介于操作系统内核与用户之间&#xff0c;充当了一个“命令解释器”的角色&#xff0c;负责接收用户输入的操作指令&#xff08;命令&#xff09;并进行解释&#xff0c;将需要执…

(前端)面试300问之(3)this的指向判断

一、this的相关理解与解读 1、各角度看this。 1&#xff09;ECMAScript规范&#xff1a; this 关键字执行为当前执行环境的 ThisBinding。 2&#xff09;MDN&#xff1a; In most cases, the value of this is determined by how a function is called. 在绝大多数情况下&…

图片损坏,如何修复?

在数字化时代&#xff0c;图片已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;有时我们可能会遇到图片损坏的情况&#xff0c;无论是珍贵的家庭照片、工作文档中的关键图像&#xff0c;还是社交媒体上的分享内容&#xff0c;图片损坏都可能带来不小的困扰。那么…

网络传输加密及openssl使用样例(客户端服务器)

文章目录 背景常用加密方式SSLOpenSSL主要功能 库结构 交互流程证书生成生成 RSA 私钥私钥的主要组成部分私钥的格式 创建自签名证书: 签发证书服务器端代码客户端代码常见错误版本问题证书问题证书格式 背景 网络传输中为保证数据安全&#xff0c;通常需要加密 常用加密方式…

Open3D 基于曲率大小的特征点提取

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 三、实现效果 3.1原始点云 3.2提取特征点 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 基于曲率…

STM32 外部中断(EXTI)

STM32 外部中断(EXTI) 实验&#xff1a;配置一个引脚的下降沿作为外部中断。 参考&#xff1a;江协科技 相关缩写 RCC(Reset and Clock Control) 复位和时钟控制 GPIO(General Purpose Input/Output) 通用输入/输出 AFIO(Alternate Function Input Output) 复用功能输入输…

6.Lab five —— Lazy Page Allocation

首先先切换到lazy分支 git checkout lazy make clean Xv6应用程序使用sbrk()系统调用向内核请求堆内存。sbrk()分配物理内存并将其映射到进程的虚拟地址空间。内核为一个大请求分配和映射内存可能需要很长时间。为了提高效率&#xff0c;故采用懒分配的策略 Eliminate alloc…

Scratch在线玩:3D地铁跑酷

小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! 作品介绍&#xff1a; 欢迎体验在 Scratch 上重新制作的 3D 地铁跑酷游戏&#xff01;这款游戏完全采用 3D 技术打造&#xff0c;带来流畅的视觉效果和出色的游戏体验。游戏的目标是避免列车和障碍物&#xff0c;同…

力扣 1419. 数青蛙

力扣 1419. 数青蛙 1. 题目 2. 思路 本题就是一道 字符串模拟题&#xff1b; 题目说到了&#xff0c; 会混杂着青蛙的叫声&#xff0c; 如果字符串 croakOfFrogs 不是由若干有效的 “croak” 字符混合而成&#xff0c;请返回 -1, 那就是说如果有多余的 c, r, o等等, 比如 &quo…