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的數據已經恢復,也改成了持久化存儲。