Hướng dẫn sử dụng NFS làm Persistent Storage cho cluster VKS

Hướng dẫn sử dụng NFS làm Persistent Storage cho cluster VKS

GreenNodeHelp Center

Cấu hình NFS làm Persistent Storage cho VKS Cluster

Hướng dẫn triển khai Persistent Storage hỗ trợ ReadWriteMany (RWX) cho VKS bằng hai phương án: tự dựng NFS Server trên vServer và sử dụng dịch vụ vStorage Filestore.


1. Giới thiệu

Persistent Volume mặc định trên VKS chỉ hỗ trợ access mode ReadWriteOnce (RWO) — volume chỉ có thể được mount bởi một node duy nhất tại một thời điểm. Khi workload yêu cầu nhiều pod trên nhiều node đồng thời đọc/ghi vào cùng một volume (ReadWriteMany — RWX), giải pháp là đặt NFS làm lớp lưu trữ trung gian.

Bài hướng dẫn này trình bày hai phương án triển khai:

  • Phương án A: Tự dựng NFS Server trên một vServer trong cùng subnet với worker node.
  • Phương án B: Sử dụng dịch vụ vStorage Filestore của VNG Cloud (NFS-as-a-Service), không cần tự cấu hình server.

2. Phương án A — Dùng vServer làm NFS Server

Thông tin môi trường ví dụ dùng trong bài:

  • IP NFS Server: 10.30.15.3
  • Thư mục export: /mnt/NFS
  • Dải IP worker node: 10.30.15.0/24
⚠ Lưu ý: NFS Server phải nằm cùng subnet với các worker node của VKS cluster để đảm bảo kết nối nội bộ hoạt động bình thường.

Bước 1: Cài đặt NFS Server trên vServer. Chạy các lệnh sau với quyền root:

sudo su
apt update && sudo apt -y upgrade
apt install -y nfs-server
mkdir /mnt/NFS

Bước 2: Cấu hình export thư mục NFS. Ghi cấu hình vào /etc/exports để cấp quyền truy cập cho dải IP worker node:

cat <<EOF >> /etc/exports
/mnt/NFS  10.30.15.0/24(rw,no_subtree_check,no_root_squash)
EOF

Khởi động NFS Server và áp dụng cấu hình export:

systemctl enable --now nfs-server
exportfs -ar

Bước 3: Cài đặt NFS Subdir External Provisioner lên VKS cluster. Provisioner này tạo StorageClass và tự động cấp phát PersistentVolume từ NFS, cho phép các hệ thống CI/CD tự request storage mà không cần thao tác thủ công:

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner

helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  --create-namespace \
  --namespace nfs-provisioner \
  --set nfs.server=10.30.15.3 \
  --set nfs.path=/mnt/NFS

Kết quả cài đặt NFS Subdir External Provisioner thành công

Bước 4: Tạo PersistentVolumeClaim (PVC) sử dụng StorageClass nfs-client vừa được tạo. Apply manifest sau:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: demo-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client
  resources:
    requests:
      storage: "2Gi"

PVC demo-pvc được tạo thành công với StorageClass nfs-client

Bước 5: Tạo Deployment mount PVC vào ứng dụng. Tạo file deployment.yml với nội dung sau rồi apply:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demoapp
  labels:
    app.kubernetes.io/name: pv-demo
spec:
  selector:
    matchLabels:
      app: demoapp
  template:
    metadata:
      labels:
        app: demoapp
    spec:
      containers:
      - name: demoapp
        image: vcr.vngcloud.vn/107444-khaivt/vks-pv-demo:latest
        ports:
        - containerPort: 3000
          name: http
        resources:
          requests:
            memory: "128Mi"
            cpu: "64m"
          limits:
            memory: "750Mi"
            cpu: "500m"
        volumeMounts:
          - name: data
            mountPath: /app/storage
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: demo-pvc

Deployment demoapp chạy thành công với PVC được mount

Tạo Service NodePort để expose ứng dụng ra ngoài. Tạo file svc.yml với nội dung sau rồi apply:

apiVersion: v1
kind: Service
metadata:
  name: demoapp
spec:
  type: NodePort
  ports:
    - name: http
      protocol: TCP
      port: 3001
      targetPort: http
      nodePort: 30090
  selector:
    app: demoapp

Service NodePort demoapp được tạo thành công

Bước 6: Kiểm tra hoạt động. Truy cập ứng dụng qua địa chỉ http://<IP-Node>:30090 và thực hiện upload một file thử nghiệm.

Sau khi upload, đăng nhập vào NFS Server và kiểm tra dữ liệu đã xuất hiện trong thư mục /mnt/NFS:

Dữ liệu file được lưu thành công trong thư mục NFS trên server

✅ Hoàn tất: Đã hoàn tất cấu hình NFS Server trên vServer làm Persistent Storage hỗ trợ ReadWriteMany cho VKS cluster.

3. Phương án B — Dùng vStorage Filestore làm NFS Storage

Phương án này sử dụng vStorage Filestore — dịch vụ NFS được quản lý hoàn toàn bởi VNG Cloud — không yêu cầu tự dựng hay vận hành NFS Server.

