[Kubernetes / K8s] PV/ PVC 儲存大小事交給PV/PVC管理
Published in
5 min readFeb 24, 2021
PV 是 K8s持久化的抽象底層可以對接實體儲存
PVC 是 K8s 提供的解耦機制在Volume跟PV 之間多一層 抽象
解決Pod與具體存儲Volume 耦合 → 引入了 PV/ PVC 進行解耦
上篇提到Volume提供了掛載到容器的文件系統讓我們的資料不會跟著Pod一起死掉
Volume 的發布問題
發布文件內必須寫具體的儲存位置造成耦合
可以看下圖當中紅線匡起部分
帶來的問題:發布環境侷限不能進行遷移 → 要遷移就要修改文件
解決辦法 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可以對接具體的物理儲存