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