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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