溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kubernetes使用PVC后數(shù)據(jù)丟失怎么解決

發(fā)布時(shí)間:2023-03-09 09:49:15 來(lái)源:億速云 閱讀:116 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下Kubernetes使用PVC后數(shù)據(jù)丟失怎么解決的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

問(wèn)題現(xiàn)象

使用官方postgresql鏡像,通過(guò)pvc將云硬盤(pán)掛載至數(shù)據(jù)目錄,每次重建Pod,數(shù)據(jù)庫(kù)數(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)行。

Kubernetes使用PVC后數(shù)據(jù)丟失怎么解決

根據(jù)dockerhub官方鏡像的說(shuō)明中,鏡像數(shù)據(jù)庫(kù)文件存儲(chǔ)的默認(rèn)目錄為/var/lib/postgresql/data

Kubernetes使用PVC后數(shù)據(jù)丟失怎么解決

上述yaml中,將持久化存儲(chǔ)掛載到/var/lib/postgresql,看似無(wú)問(wèn)題,容器也可以正常啟動(dòng),但是其實(shí)數(shù)據(jù)庫(kù)文件并沒(méi)有寫(xiě)入 PVC 中,當(dāng) Pod 發(fā)生重啟重新調(diào)度時(shí),數(shù)據(jù)庫(kù)文件便會(huì)丟失。

問(wèn)題分析

進(jìn)入 Pod, 通過(guò) findmnt命令,可以清楚地看到數(shù)據(jù)庫(kù)存儲(chǔ)文件并未保存在數(shù)據(jù)盤(pán)中,而是使用 volume 的方式掛載,被掛載到了/dev/vda1中,所以導(dǎo)致 Pod 重啟時(shí),該目錄被自動(dòng)釋放,數(shù)據(jù)丟失。

Kubernetes使用PVC后數(shù)據(jù)丟失怎么解決

那是什么原因造成的呢?

我們登錄 Pod 所在的節(jié)點(diǎn)

通過(guò)docker history --no-trunc postgres:12.4查看鏡像的構(gòu)建歷史發(fā)現(xiàn),此鏡像構(gòu)建所使用的 Dockerfile使用了 VOLUME命令,手工掛載了/var/lib/postgresql/data

Kubernetes使用PVC后數(shù)據(jù)丟失怎么解決

Dockerfile構(gòu)建后的鏡像中,VOLUME中的操作并不會(huì)被Kubernetes忽略,而是會(huì)繼續(xù)掛載。

即先掛載kubelet給加的volume,后掛載image.config.volumes,image.config.volumes不會(huì)覆蓋掉kubeletvolume。

如需要將其使用 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

Kubernetes使用PVC后數(shù)據(jù)丟失怎么解決

新建測(cè)試文件,并刪除 Pod 后測(cè)試數(shù)據(jù)寫(xiě)入

Kubernetes使用PVC后數(shù)據(jù)丟失怎么解決

以上就是“Kubernetes使用PVC后數(shù)據(jù)丟失怎么解決”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI