Cài đặt và sử dụng NFS CSI Driver (cho Kubernetes)
Last updated
kubectl get nodes# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vks-demo-cluster-nodegroup-001-4ba81 Ready <none> 6d v1.29.13
vks-demo-cluster-nodegroup-001-bccb4 Ready <none> 6d v1.29.13curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.5.0/deploy/install-driver.sh | bash -s v4.5.0 --kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
kubectl -n kube-system get pod -o wide -l app=csi-nfs-nodecsi-nfs-controller-6866b7dfbf-xfd56 4/4 Running
csi-nfs-node-dc4km 3/3 Running
csi-nfs-node-dq5fd 3/3 RunningapiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi # Tên Storage Class
provisioner: nfs.csi.k8s.io
parameters:
server: 10.7.9.5 # IP của filestorage (lấy từ thông tin mount guide trên File Storage Portal)
share: /demo-nfs # mountpoint (lấy từ thông tin mount guide trên File Storage Portal)
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
- nfsvers=4
- hard
- timeo=600
- retrans=3
- rsize=1048576
- wsize=1048576
- resvport
- asynckubectl apply -f nfs-sc.yaml
kubectl get storageclasses
kubectl describe storageclass nfs-csi# kubectl apply -f nfs-sc.yaml
# kubectl get storageclasses
# kubectl describe storageclass nfs-csi
storageclass.storage.k8s.io/nfs-csi created
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-csi nfs.csi.k8s.io Delete Immediate false 0s
vngcloud-nvme-5000-delete (default) bs.csi.vngcloud.vn Delete WaitForFirstConsumer true 6d
vngcloud-ssd-3000-delete bs.csi.vngcloud.vn Delete WaitForFirstConsumer true 6d
Name: nfs-csi
IsDefaultClass: No
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"nfs-csi"},"mountOptions":["nfsvers=4","hard","timeo=600","retrans=3","rsize=1048576","wsize=1048576","resvport","async"],"parameters":{"server":"10.7.9.5","share":"/demo-nfs"},"provisioner":"nfs.csi.k8s.io","reclaimPolicy":"Delete","volumeBindingMode":"Immediate"}
Provisioner: nfs.csi.k8s.io
Parameters: server=10.7.9.5,share=/demo-nfs
AllowVolumeExpansion: <unset>
MountOptions:
nfsvers=4
hard
timeo=600
retrans=3
rsize=1048576
wsize=1048576
resvport
async
ReclaimPolicy: Delete
VolumeBindingMode: Immediate
Events: <none>apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
name: pvc-nfs-dynamic # Tên PVC
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 3Gi # Kích thước mong muốn cho PVC
storageClassName: nfs-csi # Tên Storage Class, tên này phải khớp với Storage Class Name đã tạo bên trên
volumeMode: Filesystemkubectl apply -f nfs-pvc.yaml
kubectl get pvc
kubectl describe pvc pvc-nfs-dynamic# kubectl apply -f nfs-pvc.yaml
# kubectl get pvc
# kubectl describe pvc pvc-nfs-dynamic
persistentvolumeclaim/pvc-nfs-dynamic created
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
pvc-nfs-dynamic Pending nfs-csi <unset> 0s
Name: pvc-nfs-dynamic
Namespace: default
StorageClass: nfs-csi
Status: Bound
Volume: pvc-6ed4097b-d8fb-41c8-ba9c-7147a652ff83
Labels: <none>
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 3Gi
Access Modes: RWX
VolumeMode: Filesystem
Used By: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ExternalProvisioning 0s persistentvolume-controller Waiting for a volume to be created either by the external provisioner 'nfs.csi.k8s.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.
Normal Provisioning 0s nfs.csi.k8s.io_vks-demo-cluster-nodegroup-001-4ba81_d071c067-6d99-4d90-87cf-01f89c32a2c4 External provisioner is provisioning volume for claim "default/pvc-nfs-dynamic"
Normal ProvisioningSucceeded 0s nfs.csi.k8s.io_vks-demo-cluster-nodegroup-001-4ba81_d071c067-6d99-4d90-87cf-01f89c32a2c4 Successfully provisioned volume pvc-6ed4097b-d8fb-41c8-ba9c-7147a652ff83apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-nfs # Tên pod
spec:
replicas: 3
selector:
matchLabels:
app: nginx-nfs
template:
metadata:
labels:
app: nginx-nfs
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: nfs-storage
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-storage
persistentVolumeClaim:
claimName: pvc-nfs-dynamic # Tên PVC
---
apiVersion: v1
kind: Service
metadata:
name: nginx-nfs-service
spec:
selector:
app: nginx-nfs
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancerkubectl apply -f nginx-deployment.yaml# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-nfs created
service/nginx-nfs-service createdkubectl get pvc pvc-nfs-dynamic# kubectl get pvc pvc-nfs-dynamic
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
pvc-nfs-dynamic Bound pvc-6ed4097b-d8fb-41c8-ba9c-7147a652ff83 3Gi RWX nfs-csi <unset> 109sapiVersion: v1
kind: Pod
metadata:
name: test-nfs-writer
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "while true; do echo $(date) >> /mnt/data/testfile; sleep 5; done"]
volumeMounts:
- name: nfs-storage
mountPath: /mnt/data
volumes:
- name: nfs-storage
persistentVolumeClaim:
claimName: pvc-nfs-dynamickubectl apply -f test-pod.yaml
kubectl get pods -w# kubectl apply -f test-pod.yaml
# kubectl get pods -w
pod/test-nfs-writer configured
NAME READY STATUS RESTARTS AGE
nginx-nfs-6df57b7f6b-gptfj 1/1 Running 0 3m25s
nginx-nfs-6df57b7f6b-mbxx8 1/1 Running 0 3m25s
nginx-nfs-6df57b7f6b-sgcxh 1/1 Running 0 3m25s
nsenter-2fzs6c 1/1 Running 0 21h
test-nfs-writer 1/1 Running 0 2m3skubectl exec -it test-nfs-writer -- ls -lh /mnt/data
kubectl exec -it test-nfs-writer -- du -sh /mnt/data# kubectl exec -it test-nfs-writer -- ls -lh /mnt/data
# kubectl exec -it test-nfs-writer -- du -sh /mnt/data
total 1K
-rw-r--r-- 1 nobody nobody 841 Aug 13 04:04 testfile
1.5K /mnt/datareclaimPolicy: Retain # Giữ lại data khi PVC bị xóavolumeBindingMode: WaitForFirstConsumer # Chờ đến khi có Pod sử dụng mới provisioning