Monday, January 20, 2025

[Kubernetes 12] Sử dụng PersistentVolume NFS trên Kubernetes

-

1. Cài đặt NFS làm Server chia sẻ file (Kubernetes)

Sử dụng Volume để các POD cùng một dữ liệu, cần một loại đĩa mạng, ví dụ này sẽ thực hành dùng NFS. Ta sẽ cài đặt một Server NFS trực tiếp trên một Node của Kubernetes (độc lập, không chạy POD, nếu muốn bạn có thể cài trên một máy khác chuyên chia sẻ file).

Cài đặt nfs-server

sudo apt update
sudo apt -y upgrade
sudo apt install nfs-kernel-server -y

Tạo folder share/home/nfs_storage/ và phân quyền cho nó

mkdir /home/nfs_storage/
chmod -R 777 /home/nfs_storage/

Cài đặt nfs và các gói liên quan

Sau khi cài đặt xong, khởi động và enable các dịch vụ

systemctl enable rpcbind
systemctl start rpcbind
systemctl enable nfs-server
systemctl start nfs-server

Mở file /etc/exports để soạn thảo, ở đây sẽ cấu hình để chia sẻ thư mục /home/nfs_storage/

vi /etc/exports

Thêm vào /etc/exports nội dung như dưới

# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/home/nfs_storage *(rw,sync,no_subtree_check,insecure)

Export và kiểm tra cấu hình chia sẻ

root@k8s-standalone:/home# exportfs -rav
exporting *:/home/nfs_storage
root@k8s-standalone:/home# exportfs -v
/home/nfs_storage
                <world>(rw,wdelay,insecure,root_squash,no_subtree_check,sec=sys,rw,insecure,root_squash,no_all_squash)
root@k8s-standalone:/home# showmount -e
Export list for k8s-standalone:
/home/nfs_storage *

Khởi động lại nfs-server

systemctl restart nfs-server

Hãy đảm bảo service nfs-server đã chạy

root@k8s-standalone:/home# systemctl status nfs-server
● nfs-server.service - NFS server and services
   Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor preset: enabled)
   Active: active (exited) since Mon 2022-10-03 09:32:55 UTC; 23s ago
  Process: 26965 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 26962 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
  Process: 26957 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
  Process: 26989 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 26988 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 26989 (code=exited, status=0/SUCCESS)

Oct 03 09:32:55 k8s-standalone systemd[1]: Starting NFS server and services...
Oct 03 09:32:55 k8s-standalone systemd[1]: Started NFS server and services.

Server này có địa chỉ IP 192.168.13.238 (chính là node master), giờ ta thực hiện mount thử ổ đĩa xem có hoạt động không.

Giờ mình tạo 1 thư mục /home/mount_nfs_storage/ để mount thư mục  /home/nfs_storage/ vào (do mình chỉ sử sử dụng 1 node master để demo, nếu bạn có nhiều node, bạn có thể sang node khác để mount với điều kiện các node phải connect được với nhau)

 mkdir /home/mount_nfs_storage/

Thực hiện mount

mount -t nfs 192.168.13.238:/home/nfs_storage/ /home/mount_test_nfs_storage

Verify

root@k8s-standalone:/home# df -h
Filesystem                        Size  Used Avail Use% Mounted on
udev                              3.9G     0  3.9G   0% /dev
tmpfs                             798M  2.4M  796M   1% /run
/dev/sda2                         196G   11G  176G   6% /
tmpfs                             3.9G     0  3.9G   0% /dev/shm
tmpfs                             5.0M     0  5.0M   0% /run/lock
tmpfs                             3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/loop0                        115M  115M     0 100% /snap/core/13886
tmpfs                             798M     0  798M   0% /run/user/0
192.168.13.238:/home/nfs_storage  196G   11G  176G   6% /home/mount_test_nfs_storage

Như vậy đã có Server chia sẻ file NFS ở địa chỉ IP 192.168.13.238 đường dẫn chia sẻ file /home/mount_nfs_storage

Sau khi verify thành công, chúng ta có thể unmount nó

umount /home/mount_test_nfs_storage

2. Tạo PersistentVolume NFS

