Cài đặt và sử dụng NFS CSI Driver (cho Kubernetes)

Điều kiên cần

  • Đã có Cluster với ít nhất 1 Node Group có 1 node trên VKS:

    • Bạn phải khởi tạo thành công một cluster trên nền tảng VKS.

    • Kubernetes version của cluster phải từ 1.21 trở lên.

    • Cluster phải có ít nhất một Node Group đang hoạt động.

    • Nếu chưa có, bạn cần tham khảo và thực hiện theo tài liệu hướng dẫn tại đây.

  • Đã có File Storage (NFS):

    • Bạn phải khởi tạo một File Storage theo giao thức NFS. Dịch vụ này có thể là Public File Storage hoặc Private File Storage.

    • Nếu bạn tạo Private File Storage thì file này phải được tạo trong cùng một VPC với VKS cluster của bạn để đảm bảo kết nối mạng. Chúng có thể nằm trong cùng hoặc khác subnet, miễn là trong cùng một VPC.

    • Nếu chưa có, bạn cần tham khảo và thực hiện theo tài liệu hướng dẫn tại đây.


Cài đặt NFS CSI Driver

Bước 1: Kết nối đến Cluster

  • Đầu tiên, bạn cần tải file cấu hình: Trên giao diện VKS Portal, chọn Download Config File và tải về file kubeconfig. File này chứa thông tin xác thực để kết nối đến cluster.

  • Kiểm tra kết nối: Mở terminal cuar bạn và chạy lệnh sau để xác minh rằng bạn đã kết nối thành công đến cluster:

kubectl get nodes
  • Ví dụ với Cluster bên dưới, tôi đã khởi tạo với 2 nodes:

# kubectl get nodes
NAME                                   STATUS   ROLES    AGE   VERSION
vks-demo-cluster-nodegroup-001-4ba81   Ready    <none>   6d    v1.29.13
vks-demo-cluster-nodegroup-001-bccb4   Ready    <none>   6d    v1.29.13

Bước 2: Cài đặt NFS CSI Driver

  • Chạy lệnh bên dưới để tải về và cài đặt NFS CSI Driver:

curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.5.0/deploy/install-driver.sh | bash -s v4.5.0 --
  • Sau khi cài đặt, kiểm tra trạng thái các pod qua lệnh:

kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
kubectl -n kube-system get pod -o wide -l app=csi-nfs-node
  • Kết quả mong đợi:

csi-nfs-controller-6866b7dfbf-xfd56   4/4     Running
csi-nfs-node-dc4km                    3/3     Running
csi-nfs-node-dq5fd                    3/3     Running

Kết quả như này tức là NFS CSI đã cài đặt thành công và 3 pods cần thiết cho NFS CSI đã hoạt động.


Tạo StorageClass

Storage Class (hay còn được gọi tắt là SC) là một mẫu để tạo ổ đĩa (PersistentVolume) tự động theo nhu cầu.

  • Đầu tiên, bạn cần lấy thông tin mount của File Storage NFS: Trên giao diện File Storage Portal, chọn Mount guide và lưu các thông tin IP cũng như folder thực hiện mount.

  • Bây giờ, bạn hãy tạo Storage Class bằng cách tạo file nfs-sc.yaml với nội dung:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi       # Tên Storage Class
provisioner: nfs.csi.k8s.io
parameters:
  server: 10.7.9.5    # IP của filestorage (lấy từ thông tin mount guide trên File Storage Portal)
  share: /demo-nfs    # mountpoint (lấy từ thông tin mount guide trên File Storage Portal)
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - nfsvers=4
  - hard
  - timeo=600
  - retrans=3
  - rsize=1048576
  - wsize=1048576
  - resvport
  - async
  • Tiếp theo, chạy câu lệnh sau đây để triển khai tạo storage class và kiểm tra thông tin:

kubectl apply -f nfs-sc.yaml
kubectl get storageclasses
kubectl describe storageclass nfs-csi
  • Kết quả mong muốn:

# kubectl apply -f nfs-sc.yaml
# kubectl get storageclasses
# kubectl describe storageclass nfs-csi
storageclass.storage.k8s.io/nfs-csi created
NAME                                  PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
nfs-csi                               nfs.csi.k8s.io       Delete          Immediate              false                  0s
vngcloud-nvme-5000-delete (default)   bs.csi.vngcloud.vn   Delete          WaitForFirstConsumer   true                   6d
vngcloud-ssd-3000-delete              bs.csi.vngcloud.vn   Delete          WaitForFirstConsumer   true                   6d
Name:            nfs-csi
IsDefaultClass:  No
Annotations:     kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"nfs-csi"},"mountOptions":["nfsvers=4","hard","timeo=600","retrans=3","rsize=1048576","wsize=1048576","resvport","async"],"parameters":{"server":"10.7.9.5","share":"/demo-nfs"},"provisioner":"nfs.csi.k8s.io","reclaimPolicy":"Delete","volumeBindingMode":"Immediate"}

Provisioner:           nfs.csi.k8s.io
Parameters:            server=10.7.9.5,share=/demo-nfs
AllowVolumeExpansion:  <unset>
MountOptions:
  nfsvers=4
  hard
  timeo=600
  retrans=3
  rsize=1048576
  wsize=1048576
  resvport
  async
ReclaimPolicy:      Delete
VolumeBindingMode:  Immediate
Events:             <none>

Tạo và sử dụng PVC

