Published on

Thiết lập Kubernetes NFS Subdir External Provisioner

Mở đầu

Ở bài viết trước mình đã trình bày cách Thiết lập và dụng NFS Persistent Volume trên Kubernetes, cách có nhước điểm là phải cấu hình thủ công. Với mỗi PVC bạn phải tạo trước folder riêng cho PVC đó trên NFS server, điều này chúng ta mất thời gian khi cần tạo hoặc quản lý số lượng PVC lớn.

Bài viết này sẽ trình bày cách thiết lập và sử dụng Kubernetes NFS Subdir External Provisioner, công cụ này giúp chúng ta tạo NFS PVC một cách tự động, mỗi PVC sẽ được tự động tạo folder lưu trữ riêng.

Tiến hành

Đầu tiên, chúng ta cần khởi tạo các tài nguyên:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/class.yaml

File class.yaml sau khi được triển khai sẽ tạo tài nguyên StorageClass với tên là managed-nfs-storage

Tiếp theo, tạo file deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: 10.10.10.101
            - name: NFS_PATH
              value: /nfs-data
      volumes:
        - name: nfs-client-root
          nfs:
            server: 10.10.10.101
            path: /nfs-data

Trong đó:

  • 10.10.10.101: là ip NFS server của bạn
  • /nfs-data: là folder dùng để lưu dữ liệu trên NFS server. Bạn cần phải tạo sẵn folder này trên NFS server

Triển khai tài nguyên đó lên K8s:

kubectl apply -f deployment.yaml

Sử dụng

bài viết trước để tạo PVC, chúng ta cần tạo file định nghĩa các tài nguyên PersistentVolumePersistentVolumeClaim:

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'
---
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

Còn khi sử dụng NFS Subdir External Provisioner thì chỉ cần khai báo tài nguyên PersistentVolumeClaim và sử dụng storageClassName đã tạo ở trên:

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
  storageClassName: managed-nfs-storage