Hướng Dẫn Kubernetes Workloads: Deployment, DaemonSet và StatefulSet
1) Giới Thiệu
Kubernetes là một công cụ mạnh mẽ giúp bạn quản lý container trên quy mô lớn. Một trong những khái niệm quan trọng trong Kubernetes là workloads, đại diện cho các loại ứng dụng và cách chúng được triển khai trên cluster. Bài viết này sẽ giúp bạn hiểu và triển khai các workloads cơ bản như Deployment, DaemonSet, và StatefulSet. Các ví dụ kèm theo sẽ giúp bạn dễ dàng áp dụng vào thực tế.
2) Deployment
2.1) Giới Thiệu
Deployment trong Kubernetes là một cách đơn giản để triển khai và quản lý các ứng dụng stateless. Nó đảm bảo rằng một số lượng pod nhất định luôn chạy và được cập nhật một cách linh hoạt mà không ảnh hưởng đến ứng dụng của bạn.
Stateless (không trạng thái) có nghĩa là ứng dụng hoặc hệ thống không lưu trữ bất kỳ dữ liệu nào khi container sinh ra. Nghĩa là trong khi container running và container sinh ra data hoặc bất kì file xuống local thì sẽ không được lưu lại.
2.2) Tính năng nổi bật:
-
Rolling Update: Cập nhật ứng dụng mà không gây gián đoạn dịch vụ.
-
Scale Up/Scale Down: Tăng hoặc giảm số lượng replicas (pods) để đáp ứng nhu cầu lưu lượng.
-
Rollback: Quay lại phiên bản trước đó nếu có lỗi xảy ra.
2.3) Cấu Hình Deployment
File deployment.yaml:
apiVersion: apps/v1 # Phiên bản API để tạo Deployment.
kind: Deployment # Loại đối tượng là Deployment (quản lý ứng dụng).
metadata:
name: my-deployment # Tên của Deployment, giúp nhận diện.
spec:
replicas: 3 # Số lượng bản sao của pod (3 bản sao).
selector:
matchLabels:
app: my-app # Điều kiện để chọn pod (có label app: my-app).
template:
metadata:
labels:
app: my-app # Gắn nhãn app: my-app cho các pod.
spec:
containers:
- name: my-app-container # Tên container.
image: nginx:latest # Sử dụng image nginx mới nhất.
ports:
- containerPort: 80 # Mở cổng 80 (cổng web).
Lệnh triển khai Deployment:
kubectl apply -f deployment.yaml

Sau khi apply một Deployment, Kubernetes sẽ tự động tạo một ReplicaSet và các Pod để thực thi ứng dụng của bạn.
Để kiểu tra:
kubectl get deployment
kubectl get replicaset
kubectl get pod
Khi bạn thay đổi deployment thì K8S sẽ tạo ra ReplicaSet mới để nhận sự thay đổi đó và ReplicaSet sẽ tạo pod mới. Cũng như vẫn lưu trư ReplicaSet cũ.
##Xem lịch sử các phiên bản của Deployment
kubectl rollout history deployment/my-deployment
##Quay lại phiên bản trước của Deployment.
kubectl rollout undo deployment/<your-deployment-name>
##Quay lại phiên bản cụ thể (revision) của Deployment.
kubectl rollout undo deployment/<your-deployment-name> --to-revision=<revision-number>
Tiếp đến chúng ta list được các replicaset name:
kubectl get all
kubectl get replicaset <replicaset-name-1> -o yaml > rs1.yaml
kubectl get replicaset <replicaset-name-2> -o yaml > rs2.yaml
diff rs1.yaml rs2.yaml
3) DaemonSet
3.1) Giới thiệu
DaemonSet là một loại workload đặc biệt trong Kubernetes, giúp triển khai một pod trên mỗi node trong cluster. Điều này đặc biệt hữu ích khi bạn cần chạy các dịch vụ như log collector, monitoring agent hoặc network proxy trên tất cả các node.
3.2) Tính năng nổi bật:
-
Đảm bảo một pod chạy trên mỗi node.
-
Cập nhật theo kiểu Rolling Update: Cập nhật các pod mà không làm gián đoạn dịch vụ.
-
Tự động tạo pods khi có node mới.
3.3) Cấu trúc YAML mẫu cho DaemonSet:
File: daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-daemonset
spec:
selector:
matchLabels:
app: my-daemonset
template:
metadata:
labels:
app: my-daemonset
spec:
containers:
- name: my-daemonset-container
image: nginx:latest
ports:
- containerPort: 80
Lệnh tạo:
kubectl apply -f daemonset.yaml
4) StatefulSet
4.1) Giới thiệu:
StatefulSet là một loại workload trong Kubernetes dùng để triển khai các ứng dụng có trạng thái (stateful applications), tức là những ứng dụng cần lưu trữ dữ liệu lâu dài và ổn định (như cơ sở dữ liệu, hệ thống cache, v.v.).
4.2) Các đặc điểm nổi bật của StatefulSet:
-
Tên pod ổn định: Mỗi pod trong StatefulSet sẽ có một tên cố định theo dạng
name-<index>, ví dụmysql-0,mysql-1,mysql-2. Điều này giúp các pod dễ dàng nhận dạng và duy trì trạng thái. -
Volume ổn định: Mỗi pod sẽ có volume riêng biệt để lưu trữ dữ liệu, và volume này sẽ không mất đi khi pod bị xóa hoặc khởi động lại. Ví dụ, pod
mysql-0sẽ luôn sử dụng volume gắn với tênmysql-storage-0. -
Triển khai có thứ tự: Pods được tạo ra và mở rộng theo một thứ tự cụ thể, ví dụ:
mysql-0trước, sau đó mới đếnmysql-1, rồimysql-2. -
Pod được tạo lại trên cùng một node (nếu node đó không bị hỏng): Khi một pod bị xóa hoặc bị khởi động lại, Kubernetes sẽ tạo lại pod đó với tên cố định trên cùng một node (trong điều kiện node đó vẫn còn hoạt động). Điều này giúp đảm bảo tính nhất quán về trạng thái của các ứng dụng có dữ liệu quan trọng.
4.3) Khi nào sử dụng StatefulSet?
StatefulSet phù hợp với các ứng dụng có trạng thái, như:
-
Cơ sở dữ liệu (MySQL, PostgreSQL, MongoDB).
-
Hệ thống cache (Redis, Cassandra).
-
Các ứng dụng cần tên pod ổn định và lưu trữ dữ liệu lâu dài.
4.4) Cấu trúc yaml
statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-statefulset
spec:
serviceName: "my-statefulset"
replicas: 1
selector:
matchLabels:
app: my-statefulset
template:
metadata:
labels:
app: my-statefulset
spec:
containers:
- name: my-statefulset-container
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: my-hostpath-volume
mountPath: /data
volumes:
- name: my-hostpath-volume
hostPath:
path: /mnt/data
type: DirectoryOrCreate
Nhấn mạnh là chúng ta cần phải application của chúng ta sinh ra data ở folder nào thì chúng ta sẽ thực hiện mount cho folder đó.
Câu lệnh:
kubectl apply statefulset.yaml