StatefulSet K8s là gì? Cấu trúc và khi nào nên sử dụng StatefulSet

Đã kiểm duyệt nội dung
Đánh giá
StatefulSet K8s là một controller chuyên biệt dùng để triển khai và quản lý các ứng dụng có trạng thái trên nền tảng Kubernetes. Bài viết này sẽ giúp bạn khám phá cách sử dụng và tối ưu statefulset k8s cho hệ thống lưu trữ dữ liệu hiện đại.
Những điểm chính
- Khái niệm StatefulSet: Hiểu rõ StatefulSet K8s là một controller chuyên biệt của Kubernetes, giúp triển khai và quản lý các ứng dụng có trạng thái như cơ sở dữ liệu.
- Cấu trúc và thành phần: Nắm được các thành phần chính như Headless Service và VolumeClaimTemplates, giúp hiểu cách StatefulSet đảm bảo định danh mạng và lưu trữ bền vững cho từng Pod.
- Tính năng nổi bật: Biết được các ưu điểm chính như định danh Pod ổn định và thứ tự triển khai, giúp lựa chọn StatefulSet K8s cho các ứng dụng yêu cầu tính nhất quán cao.
- So sánh với Deployment: Phân biệt rõ ràng sự khác biệt giữa StatefulSet (cho ứng dụng có trạng thái) và Deployment (cho ứng dụng không trạng thái), giúp lựa chọn đúng controller cho từng loại workload.
- Lưu ý khi sử dụng: Nắm được các lưu ý quan trọng như hạn chế về thay đổi kích thước volume và thứ tự xóa Pod, giúp tránh các lỗi phổ biến và đảm bảo an toàn dữ liệu.
- Hướng dẫn triển khai: Nắm vững các bước triển khai StatefulSet từ tạo Headless Service đến kiểm tra trạng thái, giúp bạn tự tin áp dụng vào thực tế để quản lý các ứng dụng có trạng thái.
- Cách mở rộng ứng dụng database với StatefulSet: Bao gồm một số cách như tạo Headless Service, tạo Secret lưu mật khẩu database, chuẩn bị Storage Class và Persistent Volume,…
- Biết đến giải pháp Enterprise Cloud Server của Vietnix chuyên nghiệp cho Kubernetes.
- Câu hỏi thường gặp: Được giải đáp các thắc mắc về cách kiểm tra cấu hình, xem log và đảm bảo lưu trữ, giúp củng cố kiến thức và giải quyết các vấn đề thực tế.

StatefulSet K8s là gì?
StatefulSet là một controller chuyên biệt của Kubernetes, dùng để triển khai và quản lý các ứng dụng stateful dưới dạng container (pod) trong cluster. Khác với Deployment (dành cho ứng dụng stateless) nơi các Pod có thể thay thế lẫn nhau, StatefulSet duy trì một định danh cố định cho từng Pod. Mỗi Pod trong StatefulSet được tạo ra từ cùng một bản mô tả, nhưng chúng không thể thay thế cho nhau. Mỗi Pod sẽ có một định danh vĩnh viễn và duy nhất, được giữ nguyên ngay cả khi Pod đó bị xóa và được lên lịch lại trên một Node khác.

StatefulSet K8s là lựa chọn tối ưu khi bạn vận hành ứng dụng cần lưu trữ dữ liệu lâu dài (database, file server), đòi hỏi định danh mạng ổn định (hostname, IP cố định) hoặc yêu cầu triển khai và mở rộng theo thứ tự cụ thể, điển hình như hệ thống phân tán hoặc các ứng dụng cần cơ chế đồng thuận như etcd, ZooKeeper.

Cấu trúc và thành phần của StatefulSet
Dưới đây là các thành phần quan trọng tạo nên cấu trúc của một StatefulSet trong Kubernetes, giúp đảm bảo việc quản lý ứng dụng stateful ổn định, nhất quán và hiệu quả:
- Headless Service: Được sử dụng để cấp định danh mạng ổn định (DNS, hostname) cho từng Pod trong StatefulSet.
- VolumeClaimTemplates: Giúp tạo PersistentVolumeClaim riêng biệt cho mỗi Pod, đảm bảo dữ liệu lưu trữ bền vững, không bị chia sẻ.
- Template Pod: Định nghĩa chi tiết thông số cho container, init container, các volume cần thiết, biến môi trường (env), probes kiểm tra sức khỏe,… giúp Pod khởi tạo đúng cấu hình yêu cầu.
- Replicas: Thiết lập số lượng Pod mà StatefulSet cần tạo, mở rộng hoặc thu hẹp theo nhu cầu vận hành.
- StatefulSet Resource: Định nghĩa số lượng bản sao (replicas), container image, và các cấu hình quản lý Pod.

