小阿轩yx-云原生存储Rook部署Ceph
前言
Rook
- 一款云原生存储编排服务工具
- 由云原生计算基金会(CNCF)孵化,且于2020年10月正式进入毕业阶段。
- 并不直接提供数据存储方案,而是集成了各种存储解决方案,并通过一种自管理、自扩容、自修复的云原生存储服务。
- 社区官方资料显示,目前最新的稳定版本中,只有 Rook+Ceph 存储集成方案处于 stable 状态,版本升级较平滑。
- 本身并不是存储系统,在存储和 Kubernetes 之间搭建了一个桥梁,使存储系统的搭建或维护变得特别简单
- 让一些存储操作部署、配置、扩容、升级、迁移、灾难恢复、监视和资源管理变得自动化,无需人工处理
- 支持 CSI,可利用 CSI 做一些 PVC 的快照、扩容、克隆等操作
Rook 可以快速搭建一个 Ceph 存储系统,用来持久化一些必需的数据,不仅降低了运维复杂度,也能更加方便体验 Kubernetes 带来的收益,同时也可以通过 Rook 来演示更多的 Kubernetes 存储的高级功能
Ceph
- 一种广泛使用的开源分布式存储方案,通过 Rook 可以大大简化 Ceph 在 Kubernetes 集群中的部署和维护工作。
- 基于 Rook+Ceph 的储存方案,能为云原生环境提供文件、块及对象存储服务。
- 建立 Ceph 集群不仅需要大量的服务器资源,本身的复杂度也需要人力成本。
- 企业内部使用 Kubemetes 时,无论是在部署业务服务还是中间件服务,都能很明显地体会到Kubernetes 的便利性和强大之处,所以我们在企业内部使用Kubernetes 时,同时也会把中间件服务(比如 MySQLRabbitMQ、Zookeeper等)部署在 Kubernetes 集群中。
相对于生产环境,也需要保留它们的数据,但是非生产环境可能并没有现成的,存储平台供Kubernetes 使用,新建一个平台供其使用也会浪费很多精力。
Rook 诞生原因
- 解决非生产环境的数据持久化问题
- 公司都采用了 NFS 作为后端,但是一旦使用的容器较多或者存储的数据量比较大,就容易造成性能问题,并且 NFS 服务器一旦出现问题,整个数据可能会全部丢失
- 非生产环境也需要一个高可用、分布式并且免运维的存储平台
Rook 的安装
- Rook 是专门为 Kubernetes 设计的云原生存储,它本身和由 Rook 创建的 Ceph 集群都是部署在 Kubernetes 平台上的
本案例中,是一台 master,两台 node,因为 ceph 集群的最小要求是三个节点,因此需要在包含 master 主机在内的三台主机都添加磁盘。所有主机添加一块 100G 的磁盘
- 数据盘可以是一块硬盘 sdb,也可以是硬盘的一个分区 sdb2,或者是逻辑卷,但是这些都必须没有被格式过,没有指定文件系统类型。
- 可以使用 lsblk -f 来确认数据盘有没有被文件系统格式化过。
- FSTYPE 字段为空即代表未被文件系统格式化过。
为所有主机添加磁盘(100G)
101
102
103
首先将 images 镜像文件通过 Xftp 上传至 master、node01、node02(101、102、103)
将 k8s-ha-install、rook 两个文件单独上传至 master(101)
这一步开启会话同步
进入镜像文件三个节点同时导入镜像
主机一
[root@k8s-master ~]# cd images/
[root@k8s-master images]# bash imp_docker_img.sh
主机二
[root@k8s-node01 ~]# cd images/
[root@k8s-node01 images]# bash imp_docker_img.sh
主机三
[root@k8s-node02 ~]# cd images/
[root@k8s-node02 images]# bash imp_docker_img.sh
vdb 可以作为 ceph 的数据盘
[root@k8s-master ~]# lsblk -f
NAME FSTYPE LABLE UUID MOUNTPOINT
sr0 iso9660 config-2 2024-09-02-01-50-00
vda
|------vda1 xfs 624b9bfb-904e-4d69-b7e0-cf598f443497 /boot
|__vda2 xfs 974b2a82-1668-42c8-a4b6-bb1d24eada2f/
vdb
保证所有安装 ceph 的节点都安装了 lvm2
- Ceph OSD 在某些情况下(比如启用加密或指定元数据设备)依赖于 LVM(Logical VolumeManager)。
- 如果没有安装 LVM2 软件包,则虽然 Rook 可以成功创建 Ceph OSD,但是当节点重新启动时,重新启动的节点上运行的 OSD pod 将无法启动。
三台节点都要安装
[root@k8s-master ~]# yum -y install lvm2
[root@k8s-node01 ~]# yum -y install lvm2
[root@k8s-node02 ~]# yum -y install lvm2
三台节点查看已安装的包的列表
[root@k8s-master ~]# yum list installed | grep lvm2
lvm2.x86_64 7:2.02.187-6.el7_9.5 @updates
lvm2-libs.x86_64 7:2.02.187-6.el7_9.5 @updates
[root@k8s-node01 ~]# yum list installed | grep lvm2
lvm2.x86_64 7:2.02.187-6.el7_9.5 @updates
lvm2-libs.x86_64 7:2.02.187-6.el7_9.5 @updates
[root@k8s-node02 ~]# yum list installed | grep lvm2
lvm2.x86_64 7:2.02.187-6.el7_9.5 @updates
lvm2-libs.x86_64 7:2.02.187-6.el7_9.5 @updates
加载 rbd 内核
-
Ceph 存储需要包含了 RBD 模块的 Linux 内核来支持。
-
使用 Kubernetes 环境中运行 ceph 存储之前,需要在 Kubernetes 节点上运行 modprobe rbd 命令来测试当前内核中是否已经加载了RBD 内核。
[root@k8s-master ~]# modprobe rbd
查看内核模块(三个节点都要有)
[root@k8s-master ~]# lsmod | grep rbd
rbd 118784 0
libceph 483328 1 rbd
[root@k8s-node01 ~]# lsmod | grep rbd
rbd 118784 0
libceph 483328 1 rbd
[root@k8s-node02 ~]# lsmod | grep rbd
rbd 118784 0
libceph 483328 1 rbd
取消 master 污点
- 由于 ceph 集群默认最小三个节点,当前 kubernetes 也是三节点,1个master+2 个worker,所以需要使用 master 节点来充当 ceph 节点,因此需要取消 master 节点上的污点,否是 ceph 相关 pod 无法调度到 master 节点,导致部署失败。如果 worker 节点足够则无需此操作。
查看当前 kubernetes 环境中的污点
[root@k8s-master ~]# kubectl get no -o yaml | grep taint -A 5
taints:
- effect: Noschedule
key: node-role.kubernetes.io/master
status:
addresses:
- address: 192.168.10.101
- -A 5 表示显示出 taint 行以及往下的5行
- 此命令能够取消所有设备的污点
这里取消会话同步
下载 v1.11.5 版本的 Rook 源码
https://github.com/rook/rook.git
- git clone --single-branch --branch v1.11.5
- v1.11.5 的版本可以支持 kubernetes:v1.21.0 以上的版本
- 本案例已经下载过,直接使用离线文件
拉取镜像(若本地已有这些镜像,可以不执行此步骤)
进入目录
[root@k8s-master ~]# cd rook/deploy/example
查看都需要哪些镜像
[root@k8s-master examples]# cat images.txt
rook_ceph_v1.11.5
quay.io_ceph_ceph_v17.2.6
quay.io_cephcsi_cephcsi_v3.8.0
registry.k8s.io_sig-storage_csi-attacher_v4.1.0
registry.k8s.io_sig-storage_csi-node-driver-registrar_v2.7.0
registry.k8s.io_sig-storage_csi-provisioner_v3.4.0
registry.k8s.io_sig-storage_csi-resizer_v1.7.0
registry.k8s.io_sig-storage_csi-snapshotter_v6.2.1
用脚本拉取所有镜像
-
该脚本从阿里云镜像仓库拉取到本地,再用 docker image tag 命令修改为为原镜像名称
[root@k8s-master examples]# vim ceph-images.sh
#!/bash/bin
image_list=(
csi-node-driver-registrar:v2.7.0
csi-attacher:v4.1.0
csi-snapshotter:v6.2.1
csi-resizer:v1.7.0
csi-provisioner:v3.4.0
rook/ceph:v1.11.5
quay.io/ceph/ceph:v17.2.6
quay.io/cephcsi/cephcsi:v3.8.0
)aliyuncs="registry.aliyuncs.com/it00021hot"
google_gcr="registry.k8s.io/sig-storage"
for image in ${image_list[*]}
do
docker image pull {aliyuncs}/{image}
docker image tag {aliyuncs}/{image} {google_gcr}/{image}
docker image rm {aliyuncs}/{image}
echo "{aliyuncs}/{image} {google_gcr}/{image} downloaded."
done -
aliyuncs="registry.aliyuncs.com/it00021hot"
-
google_gcr="registry.k8s.io/sig-storage"
-
for image in ${image_list[*]}
-
do
-
docker image pull {aliyuncs}/{image}
-
docker image tag {aliyuncs}/{image} {google_gcr}/{image}
-
docker image rm {aliyuncs}/{image}
-
echo "{aliyuncs}/{image} {google_gcr}/{image} downloaded."
-
done
#执行脚本进行拉取
[root@k8s-master examples]# bash ceph-images.sh
部署 rook operator
[root@k8s-master examples]# kubectl create -f crds.yaml -f common.yaml -f operator.yaml
查看 Pod
[root@k8s-master examples]# kubectl -n rook-ceph get pod
NAME READY STATUS RESTARTS AGE
rook-ceph-operator-6c54c49f5f-swn5h 1/1 Running 0 5m20s
部署 ceph 集群
[root@k8s-master examples]# kubectl create -f cluster.yaml
- 此步骤需要较长的时间(5 分钟)。
- 总共需要启动 25 个pod,其中 ceph-osd-prepare 是 job,所以状态是 Completed。
部署 ceph 工具
进入目录
[root@k8s-master examples]# cd /root/rook/deploy/example
部署 ceph-tools
[root@k8s-master examples]# kubectl apply -f toolbox.yaml
查看 pod
[root@k8s-master examples]# kubectl get pod -n rook-ceph
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-2c741 2/2 Running 1(26m ago) 37m
csi-cephfsplugin-945b7 2/2 Running 2(26m ago) 37m
csi-cephfsplugin-krvst 2/2 Running 2(26m ago) 37m
csi-cephfsplugin-provisioner-6f5d88b7ff-ghg8h 5/5 Running 5(26m ago) 37m
csi-cephfsplugin-provisioner-6f5d88b7ff-swzfm 5/5 Running 5(26m ago) 37m
csi-rbdplugin-5kz6w 2/2 Running 2(26m ago) 37m
csi-rbdplugin-fc5nb 2/2 Running 2(26m ago) 37m
csi-rbdplugin-provisioner-57f5ddbd7-8vv71 5/5 Running 5(26m ago) 37m
csi-rbdplugin-provisioner-57f5ddbd7-bz9jv 5/5 Running 5(26m ago) 37m
csi-rbdplugin-s6b25 2/2 Running 2(26m ago) 37m
rook-ceph-crashcollector-k8s-master-55f555dc8f-h9qfx 1/1 Running 0 32m
rook-ceph-crashcollector-k8s-node01-58c754c998-54zV2 1/1 Running 1(26m ago) 32m
rook-ceph-crashcollector-k8s-node02-7fd96945d9-55vg8 1/1 Running 1(26m ago) 32m
rook-ceph-mgr-a-7dd565d4dd-lczcb 3/3 Running 2(26m ago) 37m
rook-ceph-mgr-b-86668b6dcf-fwbbv 3/3 Running 3(26m ago) 37m
rook-ceph-mon-a-55b48b74d9-7wVg2 2/2 Running 2(26m ago) 41m
rook-ceph-mon-b-76fd68dc4f-fnkmf 2/2 Running 2(26m ago) 40m
rook-ceph-mon-c-55df87d96b-swgs4 2/2 Running 0 37m
rook-ceph-operator-6c54c49f5f-swn5h 1/1 Running 1(26m ago) 52m
rook-ceph-osd-0-7bb5989fd7-4bjt7 2/2 Running 2(26m ago) 32m
rook-ceph-osd-1-664dddd5c9-5lg42 2/2 Running 2(26m ago) 37m
rook-ceph-osd-2-886bcbfb6-qpph4 2/2 Running 0 9m27s
rook-ceph-osd-prepare-k8s-master-ldz9z 0/1 Completed 0 9m27s
rook-ceph-osd-prepare-k8s-node01-zkbj9 0/1 Completed 0 8m55s
rook-ceph-osd-prepare-k8s-node02-lp7d8 0/1 Completed 0 8m49s
rook-ceph-tools-598b59df89-gjfvz 1/1 Running 0 32m
会多出一个名为 rook-ceph-tools 的pod
- rook-ceph-tools-598b59df89-gjfvz 1/1 Running 0 32m
查看 pod 总数
[root@k8s-master examples]# kubectl get pod -n rook-ceph | wc -l
26
登录 rook-ceph-tools
[root@k8s-master examples]# kubectl exec -it rook-ceph-tools-598b59df89-gjfvz -n rook-ceph -- bash
#查看 ceph 集群状态
bash-4.4$ ceph -s
cluster:
id: 7cd53c0e-4691-4550-8c7a-b2ce7ded9bfe
health: HEALTH_OK
services:
mon: 3 daemons,quorum a,b,c(age 13m)
mgr: a(active,since 12m),standbys:b
osd: 3 osds:3up(since 13m),3in(since 13m)
data:
pools: 1 pools,1 pgs
objects: 2 objects, 449 KiB
usage: 63 MiB used,180 GiB /180 GiB avail
pgs: 1 active+clean
#查看 osd 目录树
bash-4.4$ ceph osd tree
ID CLASS WEIGHTT YPE NAME STATUS REWEIGHT PRI-AFF
-1 0.17578 root default
-7 0.05859 host k8s-master
2 0.05859 osd up 1.00000 1.00000
-3 0.05859 host k8s-node01
0 hdd 0.05859 osd.0 up 1.00000 1.00000
-5 0.05859 host k8s-node02
1 hdd 0.05859 osd.1 up 1.00000 1.00000
#查看 osd 存储状态
bash-4.4$ ceph osd status
ID HOST USED AVAIL WR OPS WR DATA RD OPS RD DATA STATE
0 k8s-node01 21.0M 59.9G 0 0 0 0 exists,up
1 k8s-node02 21.0M 59.9G 0 0 0 0 exists,up
2 k8s-master 20.6M 59.9G 0 0 0 0 exists,up
#列出 osd 储存池
bash-4.4$ ceph osd pool ls
.mgr
安装 snapshot 控制器
- 要想实现 PVC 的快照功能,需要 snapshot 控制器,在 kubernetes1.19 版本以上需要单独安装 snapshot 控制器。
- 如果是 1.19 以下的版本,则不需要单独安装。
软件包下载地址
https://github.com/dotbalo/k8s-ha-install.git
- git clone
- 如果已经下载好离线包,直接使用即可
进入安装包目录
[root@k8s-master ~]# cd k8s-ha-install/
部署
[root@k8s-master k8s-ha-install]# kubectl create -f snapshotter/ -n kube-system
获取 pod 状态
[root@k8s-master k8s-ha-install]# kubectl get pod -n kube-system -l app=snapshot-controller
NAME READY STATUS RESTARTS AGE
snapshot-controller 1/1 Running 0 4m11s
部署 ceph-dashboard
进入目录
[root@k8s-master ~]# cd /root/rook/deploy/example
部署 dashboard
[root@k8s-master example]# kubectl create -f dashboard-external-https.yaml
查看 svc
[root@k8s-master example]# kubectl get svc -n rook-ceph
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-mgr ClusterIP 10.107.221.122 <none> 9283/TCP 43m
rook-ceph-mgr-dashboard ClusterIP 10.101.196.95 <none> 8443/TCP 43m
rook-ceph-mgr-dashboard-external-https NodePort 10.111.32.176 <none> 8443:31540/TCP 14s
rook-ceph-mon-a ClusterIp 10.102.236.97 <none> 6789/TCP,3300/TCP 52m
rook-ceph-mon-c ClusterIp 10.98.200.63 <none> 6789/TCP,3300/TCP 49m
红色的 svc 是原有的 dashboard,要把它删掉。
- rook-ceph-mgr-dashboard ClusterIP 10.101.196.95 <none> 8443/TCP 43m
绿色部分是我们部署 dashboard 的时候创建出来的。
- rook-ceph-mgr-dashboard-external-https NodePort 10.111.32.176 <none> 8443:31540/TCP 14s
删除原有的 svc
[root@k8s-master example]# kubectl delete svc/rook-ceph-mgr-dashboard -n rook-ceph
获取 ceph-dashboard 的登录密码
[root@k8s-master example]# kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
IVSYe1`Ne*6%Mzf@;dzf
- 账号:admin
- 密码:IVSYe1`Ne*6%Mzf@;dzf
登录 ceph-dashboard
[root@k8s-master example]# kubectl get svc -n rook-ceph
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-mgr ClusterIP 10.107.221.122 <none> 9283/TCP 43m
rook-ceph-mgr-dashboard-external-https NodePort 10.111.32.176 <none> 8443:31540/TCP 14s
rook-ceph-mon-a ClusterIp 10.102.236.97 <none> 6789/TCP,3300/TCP 52m
rook-ceph-mon-c ClusterIp 10.98.200.63 <none> 6789/TCP,3300/TCP 49m
- 31540
浏览器访问地址
- 可以在此处做一个快照,方便后续重复实验
Ceph 块存储的使用
- 一般是一个 Pod 挂载一个块存储,相当于一个服务器新挂了一个磁盘,只给一个应用使用
- 比如中间件服务 MySQL、RabbitMQ、Redis 等。
首先进入 Ceph 的代码目录,找到 RBD 目录的 storageclass 配置
[root@k8s-master ~]# cd /root/rook/deploy/examples/csi/rbd
根据需求修改对应参数
[root@k8s-master rbd]# vim storageclass.yaml
replicated:
size: 2
- 此处主要修改的是副本数,在生产环境中,副本数至少为3,且不能超过 0SD 的数量。
- 此处为实验环境,本案例设置为2。
创建 StorageClass 和存储池
[root@k8s-master rbd]# kubectl create -f storageclass.yaml -n rook-ceph
查看创建结果
[root@k8s-master rbd]# kubectl get cephblockpool -n rook-ceph
NAME PHASE
replicapool Ready
获取 sc 结果
[root@k8s-master rbd]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate true 39s
- 这里创建的 storageclass 的名字为rook-ceph-b1ock,在创建 PVC的时候指定这个名字即可让 PVC 和这个存储关联起来。
通过 Ceph Dashboard 查看
挂载测试
进入目录
[root@k8s-master ~]# cd /root/rook/deploy/example
#rook 自带了一个 MySQL 的测试样例
创建一个 MySQL 服务使用该存储
[root@k8s-master example]# vim mysql.yaml
apiVersion: v1
kind: service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIp: None
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
##PVC 的名字
name: mysql-pv-claim
labels:
app: wordpress
spec:
##此处要的名字要关联前面创建的StorageClass
storageClassName: rook-ceph-block
accessModes:
- ReadWriteOnce
resources:
requests:
##实验环境设置的可以小一点
storage: 10Gi
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
tier: mysql
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: changeme
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name:mysql-persistent-storage
persistentVolumeClaim:
##对应前面的 PVC 名字
claimName: mysql-pv-claim
- 这个文件中有一段 PVC 的配置,该 PVC 会连接刚才创建的 storageclass,然后动态创建 PV供 Pod 使用,之后如果有其他的存储需求,只需要创建 PVc指定 storageclassName 为刚才创建的Storageclass 名称即可连接到 Rook的ceph。
- 如果是 statefulset,只需要将volumeTemplateclaim 里面的 Claim 名称改为 Storageclass 名称即可动态地为每个 Pod 创建个单独的 PV。
将文件创建出来
[root@k8s-master example]# kubectl create -f mysql.yaml
查看创建的 PVC 和 PV
-
因为 MySQL 的数据不允许多个 MySQL 实例连接同一个存储,所以一般只能用块存储。
-
相当于新加了一块盘给 MySQL 使用。
-
创建完成后可以査看创建的 PVC 和 PV。
[root@k8s-master examples]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 20Gi RWO rook-ceph-block 12m[root@k8s-master examples]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASONAGE AGE
pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 10Gi RWO Delete Bound default/mysql-pv-claim rook-ceph-block 12m
Ceph Dashboard 上查看对应的 Image
查看 pod 中的卷
[root@k8s-master examples]# kubectl get pod
NAME READY STATUS RESTARTS AGE
wordpress-mysq1-79966d6c5b-htnbl 1/1 Running 0 12m
登入卷中并查看利用率
[root@k8s-master examples]# kubectl exec -it wordpress-mysql-79966d6c5b-htnbl --df -Th
Filesystem Type Size Used Avail Use% Mounted on
overlay overlay 194G18G 177G 10% /
tmpfs tmpfs 64M 0 64M 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 194G 18G 177G 10% /etc/hosts
shm tmpfs 64M 0 0% /dev/shm
/dev/rbd0 ext4 9.8G 116M 9.7G 2% /var/lib/mysql
tmpfs tmpfs 3.7G 12k 1.7G 1%
/run/secrets/kubernetes.io/serviceaccount
tmpfs tmpfs 1.9G 0 1.9G 0% /proc/acpi
tmpfs tmpfs 1.9G 0 1.9G 0% /proc/scsi
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/firmware
statfulset volumeclaimTemplates
- 之前的章节提到过 StatfulSet 用于有状态的应用部署,在实际使用时,可以很方便地利用StatfulSet 创建一个 Eureka 集群、Redis 集群或者其他集群。
- 使用 statfulset 创建应用时会给每个 Pod 创建一个固定的标识符比如 redis-0、 redis-1等。
- 根据 Statfulset 的特性,可以很方便地组建一个集群,但是需要注意的是,受 statfulset管理的 Pod 可能每个 Pod 都需要自己独立的存储,并非和其他 Pod 共享数据。
用一个简单的示例介绍 volumeclaimTemplates 的使用
编辑示例文件
#volumeClaimTemplates 没有提供样例文件,需要自己编辑
[root@k8s-master examples]# vim volumeClaimTemplates.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx #has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodseconds: 10
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "rook-ceph-block"
resources:
requests:
storage: lGi
- name: www ##和 volume 的 name 类似,通过 volumeMounts 指定该名字挂载到 pod accessModes: [ "ReadWriteOnce" ] ##访问模式
- storageClassName: "rook-ceph-block" ##Storageclass名字
- resources: 存储配置##
- 超过 terminationGracePeriodseconds 等待时间后,K8S会强制结束老 POD
创建 StatefulSet
[root@k8s-master examples]# kubectl create -f volumeClaimTemplates.yaml
获取 pod 状态
[root@k8s-master examples]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 38s
web-1 1/1 Running 0 29s
web-2 1/1 Running 0 9s
获取 pvc 状态
[root@k8s-master examples]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 20Gi ROW rook-ceph-block 53m
www-web-0 Bound pvc-57c8626d-a370-4345-abf3-d212465b5635 1Gi ROW rook-ceph-block 53s
www-web-1 Bound pvc-4ea4b53f-acab-4731-aa7d-bb4470c35c42 1Gi ROW rook-ceph-block 33s
www-web-2 Bound pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611 1Gi ROW rook-ceph-block 33s
- 此时,3个Pod 分别有了自己的存储数据互不共享,在使用 statefulset 建立 Redis、MySQL、RabbitM0 集群时,如果需要持久化数据,就需要使用 volumeclaimTemplates 参数为每个 Pod 提供存储。
共享型文件系统的使用
- 一般用于多个 Pod 共享一个存储,比如用户上传的头像、需要被多个前端访问
创建共享型文件系统
- 与块存储类似,也需要创建共享型文件存储的 poo1。
进入目录
[root@k8s-master ~]# cd /root/rook/deploy/examples
为共享型文件系统创建 poo1
[root@k8s-master examples]# kubectl create -f filesystem.yaml
查看 pod 启动状态
-
由于文件存储需要使用 metadata server 存储元数据,因此创建完成后会启动 mds 容器,需要等待 mds 容器启动后才可以创建 PV。
[root@k8s-master examples]# kubectl get pod -n rook-ceph -l app=rook-ceph-mds
NAME READY STATUS RESTARTS AGE
rook-ceph-mds-myfs-a-d4bfd947f-t8cjc 2/2 Running 0 6m26s
rook-ceph-mds-myfs-b-85798855d6-sjx5d 2/2 Running 0 6m25s
在 Ceph dashboard 刷新查看
创建共享型文件系统的 StorageClass
- 文件存储也需要一个 storageclass 动态创建 PV。
进入目录
[root@k8s-master ~]# cd /root/rook/deploy/examples/csi/cephfs
将文件创建出来
[root@k8s-master examples]# kubectl create -f storageclass.yaml
- 之后将 PVC 的 storageclassName 设置成 rook-cephfs 即可创建共享文件类型的存储(指向块存储的 storageclass 即为创建块存储),可以供多个 Pod 共享数据。
挂载测试
进入目录
[root@k8s-master ~]# cd /root/rook/deploy/examples/csi/cephfs
创建一个 pod 挂载测试
#rook 提供了此测试样例
[root@k8s-master cephfs]# cat kube-registry.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cephfs-pvc
namespace: kube-system
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: rook-cephfs
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kube-registry
namespace: kube-system
labels:
k8s-app: kube-registry
kubernetes.io/cluster-service: "true"
spec:
replicas: 3
selector:
matchLabels:
k8s-app: kube-registry
template:
metadata:
labels:
k8s-app: kube-registry
kubernetes.io/cluster-service: "true"
spec:
containers:
- name: registry
image: registry:2
imagePullPolicy: Always
resources:
limits:
cpu: 100m
memory: 100Mi
env:
# Configuration reference: https://docs.docker.com/registry/configuration/
- name: REGISTRY_HTTP_ADDR
value: :5000
- name: REGISTRY_HTTP_SECRET
value: "Ple4seCh4ngeThisN0tAVerySecretV4lue"
- name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY
value: /var/lib/registry
volumeMounts:
- name: image-store
mountPath: /var/lib/registry
ports:
- containerPort: 5000
name: registry
protocol: TCP
livenessProbe:
httpGet:
path: /
port: registry
readinessProbe:
httpGet:
path: /
port: registry
volumes:
- name: image-store
persistentVolumeClaim:
claimName: cephfs-pvc
readOnly: false
- volumeMounts:
-
- name: image-store
- mountPath: /var/lib/registry
- volumes:
-
- name: image-store
- persistentVolumeClaim:
- claimName: cephfs-pvc
- readOnly: false
将文件创建出来
[root@k8s-master cephfs]# kubectl create -f kube-registry.yaml
获取 pod 状态信息
[root@k8s-master examples]# kubectl get pod -n rook-ceph -l app=rook-ceph-mds
NAME READY STATUS RESTARTS AGE
kubectl-registry-5b677b6c87-fxltv 1/1 Running 0 2m30s
kubectl-registry-5b677b6c87-1hkfr 1/1 Running 0 2m30s
kubectl-registry-5b677b6c87-sbzs4 1/1 Running 0 2m30s
获取 pvc 状态信息
[root@k8s-master examples]# kubectl get pvc -n kube-system
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
cephfs-pvc Bound pvc-d025b469-3d30-4a45-b7bb-e62abgbf21e8 1Gi RWX rook-cephfs 2m56s
- 此时一共创建了3个 Pod,这3个 Pod 共用一个存储,并都挂载到了/var/lib/registry,该目录中的数据由3个容器共享。
PVC 扩容
扩容块存储
查看当前容量
[root@k8s-master examples]# kubectl get pvc -n kube-system
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 1Gi RWO rook-ceph-block 78m
www-web-0 Bound pvc-57c8626d-a370-4345-abf3-d212465b5635 1Gi RWO rook-ceph-block 26m
www-web-1 Bound pvc-57c8626d-a370-4345-abf3-d212465b5635 1Gi RWO rook-ceph-block 25m
www-web-2 Bound pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611 1Gi RWO rook-ceph-block 24m
- mysql-pv-claim Bound pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 1Gi RWO rook-ceph-block
扩容
[root@k8s-master ~]# kubectl edit pvc mysql-pv-claim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
pv.kubernetes.io/bind-completed: "yes
pv.kubernetes.io/bound-by-controller: "yes
volume.beta.kubernetes.io/storage-provisioner: rook-ceph.rbd.csi.ceph.com
volume.kubernetes.io/storage-provisioner: rook-ceph.rbd.csi.ceph.com
creationTimestamp: "2023-07-23T00:52:41Z"
finalizers:
- kubernetes.io/pvc-protection
labels:
app: wordpress
name: mysql-pv-claim
namespace: default
resourceVersion: "34451"
uid: d8ae6350-186a-4deb-b301-ed7a7a71e9b8
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
##修改为 15G,原来是 10G,总共分配的大小
storage: 15Gi
storageclassName:rook-ceph-block
volumeMode: Filesystem
volumeName: pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8
status:
accessModes:
- ReadWriteonce
capacity:
##修改为 15G,原来是 10G,允许访问的大小
storage:15Gi
phase: Bound
- 保存退出后会同步更新
查看 PVC 修改结果
[root@k8s-master examples]# kubectl get pvc -n kube-system
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 15Gi RWO rook-ceph-block 89m
www-web-0 Bound pvc-57c8626d-a370-4345-abf3-d212465b5635 1Gi RWO rook-ceph-block 26m
www-web-1 Bound pvc-57c8626d-a370-4345-abf3-d212465b5635 1Gi RWO rook-ceph-block 25m
www-web-2 Bound pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611 1Gi RWO rook-ceph-block 24m
- mysql-pv-claim Bound pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 15Gi RWO rook-ceph-block 89m
查看 PV 扩容结果
[root@k8s-master examples]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-4ea4b53f-acab-4731-aa7d-bb4470c35c42 1Gi RWO Delete Bound default/www-web-1 rook-ceph-block 37m
pvc-57c8626d-a370-4345-abf3-d212465b5635 1Gi RWO Delete Bound default/www-web-0 rook-ceph-block 38m
pvc-a1037092-dfaa-47bd-b7f9-8f7be2248611 1Gi RWO Delete Bound default/www-web-2 rook-ceph-block 37m
pvc-d025b469-3d30-4a45-b7bb-e62ab8bf21e8 1Gi RWO Delete Bound default/www-web-1 rook-ceph-block 37m
pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 15Gi RWO Delete Bound default/mysql-pv-claim rook-ceph-block 90m
- pvc-d8ae6350-186a-4deb-b301-ed7a7a71e9b8 15Gi RWO Delete Bound default/mysql-pv-claim rook-ceph-block 90m
查看 Ceph Dashboard
获取 pod 状态信息
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 2m30s
web-1 1/1 Running 0 2m30s
web-2 1/1 Running 0 2m30s
wordpress-mysq1-79966d6c5b-wltpg 1/1 Running 0 115m
- wordpress-mysq1-79966d6c5b-wltpg 1/1 Running 0 115m
查看容器中的扩容结果
[root@k8s-master ~]# kubectl exec -it wordpress-mysql-79966d6c5b-wltpq -- df -Th
File Type Size Used Avail Use% Mounted on
overlay overlay 194G 20G 175G 11% /
tmpfs tmpfs 64M 0 64M 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/cgroup
/dev/mapper/centos-root xfs 194G 20G 175G 11% /etc/hosts
shm tmpfs 64M 0 64M 0% /dev/shm
/dev/rbd0 ext4 15G 116M 30G 1% /var/lib/mysql
tmpfs =tmpfs 3.7G 12K 3.7G 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs tmpfs 1.9G 0 1.9G 0% /proc/acpi
tmpfs tmpfs 1.9G 0 1.9G 0% /proc/scsi
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/firmware
扩容文件共享型 PVC
获取之前创建的文件共享型 PVC
[root@k8s-master ~]# kubectl get pvc -n kube-system
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
MODES Bound pvc-d025b469-3d30-4a45-b7bb-e62ab8bf21e8 1Gi RWX rook-cephfs 25m
修改大小
-
之前是 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