概述
在容器中跑有状态的应用会碰到很多头疼问题,今天我们就来说说mysql作为有状态的服务。
容器中挂载存储需要考虑两种场景,一种是创建一个干净的pvc,然后挂载到容器中,容器开始往存储写入数据;一种是存储中已经存在数据了,容器需要使用这个数据并继续写入。
-
第一种场景可以采用动态存储storageclass,也可以采用静态存储pv。
-
第二种场景只能采用静态存储pv,因为需要在ceph pool中创建指定的image来给容器用。
对于mysql数据库就是第二种场景,我们需要把mysql的数据存储/var/lib/mysql从之前的物理机上迁移到ceph存储,然后再挂载到容器里面使用。
搭建ceph集群
请参照之前的文章
创建pool
请参照之前的文章
在pool下创建image
rbd create <image> -p <pool> --size 1024M --image-format 2
将镜像映射进内核,生成rbd设备
rbd map <image> --pool <pool>
mount到ceph monitor节点的一个目录下
mount /dev/rbd0 /mnt/test
把/var/lib/mysql目录打包,然后传到刚刚创建的image里面
tar czf mysql.tar.gz . -C /var/lib/mysql/
scp mysql.tar.gz user@targart_ip
tar zxf mysql.tar.gz
rm -f mysql.tar.gz
把/mnt/test改成容器中需要的用户,组和权限
chown -R mysql.mysql /mnt/test
chmod -R 755 /mnt/test
在openshift中创建pv
pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
rbd:
monitors:
- 10.131.31.19:6789,10.131.31.21:6789,10.131.31.22:6789
pool: kube
image: mysql
user: admin
secretRef:
name: ceph-admin-secret
namespace: kube-system
fsType: ext4
imageFormat: "2"
imageFeatures: "layering"
readOnly: false
persistentVolumeReclaimPolicy: Recycle
创建pvc, 大小1G
pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
volumeName: mysql
指定volumeName为pv的name,可以避免创建的pv被其他pvc绑定了
pv是存储资源,当pv创建好后,pv会被已经存在的pvc绑定,一旦绑定这个pv就不能被其他pvc使用,除非那个pvc被删除了,那时,pv会变成Released状态
当指定的pvc与pv绑定成功后,在DeploymentConfig中添加pvc
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql
volumes:
- name: mysql
persistentVolumeClaim:
claimName: mysql
10.部署容器,并登陆到容器中查看存储挂载情况
oc exec -it xxxx /bin/bash
更多容器技术请关注公众号: