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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章