Monday, January 20, 2025

[Kubernetes 11] Sử dụng Persistent Volume (pv) và Persistent Volume Claim (pvc) trong Kubernetes

-

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

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories