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.
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:
Thông tin môi trường ví dụ dùng trong bài:
10.30.15.3/mnt/NFS10.30.15.0/24Bướ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
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"
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
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
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:
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).
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
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"
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ữ.
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
▸ 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ố rsize và wsize 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.