PersistentVolume (pv) là một phần không gian lưu trữ dữ liệu trong cluster, các PersistentVolume giống với Volume bình thường tuy nhiên nó tồn tại độc lập với POD (pod bị xóa PV vẫn tồn tại), có nhiều loại PersistentVolume có thể triển khai như NFS, Clusterfs …
PersistentVolumeClaim (pvc) là yêu cầu sử dụng không gian lưu trữ (sử dụng PV). Hình dung PV giống như Node, PVC giống như POD. POD chạy nó sử dụng các tài nguyên của NODE, PVC hoạt động nó sử dụng tài nguyên của PV.
1. Tạo Persistent Volume trong Kubernetes
Tạo manifest với nội dung sau
cat > ./persistent-volume.yaml << OEF
apiVersion: v1
kind: PersistentVolume
metadata:
name: persistentvolume1
labels:
name: persistentvolume1
spec:
storageClassName: mystorage
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/home/mystorage"
OEF
Triển khai manifest
root@k8s-standalone:/home# kubectl apply -f ./persistent-volume.yaml
persistentvolume/persistentvolume1 created
Liệt kê các PV
root@k8s-standalone:/home# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
persistentvolume1 5Gi RWO Retain Available mystorage 3s Filesystem
Thông tin chi tiết
root@k8s-standalone:/home# kubectl describe pv/persistentvolume1
Name: persistentvolume1
Labels: name=persistentvolume1
Annotations: <none>
Finalizers: [kubernetes.io/pv-protection]
StorageClass: mystorage
Status: Available
Claim:
Reclaim Policy: Retain
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 5Gi
Node Affinity: <none>
Message:
Source:
Type: HostPath (bare host directory volume)
Path: /home/mystorage
HostPathType:
Events: <none>
2. Tạo Persistent Volume Claim trong Kubernetes
PVC (Persistent Volume Claim) là yêu cầu truy cập đến PV, một PV chỉ có một PVC
Tạo manifest như sau:
cat > ./persistent-volume-claim.yaml << OEF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: persistentvolumeclaim1
labels:
name: persistentvolumeclaim1
spec:
storageClassName: mystorage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 150Mi
OEF
Triển khai manifest
root@k8s-standalone:/home# kubectl apply -f persistent-volume-claim.yaml
persistentvolumeclaim/persistentvolumeclaim1 created
Verify lại pvc và pv đã được tạo
root@k8s-standalone:/home# kubectl get pvc,pv -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
persistentvolumeclaim/persistentvolumeclaim1 Bound persistentvolume1 5Gi RWO mystorage 9s Filesystem
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
persistentvolume/persistentvolume1 5Gi RWO Retain Bound default/persistentvolumeclaim1 mystorage 48s Filesystem
có thể xem chi tiết persistentvolumeclaim bằng cách sử dụng lệnh describe
root@k8s-standalone:/home# kubectl describe persistentvolumeclaim/persistentvolumeclaim1
Name: persistentvolumeclaim1
Namespace: default
StorageClass: mystorage
Status: Bound
Volume: persistentvolume1
Labels: name=persistentvolumeclaim1
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 5Gi
Access Modes: RWO
VolumeMode: Filesystem
Used By: <none>
Events: <none>
3. Sử dụng persistent volume và persistent volume claim với container.
cat > ./persistent-application.yaml << OEF
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: prometheus
spec:
selector:
matchLabels:
name: prometheus
template:
metadata:
name: prometheus
labels:
name: prometheus
spec:
volumes:
# Khai báo VL sử dụng PVC
- name: myvolume
persistentVolumeClaim:
claimName: persistentvolumeclaim1
containers:
- name: prometheus
image: prom/prometheus
resources:
limits:
memory: "50Mi"
cpu: "500m"
command:
- sleep
- "600"
volumeMounts:
- mountPath: "/data"
name: myvolume
OEF
Triển khai file persistent-application.yaml
root@k8s-standalone:/home# kubectl apply -f ./persistent-application.yaml
daemonset.apps/prometheus created
Verify DaemonSet App
root@k8s-standalone:/home# kubectl get po -l 'name=prometheus' -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
prometheus-d8rf7 1/1 Running 0 44s 10.244.20.155 k8s-standalone <none> <none>
Tạo file test
root@k8s-standalone:/home# mkdir -p /home/mystorage
root@k8s-standalone:/home# echo 'Chao mung den voi website cua HoangHD' > /home/mystorage/hoanghd.txt
Vào container vừa mới tạo kiểm tra ta thấy thư mục /home/mystorage của máy host đã mount vào /data của container thông qua persistent volume và persistent volume claim.
root@k8s-standalone:/home# kubectl exec -it po/prometheus-d8rf7 sh
/prometheus $ cat /data/hoanghd.txt
Chao mung den voi website cua HoangHD