Tính năng nổi bật của StatefulSet K8s
Dưới đây là những điểm nổi bật giúp StatefulSet trở thành lựa chọn hàng đầu khi triển khai các ứng dụng cần quản lý trạng thái lâu dài trên Kubernetes:
- Định danh Pod ổn định: Mỗi Pod trong StatefulSet luôn có tên cố định, không đổi khi scale hoặc restart lại, giúp nhận diện chính xác trong hệ thống.
- Lưu trữ bền vững: Mỗi Pod được gắn PersistentVolume riêng biệt, đảm bảo dữ liệu không bị mất ngay cả khi Pod bị xoá hay thay thế.
- Thứ tự triển khai và scale: Các Pod được tạo và xóa tuần tự, đảm bảo ứng dụng vận hành ổn định và đúng trình tự cần thiết.
- Rolling update theo thứ tự: Khi cập nhật phiên bản, StatefulSet sẽ cập nhật lần lượt từng Pod, giúp dữ liệu và trạng thái luôn nhất quán xuyên suốt quá trình thay đổi.

So sánh StatefulSet K8s với Deployment
Dưới đây là bảng so sánh các đặc điểm chính để giúp bạn phân biệt ba loại workload phổ biến này:
| Tiêu chí | StatefulSet K8s | Deployment |
|---|---|---|
| Loại ứng dụng | Ứng dụng có trạng thái (Stateful). | Ứng dụng không trạng thái (Stateless). |
| Định danh Pod | Cố định, duy nhất (ví dụ: web-0, web-1). | Ngẫu nhiên, thay đổi khi restart (ví dụ: web-xyz12). |
| Lưu trữ | Mỗi Pod có Volume riêng (PersistentVolume). | Các Pod chia sẻ Volume hoặc dùng lưu trữ tạm. |
| Địa chỉ mạng | Thay đổi khi Pod khởi động lại. | Cố định thông qua Headless Service. |
| Thứ tự triển khai | Tuần tự, có thứ tự (0 -> n). | Song song, không quan trọng thứ tự. |
| Trường hợp dùng | Database, Kafka, Zookeeper. | Web Server, API, Microservices. |
Các lưu ý khi sử dụng StatefulSet K8s
Một số lưu ý mà bạn cần quan tâm khi sử dụng StatefulSet K8s:
- Hạn chế về thay đổi kích thước: Không thể resize volume cho Pod sau khi tạo, nếu cần mở rộng dung lượng phải thực hiện workaround thủ công.
- Xóa StatefulSet không xóa Volume: Khi xóa StatefulSet K8s, các PersistentVolume vẫn còn, bạn phải xóa các PVC riêng lẻ để giải phóng storage.
- Thứ tự xóa Pod: Xóa StatefulSet K8s không đảm bảo xóa Pod đúng thứ tự, bạn nên scale số lượng Pod về 0 trước rồi mới tiến hành xóa để tránh lỗi trạng thái.
- Yêu cầu Headless Service: Bạn luôn cần tạo Headless Service trước để các Pod trong StatefulSet có định danh mạng ổn định (hostname, DNS riêng).
- Cơ chế cập nhật: Mặc định, StatefulSet K8s sử dụng chiến lược RollingUpdate, cập nhật từng Pod một theo thứ tự ngược lại (từ chỉ số lớn nhất về 0).
- Cẩn thận khi Scaling Down: Việc giảm số lượng Pod có thể gây mất dữ liệu nếu ứng dụng chưa kịp đồng bộ trạng thái.
Cách triển khai StatefulSet K8s
Để triển khai một StatefulSet trên Kubernetes, hãy thực hiện các bước cơ bản sau:
- Bước 1: Tạo Headless Service trước để cấp định danh mạng ổn định cho các Pod.
- Bước 2: Chuẩn bị file YAML cho StatefulSet, trong đó khai báo đầy đủ các phần như metadata, spec, template, volumeClaimTemplates.
- Bước 3: Áp dụng cấu hình vừa tạo bằng lệnh
kubectl apply -f. - Bước 4: Kiểm tra trạng thái triển khai với các lệnh để xác nhận các Pod và storage đã hoạt động đúng:
kubectl get statefulsetkubectl get podskubectl get pvc
Cách mở rộng ứng dụng database với StatefulSet K8s
Tạo Headless Service
Bạn viết file manifest dịch vụ để cấp DNS cố định cho các Pod của database. Đây là file mẫu mà bạn có thể tham khảo:
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
spec:
ports:
- port: 3306
clusterIP: None
selector:
app: mysqlSau đó bạn áp dụng lệnh:
kubectl apply -f mysql-service-headless.yaml
Tạo Secret lưu mật khẩu database
Tiếp theo bạn viết file manifest cho Secret chứa mật khẩu database:
apiVersion: v1
kind: Secret
metadata:
name: mysql-password
type: Opaque
stringData:
MYSQL_ROOT_PASSWORD: Admin_1234Sau đó bạn áp dụng lệnh:
kubectl apply -f mysql-secret.yaml
Chuẩn bị Storage Class và Persistent Volume
Bạn cần đảm bảo đã có Storage Class phù hợp, ví dụ NFS hoặc Longhorn. Bạn cần dùng lệnh:
kubectl get sc
Tạo StatefulSet cho ứng dụng database
Tiếp theo bạn viết file manifest StatefulSet, khai báo số replica mong muốn, volumeClaimTemplates riêng cho từng Pod:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-sts
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql-svc"
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
key: MYSQL_ROOT_PASSWORD
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-pvc
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-pvc
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "local-path"
resources:
requests:
storage: 1GiSau đó bạn chạy lệnh:
kubectl apply -f mysql-sts.yaml
Kiểm tra trạng thái các tài nguyên vừa tạo
Bạn có thể xem Pod, PVC, StatefulSet đã chạy đúng chưa bằng các lệnh:
kubectl get pod
kubectl get pvc
kubectl get statefulset
Kết nối và kiểm tra database
Bạn cần tạo Pod mới làm MySQL client để test kết nối bằng lệnh:
apiVersion: v1
kind: Pod
metadata:
name: mysql-client
spec:
containers:
- name: mysql-container
image: alpine
command: ['sh','-c', "sleep infinitively"]
imagePullPolicy: IfNotPresentSau đó bạn chạy lệnh:
kubectl apply -f mysql-client.yaml
Vào bên trong Pod client, , bạn chạy lệnh sau để cài mysql-client:
kubectl -n db exec --stdin --tty mysql-client -- sh
/ # apk add mysql-clientĐể kết nối vào các Pod database theo DNS định danh từng Pod, bạn chạy lệnh:
/ # mysql -u root -p -h mysql-sts-0.mysql-svc.default.svc.cluster.local
Kiểm tra khả năng mở rộng và đồng bộ
Khi scale, Pod mới sẽ tự động được cấp PVC và DNS riêng, dữ liệu luôn đảm bảo toàn vẹn và Pod có thể tự động nhận vai trò Master hoặc Slave phù hợp. Giờ đây bạn có thể mở rộng database dễ dàng, mỗi Pod luôn có lưu trữ và định danh riêng, trạng thái ổn định khi hệ thống thay đổi hoặc gặp sự cố.
Giải pháp hạ tầng Enterprise Cloud Server chuyên nghiệp cho Kubernetes
Vietnix Enterprise Cloud là nền tảng IaaS thế hệ mới, được thiết kế tối ưu để vận hành các cụm Kubernetes và ứng dụng có trạng thái (StatefulSet). Với CPU AMD EPYC kết hợp cùng ổ cứng NVMe Enterprise, hệ thống đảm bảo hiệu năng xử lý vượt trội và tốc độ truy xuất dữ liệu cực nhanh. Doanh nghiệp có thể khởi tạo máy chủ chỉ trong 30 giây, dễ dàng quản lý qua API tiêu chuẩn và mở rộng tài nguyên linh hoạt, giúp duy trì sự ổn định tuyệt đối cho các hệ thống cơ sở dữ liệu quan trọng.
Thông tin liên hệ:
- Website: https://vietnix.vn/
- Hotline: 1800 1093
- Email: sales@vietnix.com.vn
- Địa chỉ: 265 Hồng Lạc, Phường Bảy Hiền, Thành Phố Hồ Chí Minh
Câu hỏi thường gặp
Làm thế nào để kiểm tra chi tiết cấu hình StatefulSet?
Bạn cần sử dụng lệnh kubectl describe statefulset để xem thông tin chi tiết về từng StatefulSet trong cụm.
Cách kiểm tra log của Pod thuộc StatefulSet như thế nào?
Bạn dùng lệnh kubectl logs để đọc log của từng Pod, giúp debug lỗi hoặc theo dõi quá trình hoạt động của ứng dụng.
Làm sao đảm bảo lưu trữ của StatefulSet luôn hoạt động đúng?
Kiểm tra trạng thái các PVC và PV bằng kubectl get pvc, kubectl get pv để xác nhận từng Pod được cấp Persistent Volume hoạt động ổn định.
Hy vọng bài viết đã giúp bạn hiểu rõ định nghĩa StatefulSet K8S và cách thành phần này đảm bảo tính toàn vẹn dữ liệu cho các ứng dụng như cơ sở dữ liệu. Việc xác định đúng thời điểm sử dụng StatefulSet sẽ giúp quy trình quản lý cụm Kubernetes trở nên chính xác và ổn định hơn. Bạn có thể truy cập thêm các bài viết dưới đây để tối ưu hóa hiệu suất làm việc bằng Kubernetes:
THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM
Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày
