PersistentVolumeClaim (hay còn gọi là PVC) là yêu cầu người dùng gửi ra để xin một ổ đĩa lưu trữ có kích thước cụ thể. Khi bạn tạo một PVC, Kubernetes sẽ dùng SC để tạo hoặc chọn một ổ đĩa phù hợp.

  • Tạo file nfs-pvc.yamlvới nội dung sau:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
    volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
  name: pvc-nfs-dynamic        # Tên PVC
  namespace: default
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 3Gi            # Kích thước mong muốn cho PVC
  storageClassName: nfs-csi   # Tên Storage Class, tên này phải khớp với Storage Class Name đã tạo bên trên
  volumeMode: Filesystem
  • Chạy câu lệnh sau đây để triển khai tạo pvc và kiểm tra việc cài đặt:

kubectl apply -f nfs-pvc.yaml
kubectl get pvc
kubectl describe pvc pvc-nfs-dynamic
  • Kết quả mong muốn:

# kubectl apply -f nfs-pvc.yaml
# kubectl get pvc
# kubectl describe pvc pvc-nfs-dynamic
persistentvolumeclaim/pvc-nfs-dynamic created
NAME              STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
pvc-nfs-dynamic   Pending                                      nfs-csi        <unset>                 0s
Name:          pvc-nfs-dynamic
Namespace:     default
StorageClass:  nfs-csi
Status:        Bound
Volume:        pvc-6ed4097b-d8fb-41c8-ba9c-7147a652ff83
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
               volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      3Gi
Access Modes:  RWX
VolumeMode:    Filesystem
Used By:       <none>
Events:
  Type    Reason                 Age   From                                                                                      Message
  ----    ------                 ----  ----                                                                                      -------
  Normal  ExternalProvisioning   0s    persistentvolume-controller                                                               Waiting for a volume to be created either by the external provisioner 'nfs.csi.k8s.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.
  Normal  Provisioning           0s    nfs.csi.k8s.io_vks-demo-cluster-nodegroup-001-4ba81_d071c067-6d99-4d90-87cf-01f89c32a2c4  External provisioner is provisioning volume for claim "default/pvc-nfs-dynamic"
  Normal  ProvisioningSucceeded  0s    nfs.csi.k8s.io_vks-demo-cluster-nodegroup-001-4ba81_d071c067-6d99-4d90-87cf-01f89c32a2c4  Successfully provisioned volume pvc-6ed4097b-d8fb-41c8-ba9c-7147a652ff83

Deploy ứng dụng sử dụng PVC

Bên dưới là hướng dẫn tạo deployment nginx sử dụng PVC mà bạn vừa tạo bên trên:

  • Tạo file nginx-deployment.yamlvới nội dung sau:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-nfs                                  # Tên pod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-nfs
  template:
    metadata:
      labels:
        app: nginx-nfs
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        volumeMounts:
        - name: nfs-storage    
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-storage
        persistentVolumeClaim:
          claimName: pvc-nfs-dynamic                # Tên PVC

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-nfs-service
spec:
  selector:
    app: nginx-nfs
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
  • Chạy câu lệnh sau đây để triển khai tạo service và deployment:

kubectl apply -f nginx-deployment.yaml
  • Kết quả mong muốn:

# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-nfs created
service/nginx-nfs-service created

Kiểm tra NFS File Storage sau khi triển khai

  • Đầu tiên, bạn có thể kiểm tra PVC đã bound chưa qua lệnh:

kubectl get pvc pvc-nfs-dynamic
  • Kết quả mong đợi:

# kubectl get pvc pvc-nfs-dynamic
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
pvc-nfs-dynamic   Bound    pvc-6ed4097b-d8fb-41c8-ba9c-7147a652ff83   3Gi        RWX            nfs-csi        <unset>                 109s
  • Bây giờ, bạn có thể Deploy Pod test để ghi dữ liệu bằng cách tạo file test-pod.yaml theo mầu:

apiVersion: v1
kind: Pod
metadata:
  name: test-nfs-writer
spec:
  containers:
  - name: busybox
    image: busybox
    command: ["/bin/sh", "-c", "while true; do echo $(date) >> /mnt/data/testfile; sleep 5; done"]
    volumeMounts:
    - name: nfs-storage
      mountPath: /mnt/data
  volumes:
  - name: nfs-storage
    persistentVolumeClaim:
      claimName: pvc-nfs-dynamic
  • Chạy câu lệnh sau đây để triển khai tạo pod và kiểm tra:

kubectl apply -f test-pod.yaml
kubectl get pods -w
  • Kết quả mong muốn:

# kubectl apply -f test-pod.yaml
# kubectl get pods -w
pod/test-nfs-writer configured
NAME                         READY   STATUS    RESTARTS   AGE
nginx-nfs-6df57b7f6b-gptfj   1/1     Running   0          3m25s
nginx-nfs-6df57b7f6b-mbxx8   1/1     Running   0          3m25s
nginx-nfs-6df57b7f6b-sgcxh   1/1     Running   0          3m25s
nsenter-2fzs6c               1/1     Running   0          21h
test-nfs-writer              1/1     Running   0          2m3s
  • Bạn cũng có thể kiểm tra dữ liệu đã ghi qua lệnh:

kubectl exec -it test-nfs-writer -- ls -lh /mnt/data
kubectl exec -it test-nfs-writer -- du -sh /mnt/data
  • Kết quả mong muốn:

# kubectl exec -it test-nfs-writer -- ls -lh /mnt/data
# kubectl exec -it test-nfs-writer -- du -sh /mnt/data
total 1K
-rw-r--r--    1 nobody   nobody       841 Aug 13 04:04 testfile
1.5K    /mnt/data
  • Và cuối cùng, bạn có thể kiểm tra usage của File storage thông qua portal.


Advanced Options

Một số option nâng cao bạn có thể sử dụng khi tạo Storage Class:

  • Retain Policy:

reclaimPolicy: Retain  # Giữ lại data khi PVC bị xóa
  • Delayed Binding:

volumeBindingMode: WaitForFirstConsumer  # Chờ đến khi có Pod sử dụng mới provisioning

Last updated