云原生存储Rook部署Ceph

news2024/12/23 15:22:27

        Rook 是一款云原生存储编排服务工具,Ceph 是一种广泛使用的开源分布式存储方案,通过Rook 可以大大简化 ceph 在 Kubernetes 集群中的部署和维护工作。
        Rook 由云原生计算基金会( CNCF )孵化,且于 2020 年 10 月正式进入毕业阶段。Rook 并不直接提供数据存储方案,而是集成了各种存储解决方案,并提供一种自管理、自扩容、自修复的云原生存储服务。社区官方资料显示, Rook 目前最新的稳定版本中,只有 Rook +Ceph 存储集成方案处于 stable 状态,版本升级较平滑。
        Ceph 是一种广泛使用的开源分布式存储方案,通过 Rook 则可以大大简化 Ceph 在Kubernetes 集群中的部署和维护工作。基于 Rook+Ceph 的存储方案,能为云原生环境提供文件、块及对象存储服务。

        建立 ceph 集群不仅需要大量的服务器资源,本身的复杂度也需要人力成本。但是在企业内部使用 Kubemetes时,无论是在部署业务服务还是中间件服务,都能很明显地体会到Kubernetes 的便利性和强大之处,所以我们在企业内部使用 Kubernetes 时,同时也会把中间件服务(比如 MySQL、RabbitMQ、Zookeeper等)部署在Kubernetes集群中。
        相对于生产环境,也需要保留它们的数据,但是非生产环境可能并没有现成的,存储平台供Kubernetes 使用,新建一个平台供其使用也会浪费很多精力。为了解决非生产环境的数据持久化问题,很多公司都采用了 NFS 作为后端,但是一旦使用的容器较多或者存储的数据量比较大,就容易造成性能问题,并且 NFS 服务器一旦出现问题,整个数据可能会全部丢失,所以在非生产环境也需要一个高可用、分布式并且免运维的存储平台,于是 Rook 就诞生了。
        Rook是一个自我管理的分布式存储编排系统,它本身并不是存储系统,Rook在存储和Kubernetes 之间搭建了一个桥梁,使存储系统的搭建或者维护变得特别简单,Rook 将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它让一些存储的操作比如部署、配置、扩容、升级、迁移、灾难恢复、监视和资源管理变得自动化,无须人工处理。同时 Rook 支持 CSI,可以利用 CSI 做一些 PVC 的,快照、扩容、克隆等操作。
        有了 Rook 就可以快速地搭建一个Ceph 存储系统,用来持久化一些必需的数据,不仅降低了运维复杂度,也能更加方便地体验 Kubernetes 带来的收益,同时也可以通过 Rook 来演示更多的Kubernetes 存储的高级功能。

        RADOS(Reliable Autonomic Distributed Object Store)是一个由Ceph存储系统使用的核心组件。它是一个高性能、可靠的分布式对象存储系统,负责管理数据存储和检索。RADOS的主要特点包括:

  • 分布式架构:RADOS将数据分布在多个存储节点上,这些节点共同工作以提供高可用性和高性能。

  • 数据冗余:为了确保数据的可靠性,RADOS使用数据复制和纠删码技术,以处理硬件故障或节点故障时的数据恢复。

  • 自我修复:RADOS具有自我修复的能力,当某些节点出现故障时,它会自动将数据重新分布到其他正常的节点上。

  • 对象存储:RADOS使用对象存储的方式来管理数据,提供灵活的数据访问和管理方法。每个对象都有一个唯一的标识符,并且可以存储大量数据。

  • 高可扩展性:RADOS可以随着存储需求的增长而水平扩展,只需添加更多的存储节点即可。

RADOS是Ceph的基础组件之一,为Ceph的文件系统、块存储和对象存储提供底层的存储服务。

一、Rook的安装

        Rook 是专门为 Kubernetes 设计的云原生存储,所以它本身和由 Rook 创建的 Ceph 集群都是部署在 Kubernetes 平台上的,本案例安装的 Rook为1.6 的版本。

1.为所有主机添加磁盘

