openshift/origin工作记录(7)——持久化openshift内部镜像仓库

openshift内部镜像仓库Registry组件默认是非持久化的。之前重启过一次openshift集群,导致重启前通过s2i构建的镜像都不能用了。所以需要持久化openshift内部镜像仓库。

有状态的应用如果未配置持久化卷,容器一旦意外退出,容器内部所有的镜像、配置、数据都将消失殆尽。

本部分参考《开源容器云OpenShift》一书129-133页以及官方文档https://docs.openshift.org/latest/install_config/registry/index.html部分的内容。

检查挂载点

  • 以集群管理员身份登录Openshift,切换到default工程,查看Registry的容器状态
# oc project default
# oc get pod

这里写图片描述

  • 查看Registry组件的Deployment Config关于Volume的定义
# oc volumes dc/docker-registry --all

这里写图片描述

Registy已经创建了一个Volume Mounts对象registry-storage,挂载点指向了/registry目录,使用的是empty directory卷。要做的就是给registry-storage挂载点挂载一个持续化的后端。

备份数据

之前在执行S2I的时候往Registry推送了不少镜像,需要备份这些镜像。

  • 查看Registry容器内/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
  • 查看nfs-server端口,这里没做修改,采用的都是默认配置

这里写图片描述

  • 修改/etc/sysconfig/iptables

添加以下规则

-A INPUT -p tcp --dport 2049 -j ACCEPT
-A INPUT -p udp --dport 2049 -j ACCEPT
  • 重启iptables
# systemctl restart iptables
  • 测试挂载该NFS共享目录,并尝试创建一个文件
# mount 10.126.3.207:/exports/images /mnt/
# touch /mnt/test
# ls /mnt
# rm -f /mnt/test
# umount /mnt

这里写图片描述

创建持久化卷

  • 根据上创建的NFS信息,创建持久化卷。在Master上将如下JSON保存为images-pv.json
{
  "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
  • 查看持久化卷请求和持久化卷的状态

这里写图片描述

持久化卷请求和持久化卷已连接起来。

关联持久化卷请求

  • 将备份的数据恢复到前文创建的NFS目录中
# mv /root/backup/registry/* /exports/images/
# chown nfsnobody:nfsnobody /exports/ -R
  • 为Registry的容器定义添加持久化卷请求,并与挂载点registry-storage关联
# oc volume dc/docker-registry --add --name=registry-storage -t pvc --claim-name=docker-registry-claim --overwrite

Deployment Config的容器定义修改后,Openshift会创建新的容器实例。等待容器运行起来。

  • 验证

这里写图片描述

6.1G的数据已经恢复,也改成了持久化存储。

猜你喜欢

转载自blog.csdn.net/huqigang/article/details/78970315