Giới Thiệu
Trong thế giới Kubernetes, việc quản lý và triển khai ứng dụng không chỉ đơn thuần là tạo ra các Pod. Pod là đơn vị cơ bản nhưng không đủ để định hình một hệ thống phức tạp. Để điều phối các Pod một cách hiệu quả, các công cụ như Deployment, StatefulSet và DaemonSet ra đời, mỗi loại đều có những đặc điểm và ứng dụng riêng. Việc hiểu biết sâu sắc về các đối tượng này sẽ giúp bạn triển khai, quản lý và duy trì ứng dụng trên Kubernetes một cách dễ dàng và hiệu quả.
1. Deployment
Deployment là một đối tượng trong Kubernetes dùng để quản lý việc triển khai các ứng dụng không trạng thái (stateless applications). Nó cho phép duy trì số lượng bản sao (replica) của Pod luôn sẵn sàng và đảm bảo rằng từng Pod đang chạy phiên bản đúng của ứng dụng.
Cách Hoạt Động: Deployment quản lý các ReplicaSet, và mỗi ReplicaSet vận hành một nhóm Pod. Khi một Deployment được tạo hoặc cập nhật, Kubernetes sẽ tự động tạo hoặc cập nhật ReplicaSet tương ứng.
Ví Dụ Sử Dụng: Nếu bạn có một ứng dụng web cần ít nhất 2 bản sao để luôn sẵn sàng phục vụ người dùng, bạn có thể dùng Deployment để quản lý các bản sao này. Khi một Pod gặp sự cố, Deployment sẽ tự động thay thế bằng một Pod mới.
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:latest
ports:
- containerPort: 80
Khi Nào Nên Sử Dụng Deployment?
- Khi triển khai các ứng dụng không trạng thái.
- Khi cần triển khai tự động phiên bản mới của ứng dụng.
- Khi muốn có khả năng quay lại phiên bản trước nếu gặp lỗi.
Không Nên Sử Dụng Deployment Khi:
- Cần quản lý các ứng dụng có trạng thái hoặc yêu cầu lưu trữ ổn định.
- Khi một node trong cluster chỉ cần chạy một Pod duy nhất của ứng dụng.
2. StatefulSet
StatefulSet là một loại Controller trong Kubernetes dành riêng cho việc quản lý các ứng dụng có trạng thái (stateful applications). Nó đảm bảo rằng số lượng Pod trong StatefulSet được duy trì và lưu giữ trạng thái dữ liệu an toàn.
Cách Hoạt Động: StatefulSet quản lý các Pod với danh tính cố định. Các Pod được tạo ra theo một thứ tự nhất định và được xóa theo thứ tự ngược lại. Dữ liệu của mỗi Pod độc lập và được lưu trữ trong PersistentVolume.
Ví Dụ Sử Dụng: Nếu bạn cần triển khai một cụm cơ sở dữ liệu MySQL, StatefulSet giúp bạn duy trì tính toàn vẹn dữ liệu và sửa đổi thứ tự khởi tạo.
yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-statefulset
spec:
serviceName: "mysql"
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
Khi Nào Nên Sử Dụng StatefulSet?
- Khi triển khai các ứng dụng có trạng thái như cơ sở dữ liệu, Kafka, hay Hadoop.
- Khi cần danh tính cố định cho mỗi Pod và không muốn mất dữ liệu khi Pod được tạo lại.
- Khi cần tuân thủ thứ tự khởi tạo và xóa bỏ.
Không Nên Sử Dụng StatefulSet Khi:
- Triển khai ứng dụng không có trạng thái.
- Không cần dữ liệu lưu trữ ổn định và danh tính cố định.
- Cần tay nhanh trong việc triển khai hoặc mở rộng.
3. DaemonSet
DaemonSet là một controller trong Kubernetes nhằm đảm bảo rằng một Pod sẽ chạy trên mỗi Node trong cluster. Nó thường được sử dụng trong việc triển khai các ứng dụng như giám sát hoặc thu thập log.
Cách Hoạt Động: DaemonSet quản lý Pod để mỗi Node trong cluster có một Pod tương ứng. Số lượng Pod không sử dụng thuộc tính replicas
và tự động điều chỉnh khi các Node mới được thêm vào hoặc bị xóa.
Ví Dụ Sử Dụng: Trong việc triển khai công cụ giám sát như Prometheus Node Exporter, bạn có thể đảm bảo mọi Node đều có Pod tương ứng để thu thập dữ liệu giám sát.
yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter-daemonset
spec:
selector:
matchLabels:
name: node-exporter
template:
metadata:
labels:
name: node-exporter
spec:
nodeSelector:
type: monitor
containers:
- name: node-exporter
image: prom/node-exporter:latest
ports:
- containerPort: 9100
Khi Nào Nên Sử Dụng DaemonSet?
- Khi cần chạy giám sát và thu thập log từ tất cả các Node.
- Khi triển khai dịch vụ hệ thống cần có mặt trên mọi Node.
- Khi cần chạy các công cụ bảo mật và quản lý trên tất cả Node.
Không Nên Sử Dụng DaemonSet Khi:
- Ứng dụng không cần phải chạy trên mọi Node.
- Khi yêu cầu mở rộng ứng dụng dựa trên tải.
- Triển khai ứng dụng có trạng thái phức tạp.
Kết Luận
Việc chọn đúng loại đối tượng Kubernetes là rất quan trọng cho việc quản lý ứng dụng container. Deployment phù hợp cho ứng dụng không trạng thái, StatefulSet cho ứng dụng có trạng thái, và DaemonSet cho các agent chạy trên tất cả Node trong cluster. Hiểu rõ hơn về chúng sẽ giúp bạn triển khai ứng dụng một cách hiệu quả và tối ưu hóa quy trình làm việc trên Kubernetes. Cảm ơn bạn đã đọc bài viết này. Nếu bạn thấy hữu ích, hãy nhấn nút Upvote và để lại bình luận để chúng ta có thể thảo luận thêm nhé!