[Kubernetes / K8s] PV/ PVC 儲存大小事交給PV/PVC管理

KouWei.Lee
k8s筆記
Published in
5 min readFeb 24, 2021

PV 是 K8s持久化的抽象底層可以對接實體儲存

PVC 是 K8s 提供的解耦機制在Volume跟PV 之間多一層 抽象

解決Pod與具體存儲Volume 耦合 → 引入了 PV/ PVC 進行解耦

上篇提到Volume提供了掛載到容器的文件系統讓我們的資料不會跟著Pod一起死掉

Volume 的發布問題

發布文件內必須寫具體的儲存位置造成耦合

可以看下圖當中紅線匡起部分

帶來的問題:發布環境侷限不能進行遷移 → 要遷移就要修改文件

可以看到當中的hostPath: path

解決辦法 PV/ PVC 進行解藕

解決Pod與具體存儲Volume 耦合 → 引入了 PV/ PVC 進行解藕

PVC功能

1.解耦 讓Volume 跟具體儲存位置解耦提供靈活性與可移植性

2.職責分離 Volume和PVC由開發人員定義, 提出存儲需求就好

讓K8s管理員去做綁定實體的持久化存儲

PVC 只規範存取需求 ex:存儲大小

具體可以參考K8s PV 官網

實作PV ,PVC

local-pv.yml

apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
storageClassName: stardard
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
hostPath:
path: "/tmp/data02"
type: "DirectoryOrCreate"

mysql-pvc.yml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 250Mi
storageClassName: stardard

mysql-svc.yml

apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
minReadySeconds: 10 #表示Port起來要等10秒 有延遲方便查看效果
selector:
matchLabels:
app: mysql #標籤要和template label裡面一樣
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: petclinic
- name: MYSQL_DATABASE
value: petclinic
volumeMounts:
- name: mysql-persistent-volume #要與volumes 裡面name一樣
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-volume
persistentVolumeClaim:
claimName: mysql-pvc

---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- name: tcp
port: 3306
targetPort: 3306
selector:
app: mysql
type: ClusterIP

不需要知道具體PV/ 儲存位置

發布

kubectl apply -f .

查看

kubectl get pvc  #可以看到local-pv

應用運行

成功

刪除mysql Pod 後依然可以運行成功

Sum Up

PersistentVolumeClaim(PVC)?

PVC 是 K8s 提供的解耦機制在Volume跟PV 之間多一層 抽象

PersistentVolume?

PV 是 K8s持久化的抽象底層可以對接實體儲存

Pod→ Volume →PVC → PV →物理儲存的地方

Pod 可以關聯Volume 掛載Volume

Volume可以對接引用PVC

PVC可以綁定PV

PV可以對接具體的物理儲存

PVC 實現了解耦跟職責分離

--

--