cat > ./persistent-nsf-volume.yaml << OEF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: persistent-nsf-volume
spec:
  storageClassName: mystorageclass
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: "/home/nfs_storage"
    server: "192.168.13.238"
OEF

Triển khai file persistent-nsf-volume.yaml vừa mới tạo

root@k8s-standalone:/home# kubectl apply -f ./persistent-nsf-volume.yaml
persistentvolume/persistent-nsf-volume created

Verify lại persistent-nsf-volume vừa tạo xong

root@k8s-standalone:/home# kubectl get pv -o wide
NAME                    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                            STORAGECLASS     REASON   AGE   VOLUMEMODE
persistent-nsf-volume   5Gi        RWX            Retain           Available                                    mystorageclass            27s   Filesystem

Bạn có thể dùng describe để xem chi tiết thông tin persistent-nsf-volume vừa mới tạo

root@k8s-standalone:/home# kubectl describe pv/persistent-nsf-volume
Name:            persistent-nsf-volume
Labels:          <none>
Annotations:     <none>
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    mystorageclass
Status:          Available
Claim:           
Reclaim Policy:  Retain
Access Modes:    RWX
VolumeMode:      Filesystem
Capacity:        5Gi
Node Affinity:   <none>
Message:         
Source:
    Type:      NFS (an NFS mount that lasts the lifetime of a pod)
    Server:    192.168.13.238
    Path:      /home/nfs_storage
    ReadOnly:  false
Events:        <none>

3. Tạo PersistentVolumeClaim NFS

cat > ./persistent-nsf-volume-claim.yaml << OEF
apiVersion: v1
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: persistent-nsf-volume
spec:
  storageClassName: mystorageclass
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
OEF

Triển khai file persistent-nsf-volume-claim.yaml

root@k8s-standalone:/home# kubectl apply -f ./persistent-nsf-volume-claim.yaml
persistentvolumeclaim/persistent-nsf-volume created

Bạn có thể verify lại kết quả triển khai bằng lệnh dưới

root@k8s-standalone:/home# kubectl get pvc,pv -o wide
NAME                                           STATUS   VOLUME                  CAPACITY   ACCESS MODES   STORAGECLASS     AGE   VOLUMEMODE
persistentvolumeclaim/persistent-nsf-volume    Bound    persistent-nsf-volume   5Gi        RWX            mystorageclass   17s   Filesystem

NAME                                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                            STORAGECLASS     REASON   AGE     VOLUMEMODE
persistentvolume/persistent-nsf-volume   5Gi        RWX            Retain           Bound    default/persistent-nsf-volume    mystorageclass            2m34s   Filesystem

3. Mount PersistentVolumeClaim NFS vào Container

Tạo 1 file manifest nội dung như dưới

cat > ./persistent-application.yaml << OEF
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: prometheus
spec:
  selector:
    matchLabels:
      name: prometheus
  template:
    metadata:
      name: prometheus
      labels:
        name: prometheus
    spec:
      volumes:
        - name: my-nfs-volume
          persistentVolumeClaim:
            claimName: persistent-nsf-volume
      containers:
      - name: prometheus
        image: prom/prometheus
        resources:
          limits:
            memory: "50Mi"
            cpu: "500m"
        command:
          - sleep
          - "600"
        volumeMounts:
          - mountPath: /storage-nfs-volume
            name: my-nfs-volume
OEF

Triển khai nó

root@k8s-standalone:/home# kubectl apply -f ./persistent-application.yaml
daemonset.apps/prometheus created

Verify lại file manifest vừa được tạo ta được 1 pod đang running

root@k8s-standalone:/home# kubectl get po
NAME               READY   STATUS    RESTARTS   AGE
prometheus-46qp4   1/1     Running   0          4s

Hãy tạo 1 file để test

root@k8s-standalone:/home# echo 'Day la o dia duoc mount bang nsf' > /home/mount_nfs_storage/detail.txt

Exec vào conntainer chúng ta thấy ổ đĩa được mount thành công và có chứa file test được tạo trên máy host như dưới.

root@k8s-standalone:/home# kubectl exec -it prometheus-46qp4 sh
/prometheus $ cat /storage-nfs-volume/detail.txt 
Day la o dia duoc mount bang nsf

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories