容器属于“凤凰”型环境,即可以用后即焚。因此就需要持久化存储保存应用数据,为此才有了PersistentVolume、PersistentVolumeClaim、StorageClass这些概念和对象。
没使用持久化存储
- 创建一个项目,然后在其中部署一个应用,再生成应用的Route,最后获取Route访问地址。
$ oc new-project my-storage
$ oc new-app https://github.com/liuxiaoyu-git/image-uploader.git
$ oc expose svc image-uploader
$ oc get route image-uploader -o template --template '{{.spec.host}}'
image-uploader-persistent-storage.apps-crc.testing
- 查看pod状态,直到Running说明应用已经运行起来。
$ oc get pod
NAME READY STATUS RESTARTS AGE
image-uploader-1-build 0/1 Completed 0 8m46s
image-uploader-1-deploy 0/1 Completed 0 4m19s
image-uploader-1-xcbwx 1/1 Running 0 4m11s
- 用浏览器访问应用的Route地址,然后上传一个图片。确认可以查看到上传的图片的缩略图。
- 执行以下命令,将运行的Pod扩展为2个。
$ oc scale dc image-uploader --replicas=2
- 用一个新的浏览器打开image-uploader的Route地址,此时会发现新的浏览器中看不到图片缩略图,而原有浏览器可看到图片缩略图。在新的浏览器中上传另一个图片,会发现两各浏览器看到的是不同图片,这说明此时应用使用的是Pod的本地存储保存的图片。
- 执行命令删除2个pod,稍后OpenShift会自动2个新的Pod
$ oc delete pods -l app=image-uploader
$ oc get pod -w
- 用两个浏览器分别打开image-uploader应用Route链接,会发现图片全没有了。这说明Pod被删除后,其内部的图片会随之丢失。
使用持久化存储
- 在Administrator视图中Storage->Persistent Volume Claims中进入my-storage项目的Create Persistent Volume Claim,按下面创建PVC。
Name:my-image-pvc
Access Mode:Single User(RWO)
Size: 100MB
- 进入Workloads->Deployment Configs中image-uploader的配置页面,进入Action->Add Storage。
- 在页面中为Use existing claim选择my-image-pvc,然后将Mount Path设为“/opt/app-root/src/uploads”,然后点击Create按钮。此后OpenShift会自动重新部署。
- 完成后再次用一个浏览器访问该应用Route地址。在上传文件后,使用另一个浏览器可也能看到上传的图片。
- 分别通过2个Pod的Terminal查看/opt/app-root/src/uploads目录,可看到刚刚上传的图片。这说明2个Pod都使用了相同的存储。
- 再次删除2个Pod,OpenShift会自动新建2个Pod。通过浏览器访问应用,发现还可看到以前上传的图片。
$ oc delete pods -l app=image-uploader