注意:

        在本案例中,是一台 master,两台 node,因为 ceph 集群的最小要求是三个节点,因此需要在包含 master 主机在内的三台主机都添加磁盘。所有主机添加一块 100G 的磁盘,以满足案例实验需求。
        数据盘可以是一块硬盘 sdb,也可以是硬盘的一个分区 sdb2,或者是逻辑卷,但是这些都必须没有被格式过,没有指定文件系统类型。
        可以使用 1sblk -f 来确认数据盘有没有被文件系统格式化过。FSTYPE 字段为空即代表未被文件系统格式化过。

#如下所示,vdb 可以作为 ceph 的数据盘。

[root@master ~]# lsblk -f
NAME   FSTYPE  LABEL         UUID                                   MOUNTPOINT
rbd0   ext4                  f45f43ee-35ef-4239-8784-5f5c84bb8e7e   /var/lib/k
sdb                                                                 
sr0    iso9660 CentOS 7 x86_64
                             2020-11-04-11-36-43-00                 /media/cdr
rbd1   ext4                  18326377-c7c2-459e-b8ae-91cde2c93ac5   /var/lib/k
sda                                                                 
├─sda2 xfs                   3f86f61c-7ee2-425e-9bef-e98f5ba8ef77   /boot
├─sda3 LVM2_me               YYnCZ6-mSgF-LxfI-deUt-NHPX-AAgz-UlNnyq 
│ ├─centos-swap
       swap                  193c600b-0015-4672-99c9-0384980d630e   
│ └─centos-root
       xfs                   9713830a-36c8-4c74-9d85-a873984779ac   /
└─sda1

2.保证所有安装 ceph 的节点都安装了 1vm2

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

