0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Hướng Dẫn Chi Tiết Về Việc Lựa Chọn Deployment, StatefulSet Hay DaemonSet Trong Kubernetes

Đăng vào 1 tuần trước

• 6 phút đọc

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 Copy
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 Copy
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 Copy
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é!

Tài Liệu Tham Khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào