openshift内部镜像仓库Registry组件默认是非持久化的。之前重启过一次openshift集群,导致重启前通过s2i构建的镜像都不能用了。所以需要持久化openshift内部镜像仓库。
有状态的应用如果未配置持久化卷,容器一旦意外退出,容器内部所有的镜像、配置、数据都将消失殆尽。
本部分参考《开源容器云OpenShift》一书129-133页以及官方文档https://docs.openshift.org/latest/install_config/registry/index.html部分的内容。
# oc project default
# oc get pod
# oc volumes dc/docker-registry --all
Registy已经创建了一个Volume Mounts对象registry-storage,挂载点指向了/registry目录,使用的是empty directory卷。要做的就是给registry-storage挂载点挂载一个持续化的后端。
之前在执行S2I的时候往Registry推送了不少镜像,需要备份这些镜像。
这里指令中需要替换pod的名称为当前docker-registry pod的名称。
# oc rsh docker-registry-1-fg6kd 'du' '-sh' '/registry'
需要备份这些数据,通过oc rsync命令,将容器中某个目录的数据同步到宿主机上。
# mkdir /root/backup
# cd /root/backup
# oc rsync docker-registry-1-fg6kd:/registry .
备份完成了会有提示。
采用NFS作为后端的存储。
# mkdir -p /exports/images
# yum -y install nfs-utils rpcbind
# chown nfsnobody:nfsnobody /exports/ -R
# echo "/exports/images *(rw,sync,all_squash)" >> /etc/exports
# systemctl start rpcbind
# systemctl enable rpcbind
# exportfs -r
# systemctl start nfs-server
# systemctl enable nfs-server
添加以下规则
-A INPUT -p tcp --dport 2049 -j ACCEPT
-A INPUT -p udp --dport 2049 -j ACCEPT
# systemctl restart iptables
# mount 10.126.3.207:/exports/images /mnt/
# touch /mnt/test
# ls /mnt
# rm -f /mnt/test
# umount /mnt
{
"apiVersion": "v1",
"kind": "PersistentVolume",
"metadata": {
"name": "images"
},
"spec": {
"capacity": {
"storage": "80Gi"
},
"accessModes": [ "ReadWriteOnce" ],
"nfs": {
"path": "/exports/images",
"server": "10.126.3.207"
},
"persistentVolumeReclaimPolicy": "Retain"
}
}
# oc create -f images-pv.json
# oc get pv
我分配了80G的存储空间。
在Master上将一下JSON存储为images-pvc.json,声明需要80GB的后端存储,访问方式为ReadWriteOnce。
{
"apiVersion": "v1",
"kind": "PersistentVolumeClaim",
"metadata": {
"name": "docker-registry-claim"
},
"spec": {
"accessModes": [
"ReadWriteOnce"
],
"resources": {
"requests": {
"storage": "80Gi"
}
}
}
}
# oc create -f images-pvc.json
持久化卷请求和持久化卷已连接起来。
# mv /root/backup/registry/* /exports/images/
# chown nfsnobody:nfsnobody /exports/ -R
# oc volume dc/docker-registry --add --name=registry-storage -t pvc --claim-name=docker-registry-claim --overwrite
Deployment Config的容器定义修改后,Openshift会创建新的容器实例。等待容器运行起来。
6.1G的数据已经恢复,也改成了持久化存储。