[root@master ~]# yum -y install lvm2
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
软件包 7:lvm2-2.02.187-6.el7_9.5.x86_64 已安装并且是最新版本
无须任何处理
[root@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

3.加载 rbd 内核

#Ceph 存储需要包含了 RBD 模块的 Linux 内核来文持。在使用 Kubernetes 环境中运行 ceph存储之前,需要在 Kubernetes 节点上运行 modprobe rbd 命令来测试当前内核中是否已经加载
了 RBD 内核。

[root@master ~]# modprobe rbd
[root@master ~]# lsmod | grep rbd
rbd                   118784  4 
libceph               512000  2 ceph,rbd

4.取消 master 污点

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

(1)查看当前 kubernetes 环境中的污点
[root@master ~]# ku 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 行

(2)取消 master 节点的污点
[root@k8s-master ~l# kubectl taint nodes --all node-role.kubernetes.io/master-

备注:
此命令能够取消所有设备的污点

5.下载 v1.11.5 版本的 Rook 源码:

git clone --single-branch --branch v1.11.5 https://github.com/rook/rook.git

备注:
v1.11.5 的版本可以支持 kubernetes:v1.21.8 以上的版本

本案例已经下载过,直接使用离线文件

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

(1)查看都需要哪些镜像
[root@master ~]# cd rook/deploy/examples
#查看部署所需要的镜像提前拉取
[root@master examples]# cat images.txt 
 quay.io/ceph/ceph:v17.2.6
 quay.io/cephcsi/cephcsi:v3.8.0
 quay.io/csiaddons/k8s-sidecar:v0.5.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
 rook/ceph:v1.11.5
(2)用 docker pu11 拉取上边的所有镜像
(3)如果无法拉取,则采用如下方法拉取

如果拉不下去可使用以下脚本
该脚本从阿里云镜像仓库拉取到本地,再用 docker image tag 命令修改为为原镜像名称,再删除从阿里云拉取的镜像。

[root@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
#执行脚本进行拉取
[root@master examples]# bash ceph-images.sh

7.部署 rook operator

[root@k8s-master examples# kubectl create -f crds.yaml -f common.yaml -foperator.yaml
[root@master examples]# ku -n rook-ceph get pod
NAME                                              READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-8sljg                            2/2     Running     0          166m
csi-cephfsplugin-mhzvv                            2/2     Running     0          166m
csi-cephfsplugin-p67v4                            2/2     Running     0          166m
csi-cephfsplugin-provisioner-6f5d88b7ff-h56kg     5/5     Running     0          60m
csi-cephfsplugin-provisioner-6f5d88b7ff-nw8jn     5/5     Running     0          60m
csi-rbdplugin-7n4xv                               2/2     Running     0          166m
csi-rbdplugin-7z2pj                               2/2     Running     0          166m
csi-rbdplugin-n9sn4                               2/2     Running     0          166m
csi-rbdplugin-provisioner-57f5ddbd7-5fdmj         5/5     Running     0          60m
csi-rbdplugin-provisioner-57f5ddbd7-n26gp         5/5     Running     0          60m
rook-ceph-crashcollector-master-c9db59846-4p8k6   1/1     Running     0          59m
rook-ceph-crashcollector-node1-55f95c7755-rlrxs   1/1     Running     0          59m
rook-ceph-crashcollector-node2-64964c9cd4-9gkpr   1/1     Running     0          57m
rook-ceph-mds-myfs-a-7974ddf644-hpz4v             2/2     Running     0          59m
rook-ceph-mds-myfs-b-588ff47b85-gbnpp             2/2     Running     0          59m
rook-ceph-mgr-a-5df877c675-bhq69                  3/3     Running     0          65m
rook-ceph-mgr-b-55c59f5cb-9qpz4                   3/3     Running     0          165m
rook-ceph-mon-a-c95f8976f-c2rrd                   2/2     Running     0          166m
rook-ceph-mon-b-6788bc9cbc-zdczq                  2/2     Running     0          60m
rook-ceph-mon-c-6dc965ff85-n5bz6                  2/2     Running     0          60m
rook-ceph-operator-6c54c49f5f-95nwb               1/1     Running     0          60m
rook-ceph-osd-0-6644497bb6-26k7n                  2/2     Running     0          164m
rook-ceph-osd-1-7f76b5b8c9-dg9hn                  2/2     Running     0          60m
rook-ceph-osd-2-74fff78787-4srqh                  2/2     Running     0          60m
rook-ceph-osd-prepare-master-4ttz9                0/1     Completed   0          58m
rook-ceph-osd-prepare-node1-9fwg8                 0/1     Completed   0          58m
rook-ceph-tools-598b59df89-mh6ks                  1/1     Running     0          65m

二、部署 ceph 集群

[root@k8s-master examples]# kubectl create -f cluster.yaml

注意:
此步骤需要较长的时间(5 分钟)。总共需要启动 25 个pod,其中 ceph-osd-prepare 是job:所以状态是 Completed。

1.部署 ceph 工具

(1)部署 ceph-tools
[root@k8s-master ~]# cd /root/rook/deploy/examples/
[root@k8s-master examples]# kubectl apply -f toolbox.yaml
(2)查看 pod
[root@k8s-master examples]# kubectl get pod -n rook-ceph
注意:会多出一个名为rook-ceph-tools 的 pod
NAME                                              READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-8sljg                            2/2     Running     0          169m
csi-cephfsplugin-mhzvv                            2/2     Running     0          169m
csi-cephfsplugin-p67v4                            2/2     Running     0          169m
csi-cephfsplugin-provisioner-6f5d88b7ff-h56kg     5/5     Running     0          64m
csi-cephfsplugin-provisioner-6f5d88b7ff-nw8jn     5/5     Running     0          64m
csi-rbdplugin-7n4xv                               2/2     Running     0          169m
csi-rbdplugin-7z2pj                               2/2     Running     0          169m
csi-rbdplugin-n9sn4                               2/2     Running     0          169m
csi-rbdplugin-provisioner-57f5ddbd7-5fdmj         5/5     Running     0          64m
csi-rbdplugin-provisioner-57f5ddbd7-n26gp         5/5     Running     0          64m
rook-ceph-crashcollector-master-c9db59846-4p8k6   1/1     Running     0          62m
rook-ceph-crashcollector-node1-55f95c7755-rlrxs   1/1     Running     0          63m
rook-ceph-crashcollector-node2-64964c9cd4-9gkpr   1/1     Running     0          60m
rook-ceph-mds-myfs-a-7974ddf644-hpz4v             2/2     Running     0          63m
rook-ceph-mds-myfs-b-588ff47b85-gbnpp             2/2     Running     0          62m
rook-ceph-mgr-a-5df877c675-bhq69                  3/3     Running     0          69m
rook-ceph-mgr-b-55c59f5cb-9qpz4                   3/3     Running     0          168m
rook-ceph-mon-a-c95f8976f-c2rrd                   2/2     Running     0          169m
rook-ceph-mon-b-6788bc9cbc-zdczq                  2/2     Running     0          64m
rook-ceph-mon-c-6dc965ff85-n5bz6                  2/2     Running     0          64m
rook-ceph-operator-6c54c49f5f-95nwb               1/1     Running     0          64m
rook-ceph-osd-0-6644497bb6-26k7n                  2/2     Running     0          168m
rook-ceph-osd-1-7f76b5b8c9-dg9hn                  2/2     Running     0          64m
rook-ceph-osd-2-74fff78787-4srqh                  2/2     Running     0          64m
rook-ceph-osd-prepare-master-4ttz9                0/1     Completed   0          62m
rook-ceph-osd-prepare-node1-9fwg8                 0/1     Completed   0          62m
rook-ceph-tools-598b59df89-mh6ks                  1/1     Running     0          69m
(3)登录rook-ceph-tools
# kubectl exec -it rook-ceph-tools-598b59df89-gjfvz -n rook-ceph -- bash
(4)查看ceph 集群状态

(5)查看osd目录树

(6)查看osd存储状态

(7)列出osd存储池

三、安装snapshot 控制器

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

1.下载安装包

[root@k8s-master ~l# git clone https://github.com/dotbalo/k8s-ha-install.git
[root@k8s-master ~l# cd k8s-ha-install/
[root@k8s-master k8s-ha-install]# git checkout manual-installation-v1.20.x

备注:
        如果已经下载好离线包,上述三条可以不执行,直接使用离线包即可

2.部署

四、部署ceph-dashboard

(1)部署 dashboard
[root@k8s-master ~]# cd /root/rook/deploy/examples/
[root@k8s-master examples]# kubectl create -f dashboard-external-https.yaml
(2)查看svc

注意:
        红色的 svc 是原有的 dashboard,要把它删掉。绿色部分是我们部署 dashboard 的时候创建出来的。

(3)删除原有的 svc
[root@k8s-masterexamplesl# kubectldelete:svc/rook-ceph-mgr-dashboard-nrook-ceph
(4)获取 ceph-dashboard 的登录密码
[root@master examples]# ku -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo

(5)登录ceph-dashboard
[root@k8s-master examples]# kubectl get svc -n rook-ceph

#访问地址
https://192.168.10.101:31540/

备注:

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

五、ceph 块存储的使用

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

1.创建 storageclass 和ceph 存储池

        首先进入 Ceph 的代码目录,找到 RBD 目录的 storageclass 配置,然后根据需求修改对应参数。此处主要修改的是副本数,在生产环境中,副本数至少为3,且不能超过 OSD 的数量。此处为实验环境,本案例设置为 2。

[root@k8s-master ~]# cd /root/rook/deploy/examples/csi/rbd
[root@k8s-master rbd]# vim storageclass.yaml
  replicated:
    size:2

2.创建 storageclass 和存储池

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

3.查看创建结果

[root@k8s-master rbd]# kubectl get cephblockpool -n rook-ceph
NAME        PHASE
replicapool    Ready
[root@k8s-master rbd]# kubectl get sc

注意:这里创建的 storageclass 的名字为 rook-ceph-block,在创建 PVC 的时候指定这个名字,即可让 PVC 和这个存储关联起来。

4.通过 ceph Dashboard 查看

https://192.168.10.101:31540

5.挂载测试

(1)创建一个 MySQL 服务使用该存储
[root@k8s-master ~]# cd /root/rook/deploy/examples
#rook 自带了一个MySOL 的测试样例,如下所示
[root@master examples]# vim mysql.yaml 

  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:
            claimName: mysql-pv-claim

备注:
        在这个文件中有一段 PVC 的配置,该 PVC 会连接刚才创建的 storageclass,然后动态创建 PV供 Pod 使用,之后如果有其他的存储需求,只需要创建 PVc 指定 storageclassName 为刚才创建的Storageclass 名称即可连接到 Rook的Ceph。如果是 tatefulset,只需要将volumeTemplateclaim 里面的 claim 名称改为 Storageclass 名称即可动态地为每个 Pod 创建个单独的 PV。

[root@k8s-master examples]# kubectl create -f mysql.yaml
(2)查看创建的 PVC 和 PV

        因为 MySQL 的数据不允许多个MySQL 实例连接同一个存储,所以一般只能用块存储。相当于新加了一块盘给 MySOL 使用。创建完成后可以査看创建的 PVC 和 PV。

(3)ceph Dashboard 上查看对应的 Image

https://192.168.10.101:31540

(4)查看 pod 中的卷

6.statfulSet volumeClaimTemplates

在之前的章节提到过 statfulset 用于有状态的应用部署,在实际使用时,可以很方便地利用statfulset 创建一个 Eureka 集群、Redis 集群或者其他集群。在使用 statfulset 创建应用时,会给每个 Pod 创建一个固定的标识符比如 redis-0、 redis-1 等。
        根据 statfulset 的特性,可以很方便地组建一个集群,但是需要注意的是,受 statfulset管理的 Pod 可能每个 Pod 都需要自己独立的存储,并非和其他 Pod 共享数据。比如创建一个 Redis一主二从的主从架构,Redis 主节点和两个从节点的数据肯定是不一致的,所以此时需要为每个 Pod单独创建一个存储供其使用,可以使用 statfulset 独有的 volumeclaimTemplates 参数结合Storageclass 为每个 Pod 动态创建 PVC,这样每个 Pod 就有了自己独有的存储。接下来用一个简单的示例介绍 volumeclaimTemplates 的使用。

(1)编辑示例文件

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

[root@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: 1Gi

备注:

name:www  ##和 volume 的 name 类似,通过 volumeMounts 指定该名字挂载到 pod

accessModes:["ReadWriteOnce"]   ##访问模式

storageClassName:"rook-ceph-block"  ##StorageClass名字

resources:存储配置

超过 terminationGracePeriodseconds 等待时间后,K8S会强制结束老POD

(2)创建StatefulSet
[root@k8s-master examples]# kubectl create -f volumeclaimTemplates.yaml

        此时,3个 Pod 分别有了自己的存储数据互不共享,在使用 statefulset 建立 Redis、MySQL、RabbitM0 集群时,如果需要持久化数据,就需要使用 volumeclaimTemplates 参数为每个 Pod 提供存储。

六、共享型文件系统的使用

        共享型文件系统一般用于多个 Pod 共享一个存储,比如用户上传的头像、需要被多个前端访问等。

1.创建共享型文件系统

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

(1)为共享型文件系统创建 pool
[root@k8s-master ~]# cd /root/rook/deploy/examples
[root@k8s-master examplesl# kubectl create -f filesystem.yaml
(2)查看 pod 启动状态

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

(3)在ceph dashboard 查看

2.创建共享型文件系统的 storageclass

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

[root@k8s-master ~l# cd /root/rook/deploy/examples/csi/cephfs
[root@k8s-master cephfs]# kubectl create -f storageclass.yaml

        之后将 PVc 的 storageclassName 设置成 rook-cephfs 即可创建共享文件类型的存储(指向块存储的 storageclass 即为创建块存储),可以供多个 Pod 共享数据。

3.挂载测试

创建一个 pod 挂载测试

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

#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
[root@k8s-master cephfs]# kubectl create -f kube-registry.yaml

 

 

        此时一共创建了3个Pod,这3个 Pod 共用一个存储,并都挂载到了/var/1ib/registry,该目录中的数据由3个容器共享。

七、PVC 扩容

1.扩容块存储

(1)查看当前容量
[root@k8s-master ~l# kubectl get pvc

(2)扩容

保存退出后会同步更新

(3)查看 PVC 修改结果

扩容有一定的延迟,等待一小会,即可看到扩容结果。

[root@k8s-master ~]# kubectl get pvc

(4)查看PV扩容结果

 (5)查看Ceph DashBoard

(6)查看容器中的扩容结果

2.扩容文件共享型PVC

(1)查看之前创建的文件共享型PVC

(2)修改大小

之前是1G,此处改为2G

保存退出后会自动更新

(3)查看修改后的 PVC 大小
[root@k8s-master ~]# kubectl get pvc -n kube-system

 

(4)查看修改后的 PV 的大小

(5)查看容器中的扩容结果

八、PVC快照

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

1.创建snapshotclass

Snapshotclass 是创建快照的类。

[root@k8s-master ~]# cd /root/rook/deploy/examples/csi/rbd
[root@k8s-master rbd]# kubectl create -f snapshotclass.yaml

2.创建快照

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

(1)查看之前创建的 MySQL

(2)登录MySQL容器创建测试用文件

(3)修改snapshot.yaml 文件

指定为哪个 PVC 创建快照

[root@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
(4)创建快照
[root@k8s-master rbd]# kubectl create -f snapshot.yaml
(5)查看快照结果
[root@k8s-master rbdl# kubectl get volumesnapshot

3.恢复快照

(1)使用快照恢复数据

备注:
storageclassName:rook-ceph-block

dataSource:快照名称

storage:20Gi 大小不能小于原来的值

(2)执行恢复动作
[root@k8s-master rbd]# kubectl create -f pvc-restore.yaml
(3)查看结果

4.检查快照的数据

(1)创建容器

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

[root@k8s-master rbdl# 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 rbd]# kubectl create -f restore-check-snapshot-rbd.yaml
(2)查看结果

 

九、PVC 克隆

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

1.创建克隆

[root@k8s-master rbd]# pwd
/root/rook/deploy/examples/csi/rbd

注意:
datasource 的 name 是被克隆的 PVC 的名字,在此是 mysql-pv-claim

StorageclassName 是新建的PVC的Storageclass 名称

storage 大小不能小于之前的 PVC 的大小

2.开始克隆

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

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

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

相关文章

【python因果推断库3】使用 CausalPy 进行贝叶斯geolift 分析

目录 导入数据 丹麦的销售额是否有地理提升(GeoLift)? 结果 本笔记本介绍如何使用 CausalPy 的贝叶斯{术语}合成控制功能来评估“地理提升”(GeoLift)。我们的假设情景如下: 你是一家在欧洲运营的公司的…

集成电路学习:什么是ISP系统编程

一、ISP:系统编程 ISP(In-System Programming)即系统编程,是一种在系统内部进行的编程方法,主要用于对闪存(FLASH)、EEPROM等非易失性存储器的编程。ISP编程提供了巨大的灵活性,允许…

SaaS用户增长:提升转化率的实践路径

在SaaS(软件即服务)行业这片竞争激烈的蓝海中,企业要实现稳健的用户增长,必须聚焦于优化用户获取与转化策略,以提升用户转化率。用户转化率,作为衡量SaaS产品市场吸引力和用户接纳度的核心指标,…

图文解析保姆级教程: IDEA里面创建SpringBoot工程、SpringBoot项目的运行和测试、实现浏览器返回字符串

文章目录 一、创建SpringBoot工程(需要联网)二、 定义请求处理类三、运行测试 此教程摘选自我的笔记:黑马JavaWeb开发笔记13——Springboot入门(创建、运行&测试项目)、Http协议(请求&响应协议&…

Unity实战案例 2D小游戏HappyGlass(模拟水珠)

本案例素材和教程都来自Siki学院,十分感谢教程中的老师 本文仅作学习笔记分享交流,不作任何商业用途 预制体 在这个小案例中,水可以做成圆形但是带碰撞体,碰撞体比图形小一圈,顺便加上Trail renderer组件 材质 将碰撞…

SVN介绍和使用

一、SVN(Subversion) SVN 是一种版本控制系统,可以用于管理和控制文件的变更。以下是SVN的基本使用步骤: 安装SVN:首先,您需要在计算机上安装SVN客户端。您可以从Subversion官方网站下载安装程序&#xff…

sql-labs61-65关通关攻略

第61关 一:查看数据库 ?id1)) and updatexml(1,concat(1,(select database())),1)-- 二:查看表名 ?id1)) and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schemasecurity)),1)-- 三&#…

MATLAB/Simulink 汽车ABS仿真模型 防抱死刹车 教程 资料 程序 模型 论文 视频

项目概述 防抱死制动系统(ABS)是现代车辆中的一项重要安全技术,它能够在紧急制动时防止车轮锁死,从而提高车辆的稳定性和操控性。本项目旨在使用MATLAB/Simulink建立一个完整的ABS仿真模型,帮助学习者理解ABS的工作原理…

WebRTC协议下的视频汇聚融合技术:EasyCVR构建高效视频交互体验

视频汇聚融合技术是指将来自不同源、不同格式、不同网络环境的视频流进行集中处理、整合和展示的技术。随着视频监控、远程会议、在线教育、直播娱乐等领域的快速发展,视频数据的规模急剧增长,对视频处理能力和效率提出了更高要求。视频汇聚融合技术通过…

【杭州】目前就业情况-自述

博主在今年6月份,被自己领导下达了裁员通知,所以近期一直都没有更新博文。那么接下来简单介绍下杭州2024年就业情况吧! 目录 一、行情 二、薪资 三、外包 四、如果你真快吃不上饭了 五、博主被问的面试题 一、行情 今年应该是有史以…

低代码技术助力移动端开发:简化开发流程,实现快速创新

在移动互联网快速发展的今天,企业和开发者面临着越来越高的需求,要求开发高质量、功能强大的移动应用,以满足用户的期待和市场的变化。然而,传统的移动端开发流程通常复杂且耗时,需要投入大量的资源和开发人员。为了应…

Unity坐标系计算3D中两直线的最短距离及最近点的几何原理

方法1: 已知空间中两直线AB, CD,判断它们是否相交 问题的关键是求出这两条直线之间的最短距离,以及在这个距离上最接近两线的点坐标,判断该点是否在直线AB和直线CD上。 首先将直线方程化为对称式,分别得到两直线方向向…

VUE 实现三级权限选中与全选

功能:点击全选时所有子级选中,点击子级时对应的所有父级要选中。 实现思路:通过递归将所有子级转化为一级,选中时将选中的ID存为一个二级数组。循环时判断当前项在选中的数组中存在时即为勾选状态。 1、所有子级选中&#xff1a…

【盖世汽车-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

python django 使用教程

前言 python django使用起来简单方便,大大节省开发时间,提高开发效率,现在介绍下如何使用 一、创建 Django 项目 首先,建立虚拟环境,(最好养成一个项目一个环境的习惯,防止多个项目pip包混乱问…

Web3与AI的融合:开启去中心化应用的新纪元

在数字科技不断发展的今天,Web3与人工智能(AI)的融合正引领去中心化应用(DApps)的新纪元。这种结合不仅扩展了去中心化技术的应用场景,还为智能应用提供了更加高效和创新的解决方案。本文将深入探讨Web3与A…

深入理解HTTP连接池及其在Java中的应用

更多内容前往个人网站:孔乙己大叔 在现代的Web开发中,HTTP请求已经成为应用程序与外部服务交互的主要方式。随着微服务架构的流行,一个应用可能需要同时与多个外部服务进行通信,这导致HTTP请求的数量显著增加。为了提升性能和资源…

微信小程序垃圾回收的前景方向

在当今这个环保意识日渐增强的时代,如何有效处理日常生活产生的垃圾已成为亟待解决的社会问题。微信小程序凭借其便捷性和广泛的用户基础,在推广垃圾分类与回收方面展现出巨大潜力。作为一款集智能化分类指导、在线预约回收、环保知识普及于一体的微信小…

使用JavaScript读取手机联系人列表:从理论到实践

更多内容前往个人网站:孔乙己大叔 在现代Web开发中,随着技术的不断进步,以前看似不可能的任务现在变得可行。例如,使用JavaScript读取手机联系人列表这一功能,在几年前几乎是不可想象的,但现在随着Web API的…

SQL 五十周年:何去何从?

原文地址 https://www.infoworld.com/article/2337457/sql-at-50-whats-next-for-the-structured-query-language.html SQL 即使被生成式 AI 隐藏在幕后,也将继续在数据交互和使用方面发挥关键作用。 CREDIT: PAVEL L PHOTO AND VIDEO / SHUTTERSTOCK 1974 年 5 月…