一文解析Kubernetes使用PVC后數(shù)據(jù)丟失
問題現(xiàn)象
使用官方postgresql
鏡像,通過pvc
將云硬盤掛載至數(shù)據(jù)目錄,每次重建Pod,數(shù)據(jù)庫數(shù)據(jù)都會(huì)丟失。
復(fù)現(xiàn)
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: postgresql-persistent-storage namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: cbs volumeMode: Filesystem --- apiVersion: apps/v1 kind: Deployment metadata: name: postgresql-deployment spec: selector: matchLabels: app: postgresql template: metadata: labels: app: postgresql spec: containers: - image: postgres:12.4 name: postgresql env: - name: POSTGRES_PASSWORD value: "123456" ports: - containerPort: 5432 name: postgresql volumeMounts: - name: postgresql-persistent-storage ## 注意掛載點(diǎn) mountPath: /var/lib/postgresql volumes: - name: postgresql-persistent-storage persistentVolumeClaim: claimName: postgresql-persistent-storage
使用上述提供的 yaml
創(chuàng)建工作負(fù)載,完成后可看到 Pod 正常運(yùn)行。
根據(jù)dockerhub
官方鏡像的說明中,鏡像數(shù)據(jù)庫文件存儲(chǔ)的默認(rèn)目錄為/var/lib/postgresql/data
上述yaml
中,將持久化存儲(chǔ)掛載到/var/lib/postgresql
,看似無問題,容器也可以正常啟動(dòng),但是其實(shí)數(shù)據(jù)庫文件并沒有寫入 PVC 中,當(dāng) Pod 發(fā)生重啟重新調(diào)度時(shí),數(shù)據(jù)庫文件便會(huì)丟失。
問題分析
進(jìn)入 Pod, 通過 findmnt
命令,可以清楚地看到數(shù)據(jù)庫存儲(chǔ)文件并未保存在數(shù)據(jù)盤中,而是使用 volume 的方式掛載,被掛載到了/dev/vda1
中,所以導(dǎo)致 Pod 重啟時(shí),該目錄被自動(dòng)釋放,數(shù)據(jù)丟失。
那是什么原因造成的呢?
我們登錄 Pod 所在的節(jié)點(diǎn)
通過docker history --no-trunc postgres:12.4
查看鏡像的構(gòu)建歷史發(fā)現(xiàn),此鏡像構(gòu)建所使用的 Dockerfile
使用了 VOLUME
命令,手工掛載了/var/lib/postgresql/data
Dockerfile
構(gòu)建后的鏡像中,VOLUME
中的操作并不會(huì)被Kubernetes
忽略,而是會(huì)繼續(xù)掛載。
即先掛載kubelet
給加的volume
,后掛載image.config.volumes
,image.config.volumes
不會(huì)覆蓋掉kubelet
的volume
。
如需要將其使用 PVC 覆蓋目錄,必須手工指定 PVC 的掛載點(diǎn)與其同地址,即將volumeMounts
中的mountPath
從/var/lib/postgresql
調(diào)整為/var/lib/postgresql/data
。
apiVersion: apps/v1 kind: Deployment metadata: name: postgresql-deployment spec: selector: matchLabels: app: postgresql template: metadata: labels: app: postgresql spec: containers: - image: postgres:12.4 name: postgresql env: - name: POSTGRES_PASSWORD value: "123456" ports: - containerPort: 5432 name: postgresql volumeMounts: - name: postgresql-persistent-storage mountPath: /var/lib/postgresql/data volumes: - name: postgresql-persistent-storage persistentVolumeClaim: claimName: postgresql-persistent-storage
新建測(cè)試文件,并刪除 Pod 后測(cè)試數(shù)據(jù)寫入
以上就是一文解析Kubernetes使用PVC后數(shù)據(jù)丟失的詳細(xì)內(nèi)容,更多關(guān)于Kubernetes PVC后數(shù)據(jù)丟失的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 詳解Kubernetes 中容器跨主機(jī)網(wǎng)絡(luò)
- Kubernetes?Ingress實(shí)現(xiàn)細(xì)粒度IP訪問控制
- Kubernetes如何限制不同團(tuán)隊(duì)只能訪問各自namespace實(shí)現(xiàn)
- 詳解Rainbond云原生平臺(tái)簡(jiǎn)化Kubernetes業(yè)務(wù)問題排查
- Kubernetes上使用Jaeger分布式追蹤基礎(chǔ)設(shè)施詳解
- IoT?邊緣集群Kubernetes?Events告警通知進(jìn)一步配置詳解
- IoT邊緣集群Kubernetes?Events告警通知實(shí)現(xiàn)示例
- kubernetes之statefulset搭建MySQL集群
相關(guān)文章
K8S?prometheus?operator監(jiān)控工作原理介紹
這篇文章主要為大家介紹了K8S?prometheus?operator監(jiān)控工作原理介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11k8s部署Ingress并創(chuàng)建規(guī)則的詳細(xì)介紹
這篇文章主要介紹了k8s部署Ingress并創(chuàng)建規(guī)則,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03k8s入門實(shí)戰(zhàn)deployment使用詳解
這篇文章主要為大家介紹了k8s入門實(shí)戰(zhàn)deployment使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Rainbond部署組件Statefulset的使用官方文檔
這篇文章主要為大家介紹了官方文檔Rainbond部署組件Statefulset的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-042022最新青龍面板對(duì)接機(jī)器人的詳細(xì)過程(傻妞對(duì)接onebot(oicq)協(xié)議實(shí)現(xiàn)機(jī)器人功能)
這篇文章主要介紹了2022最新青龍面板對(duì)接機(jī)器人的詳細(xì)過程(傻妞對(duì)接onebot(oicq)協(xié)議實(shí)現(xiàn)機(jī)器人功能),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05