Lý do cần sử dụng Volume
Hệ thống tệp tin trong container có tính tạm thời, gây khó khăn khi triển khai ứng dụng quan trọng. Khi container crash, kubelet khởi động lại nhưng dữ liệu sẽ bị mất. Ngoài ra, các container cùng Pod thường cần chia sẻ tệp tin. Volume trong Kubernetes giải quyết vấn đề này bằng cách cung cấp không gian lưu trữ chung.
Các loại Volume
Kubernetes hỗ trợ nhiều loại Volume, bao gồm:
emptyDir
# emptyDir tồn tại trong suốt vòng đời Pod, nhưng bị xóa khi Pod bị xóa
apiVersion: v1
kind: Pod
metadata:
name: pod-empty-volume
spec:
containers:
- name: app-container
image: myapp:latest
volumeMounts:
- mountPath: /shared-data
name: shared-volume
- name: helper-container
image: busybox:latest
command: ["sh", "-c", "sleep 3600"]
volumeMounts:
- mountPath: /common-data
name: shared-volume
volumes:
- name: shared-volume
emptyDir: {}
NFS (Network File System)
NFS là giao thức chia sẻ tệp tin mạng dựa trên RPC, cho phép truy cập tệp tin từ xa như tệp tin cục bộ. Đặc điểm nổi bật:
- Tính ổn định cao
- Hỗ trợ ghi đồng thời
- Khả năng mở rộng tốt
Nguyên lý hoạt động NFS sử dụng cơ chế RPC để thực hiện gọi thủ tục từ xa. Qua hệ điều hành, các yêu cầu truy cập tệp tin được gửi qua TCP/IP đến server NFS, nơi xử lý và trả về kết quả.
emptyDir và hostPath có thể chia sẻ dữ liệu giữa container nhưng bị giới hạn về tính bền vững và khả năng chia sẻ qua node. Khi cần lưu trữ bền vững và chia sẻ qua nhiều node, nên sử dụng hệ thống lưu trữ mạng (NAS).
Cài đặt server NFS
# Cấu hình server NFS
mkdir -pv /data/nfs-shared
chmod a+rw /data/nfs-shared
# Trên Ubuntu
sudo apt update
sudo apt install nfs-kernel-server
echo "/data/nfs-shared 192.168.1.0/24(rw,sync,no_subtree_check)" >> /etc/exports
sudo exportfs -ra
sudo systemctl restart nfs-kernel-server
# Trên CentOS
sudo yum install nfs-utils rpcbind
sudo systemctl enable --now nfs-server rpcbind
echo "/data/nfs-shared *(rw,sync,no_root_squash)" >> /etc/exports
sudo exportfs -ra
sudo systemctl restart nfs-server
# Các tùy chọn cấu hình:
# rw: Cho phép ghi
# sync: Đồng bộ hóa thao tác
# no_root_squash: Giữ nguyên quyền root từ client