Published on

Thiết lập và dụng NFS Persistent Volume trên Kubernetes

Mở đầu

Bài viết này sẽ hướng dẫn các bạn cấu hình và sử dụng bộ nhớ NFS (Network Files System) trên Kubernetes cluster.

Hãy cùng đọc 1 chút về 2 khái niệm Persistent Volume và Persistent Volume Claim mà mình đã góp nhặt trên Internet.

Persistent Volumes

PersistentVolume (PV) là một phần không gian lưu trữ dữ liệu trong cụm được cấp phát bởi Cluster Admin hoặc được cấp phát linh hoạt. Nó là một loại tài nguyên của của cụm cũng giống như 1 node là tài nguyên của cụm. Các PV này cũng giống như các Volume thuần khác, tuy nhiên nó tồn tại hoàn toàn độc lập với bất kỳ pod nào sử dụng PV. Hiện tại, Kubernetes hỗ trợ rất nhiều các loại PersistentVolume khác nhau được cài đặt dưới dạng plugin như glusterfs, nfs, csi, ...

Persistent Volume Claim

Một người dùng muốn sử dụng không gian lưu trữ (PV) thì cần tạo một PersistentVolumeClaim (PVC). Nó chính là một yêu cầu sử dụng không gian lưu trữ (yêu cầu sử dụng PV). Thông thường người dùng sẽ tạo một manifest PersistentVolumeClaim, chỉ định số lượng, loại lớp lưu trữ (storage class), yêu cầu các mức tài nguyên CPU, bộ nhớ,... Ngoài ra, PVC còn có thể xác định các chế độ quyền truy cập cụ thể vào vùng lưu trữ (ví dụ như: ReadWriteOnce, ReadOnlyMany or ReadWriteMany - bạn có thể xem thêm chi tiết về các quyền này tại đây). Kubernetes sau đó sẽ dựa vào các thông tin này để tìm và dự trữ dung lượng lưu trữ cần thiết.

Bộ nhớ NFS

Để có thể sử dụng được NFS Persitent Volume thì ngoài có 1 K8s cluster thì bạn cần phải có 1 NFS server. Bạn có thể xem các bài viết Microsoft Hyper-V Server - Cài đặt NFS server

Triển khai NFS PVC

File nfs-pv.yaml dùng để tạo tài nguyên PersistentVolume trên K8s:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: nfs-pv
  labels:
    app: your-app-name
spec:
  capacity:
    storage: 5Gi # Dung lượng bộ nhớ
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 10.10.10.101
    path: '/data-1'

Trong đó:

  • 10.10.10.101: là IP của NFS server. Bạn cần thiết lập NFS server cho phép K8s cluster có quền truy cập vào mà không cần xác thực (không đòi user + pass).
  • /data-1: là thư mục trên NFS server mà PersistentVolume sẽ sử dụng. (Bạn phải tạo sẵn thư mục này trên NFS server)

File nfs-pvc.yaml dùng để tạo tài nguyên PersistentVolumeClaim trên K8s:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs-pvc
  labels:
    app: your-app-name
spec:
  selector:
    matchLabels:
      app: your-app-name
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  volumeName: nfs-pv

Lưu ý:

  • Tên của PersistentVolume ( Trong ví dụ này: nfs-pv) phải không bị trùng lăp với các PersistentVolume khác trên cluster.
  • Tên của PersistentVolumeClaim ( Trong ví dụ này: nfs-pvc) phải không bị trùng lăp với các PersistentVolumeClaim khác trên cùng namespace.

Bây giờ hãy khởi tạo các tài nguyên đó trên K8s cluster:

kubectl apply -f nfs-pv.yaml
kubectl apply -f nfs-pvc.yaml

Ví dụ Deployment sử dụng NFS PVC

File nfs-deployment.yaml dùng để tạo tài nguyên Deployment trên K8s:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: assets-cdn
  labels:
    app: your-app-name
spec:
  replicas: 1
  selector:
    matchLabels:
      app: your-app-name
  template:
    metadata:
      labels:
        app: your-app-name
    spec:
      containers:
        - name: assets-cdn
          image: nginx:alpine
          imagePullPolicy: Always
          ports:
            - containerPort: 80
          volumeMounts:
            - name: assets
              mountPath: '/usr/share/nginx/html'
      volumes:
        - name: assets
          persistentVolumeClaim:
            claimName: nfs-pvc

Trong ví dụ này, tài nguyên Deployment sẽ tạo 1 Pod có sử dụng NFS PVC nfs-pvc mà chúng ta đã tạo ở trên. Hãy thử khởi tạo tài nguyên này trên K8s:

kubectl apply -f nfs-deployment.yaml

Tham khảo thêm