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