Bước 7: Khởi tạo một public Filestore tại https://efs.console.vngcloud.vn/file-storage theo tài liệu hướng dẫn của VNG Cloud. Sau khi khởi tạo, ghi lại endpoint và đường dẫn export (ví dụ trong bài: server hcm04.efs.vngcloud.vn, path /NFS-filestore).

Filestore đã được khởi tạo thành công trên vStorage

⚠ Lưu ý: Vì Phương án A đã tạo StorageClass tên nfs-client, phần này cần đặt tên StorageClass khác (second-nfs-client) để tránh xung đột và dễ phân biệt giữa hai nguồn storage.

Bước 8: Cài đặt Provisioner thứ hai trỏ đến Filestore, tạo StorageClass second-nfs-client. Namespace nfs-provisioner đã tồn tại từ Bước 3 nên không cần --create-namespace:

helm install second-nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  --namespace nfs-provisioner \
  --set nfs.server=hcm04.efs.vngcloud.vn \
  --set nfs.path=/NFS-filestore \
  --set storageClass.name=second-nfs-client \
  --set storageClass.provisionerName=k8s-sigs.io/second-nfs-subdir-external-provisioner

StorageClass second-nfs-client được tạo thành công trỏ đến Filestore

Bước 9: Tạo PVC sử dụng StorageClass second-nfs-client. Apply manifest sau:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: demo-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: second-nfs-client
  resources:
    requests:
      storage: "20Gi"

PVC demo-pvc được tạo thành công với StorageClass second-nfs-client

Triển khai Deployment và Service tương tự Bước 5, thay claimName thành PVC vừa tạo. Sau khi apply, ứng dụng sẽ sử dụng vStorage Filestore làm backend lưu trữ.

Ứng dụng demo hoạt động với Persistent Storage từ vStorage Filestore

Bước 10: Xác minh dữ liệu trên Filestore. Do console vStorage không cho phép duyệt file trực tiếp, cần mount Filestore vào một server rồi kiểm tra:

sudo mount -t nfs -o vers=4,hard,timeo=600,retrans=3,rsize=1048576,wsize=1048576,resvport,async \
  hcm04.efs.vngcloud.vn:/NFS-filestore /mnt/filestore

Xác minh dữ liệu trên vStorage Filestore sau khi mount vào server

✅ Hoàn tất: Đã hoàn tất cấu hình NFS làm Persistent Storage hỗ trợ ReadWriteMany cho VKS cluster bằng cả hai phương án. Phương án A phù hợp khi cần kiểm soát hoàn toàn NFS Server; Phương án B tiết kiệm công vận hành vì VNG Cloud quản lý hạ tầng NFS.

Với Phương án B, đảm bảo worker node có kết nối ra endpoint của Filestore (kiểm tra Security Group và route).

Tham số rsizewsize trong lệnh mount ảnh hưởng đến hiệu năng đọc/ghi; giá trị 1048576 (1 MiB) là khuyến nghị cho môi trường production.

Tài liệu tham khảo

    • Related Articles

    • Hướng dẫn sử dụng Storage Gateway

      Help Center Hướng Dẫn Cấu Hình và Sử Dụng Storage Gateway VNG Cloud Hướng dẫn từng bước để truy cập, cấu hình Credential, tạo user, tạo file share và kết nối client NFS/SMB với Storage Gateway. 1. Truy Cập Storage Gateway Bước 1: Sau khi khởi tạo ...
    • Hướng dẫn sử dụng vstorage api HAN02 lấy tempURL để upload file

      Help Center Hướng dẫn tạo Token và upload file qua Temp URL trên vStorage API HAN01 Mô tả các bước xác thực bằng Service Account và sử dụng Temp URL để upload object lên vStorage tại region HAN01. 1. Tạo Authen Token Bước 1: Truy cập trang quản lý ...
    • Hướng dẫn setup HA nginx đơn giản bằng keepalived sử dụng VIP

      Help Center Cấu hình High Availability với VIP, NGINX và Keepalived trên VNG Cloud Hướng dẫn triển khai cụm HA sử dụng Virtual IP Address kết hợp NGINX và keepalived trên nền tảng VNG Cloud, đảm bảo dịch vụ tiếp tục hoạt động khi một node gặp sự cố. ...
    • Get Access Token cho API vServer sử dụng tool Postman

      Help Center Hướng dẫn lấy Access Token để gọi vServer API Mô tả cách tạo Service Account và lấy Access Token thông qua Postman, phục vụ việc xác thực các request tới vServer API. 1. Tổng quan Mọi request gửi tới vServer API ...
    • hướng-dẫn-sử-dụng-vstorage-api-han02 lấy tempURL upload file

      Help Center Hướng Dẫn Generate Token Và Tạo Temp URL Upload Trên vStorage API Hướng dẫn từng bước tạo Authentication Token và sử dụng Temporary URL để upload file lên vStorage thông qua API. 1. Tạo Authentication Token Bước 1: Truy cập trang quản lý ...