Course Content
1. DevOps overview
DevOps là gì
0/1
4. Kubernetes từ cơ bản đến nâng cao
0/20
8. Monitoring, Logging và Tracing
Khóa Học: DevOps Zero to Hero. (Đăng nhập để xem các video 1 cách miễn phí)

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:

  1. 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.

  2. 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-0 sẽ luôn sử dụng volume gắn với tên mysql-storage-0.

  3. 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-0 trước, sau đó mới đến mysql-1, rồi mysql-2.

  4. 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 địnhlư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

 

0% Complete