+1

Hướng dẫn StatefulSets trong Kubernetes dành cho người mới bắt đầu

StatefulSets là các đối tượng API trong Kubernetes được sử dụng để quản lý các ứng dụng trạng thái. Bài viết này sẽ hướng dẫn bạn tìm hiểu về StatefulSets, cách tạo và vận hành chúng, cùng với ví dụ cụ thể và giải đáp các câu hỏi thường gặp.

Nếu như bạn chưa rõ khái niệm Kubernetes là gì, bạn hoàn toàn có thể theo dõi bài viết này để hiểu chi tiết hơn: Kubernetes là gì? Giới thiệu nền tảng mã nguồn mở tự động hóa tốt nhất hiện nay

Giới thiệu về StatefulSets và các loại ứng dụng trong Kubernetes

StatefulSets là các đối tượng API trong Kubernetes được sử dụng để quản lý các ứng dụng trạng thái. Có hai loại ứng dụng trong Kubernetes: ứng dụng trạng thái (Stateful applications) và ứng dụng không trạng thái (Stateless applications). Có hai cách để triển khai các ứng dụng này:

  • Deployment (cho ứng dụng không trạng thái)
  • StatefulSets (cho ứng dụng trạng thái)

Ứng dụng trạng thái là gì?

Ứng dụng trạng thái là những ứng dụng duy trì một số dạng trạng thái hoặc dữ liệu liên tục. Đặc điểm chính phân biệt chúng với ứng dụng không trạng thái là các ứng dụng này không dựa vào việc lưu trữ dữ liệu cục bộ và chúng không coi mỗi yêu cầu là độc lập. Chúng quản lý dữ liệu giữa các tương tác. Đôi khi, ứng dụng không trạng thái kết nối với ứng dụng trạng thái để chuyển tiếp các yêu cầu tới cơ sở dữ liệu.

Ứng dụng không trạng thái là gì?

Ứng dụng không trạng thái là những ứng dụng không duy trì bất kỳ dạng trạng thái hoặc dữ liệu liên tục nào cục bộ. Trong các ứng dụng không trạng thái, mỗi yêu cầu hoặc tương tác được coi là độc lập. Các ứng dụng này được thiết kế để có khả năng mở rộng cao, dễ quản lý và chịu lỗi tốt vì không giống như ứng dụng trạng thái, chúng không phải theo dõi các tương tác hoặc yêu cầu trong quá khứ.

Ứng dụng không trạng thái được triển khai bằng cách sử dụng thành phần triển khai (Deployment). Deployment là một sự trừu tượng của pods và cho phép bạn sao chép ứng dụng, nghĩa là nó cho phép bạn chạy 1, 5, 10 hoặc n pods giống hệt nhau của cùng một ứng dụng không trạng thái.

Vậy StatefulSets là gì?

Nói một cách đơn giản, StatefulSets là thành phần Kubernetes được sử dụng dành riêng cho các ứng dụng trạng thái. Đây là đối tượng API khối lượng công việc được sử dụng để quản lý các ứng dụng trạng thái. Chúng quản lý việc triển khai và mở rộng quy mô của một tập hợp Pods (tạo thêm bản sao hoặc xóa chúng) và StatefulSets cũng chịu trách nhiệm về thứ tự và tính duy nhất của các Pods này. StatefulSet đã được phát hành trong phiên bản Kubernetes 1.9.

StatefulSets sẽ đại diện cho tập hợp các pods với các định danh liên tục (duy nhất) khác nhau và tên máy chủ đàn hồi (ổn định). Điều này đảm bảo về thứ tự mở rộng và triển khai. Trước khi hiểu StatefulSets, bạn phải hiểu Kubernetes Deployment.

Dưới đây là một ví dụ về StatefulSet có tên web:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Khi nào sử dụng StatefulSets?

StatefulSets trong Kubernetes lý tưởng để triển khai các ứng dụng trạng thái yêu cầu mã định danh mạng ổn định, duy nhất, bộ nhớ liên tục và triển khai và mở rộng quy mô theo thứ tự, uyển chuyển. Chúng phù hợp với các ứng dụng như cơ sở dữ liệu, kho lưu trữ key-value và hàng đợi nhắn tin yêu cầu danh tính và bộ nhớ nhất quán.

Ví dụ về ứng dụng trạng thái và không trạng thái

Xét một ứng dụng node.js được kết nối với cơ sở dữ liệu MongoDB. Khi một yêu cầu đến ứng dụng node.js, nó xử lý yêu cầu một cách độc lập và không phụ thuộc vào dữ liệu trước đó để làm điều đó. Nó xử lý yêu cầu dựa trên tải trọng trong chính yêu cầu. Ứng dụng node.js này là một ví dụ về ứng dụng không trạng thái.

Bây giờ yêu cầu sẽ cập nhật một số dữ liệu trong cơ sở dữ liệu hoặc truy vấn một số dữ liệu từ cơ sở dữ liệu. Khi node.js chuyển tiếp yêu cầu đó tới MongoDB, MongoDB cập nhật dữ liệu dựa trên trạng thái trước đó của dữ liệu hoặc truy vấn dữ liệu từ bộ nhớ của nó. Đối với mỗi yêu cầu, nó cần xử lý dữ liệu và nó phụ thuộc vào dữ liệu hoặc trạng thái cập nhật nhất có sẵn trong khi node.js chỉ là một đường dẫn cho các cập nhật hoặc truy vấn dữ liệu và nó chỉ xử lý mã.

Do đó, ứng dụng node.js nên là một ứng dụng không trạng thái trong khi ứng dụng MongoDB phải là một ứng dụng trạng thái. Đôi khi, ứng dụng không trạng thái kết nối với ứng dụng trạng thái để chuyển tiếp các yêu cầu tới cơ sở dữ liệu. Đây là một ví dụ điển hình về ứng dụng không trạng thái chuyển tiếp yêu cầu tới ứng dụng trạng thái.

Cách tạo StatefulSet trong Kubernetes

Sau đây là hướng dẫn từng bước về cách sử dụng StatefulSets và một số thao tác cơ bản trên StatefulSets.

1. Tạo ứng dụng Nginx StatefulSet

Bước 1. Tạo tệp StatefulSet. Bạn có thể làm điều đó bằng cách nhập lệnh sau:

touch example-statefulset.yaml

Bước 2. Mở tệp này trong trình soạn thảo mã và viết mã sau vào đó:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: gfg-example-statefulset
  annotations:
    description: "This is an example statefulset"
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "gfg-example-service"
  replicas: 3 # remember this, we will have 3 identical pods running
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: myclaim

Bước 3. Bây giờ chúng ta phải tạo một tệp dịch vụ và một tệp PersistentVolumeClaim.

touch example-service.yaml
touch example-persistentVolumeChain.yaml

2. Tạo một dịch vụ cho ứng dụng StatefulSet

Bước 4. Nhập mã sau vào tệp dịch vụ:

apiVersion: v1
kind: Service
metadata:
  name: gfg-example-service
  annotations:
    description: "this is an example service"
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx

3. Tạo PersistentVolumeClaim cho Ứng dụng

Bước 5. Nhập mã sau vào tệp PersistentVolumeClaim:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi # This means we are requesting for 8 GB of storage

Bây giờ, hãy áp dụng những thay đổi này.

Bước 6. Nhập lệnh sau trong terminal của bạn để tạo gfg-example-statefulset:

kubectl create -f example-statefulset.yaml

Điều này sẽ tạo gfg-example-statefulset của chúng ta image.png

Bây giờ nếu chúng ta tìm kiếm StatefulSets trong terminal bằng lệnh:

kubectl get statefulsets

chúng ta sẽ tìm thấy gfg-example-statefulset của mình trong danh sách. image.png

Bước 7. Nhập lệnh sau trong terminal của bạn để tạo gfg-example-service:

kubectl apply -f example-service.yaml

điều này sẽ tạo một dịch vụ với tên "gfg-example-service".

Bước 8. Hãy kiểm tra pods và dịch vụ của chúng ta. Để lấy danh sách pods, hãy nhập lệnh sau trong terminal của bạn:

kubectl get pods

Bạn sẽ nhận được danh sách ba gfg-pods mà chúng ta tạo thông qua việc xác định ba bản sao trong tệp example-stateful-set.yaml. image.png

Để kiểm tra danh sách dịch vụ, hãy nhập lệnh sau trong terminal của bạn:

kubectl get services

Một số thao tác trên StatefulSets

  • Thêm StatefulSet: Để thêm StatefulSet vào cụm Kubernetes của bạn, hãy sử dụng lệnh kubectl create -f [StatefulSet file name], thay thế [StatefulSet file name] bằng tên của tệp kê khai StatefulSet của bạn.
kubectl create -f StatefulSet_file_name
  • Xóa StatefulSet: Để xóa StatefulSet trong Kubernetes, bạn có thể sử dụng lệnh kubectl delete statefulset [name], trong đó [name] là tên của StatefulSet bạn muốn xóa.
kubectl delete statefulset [name]

- Chỉnh sửa StatefulSet: Lệnh kubectl edit statefulset [name] cho phép bạn sửa đổi cấu hình của StatefulSet trực tiếp từ dòng lệnh bằng cách mở trình soạn thảo.

kubectl edit statefulset [name]

- Mở rộng Bản sao: Lệnh kubectl scale mở rộng số lượng bản sao trong StatefulSet có tên [StatefulSet name] thành [Number of replicas] đã chỉ định.

kubectl scale statefulset [StatefulSet name] --replicas=[Number of replicas]

Bước 9. Bây giờ, hãy mở rộng quy mô pods của chúng ta và kiểm tra xem nó có hoạt động không! Để mở rộng quy mô pods lên 6 pods, hãy nhập lệnh sau:

kubectl scale statefulset gfg-example-statefulset --replicas=6

Điều này sẽ tạo thêm 3 pods nữa và số lượng pods bây giờ là 6. Để lấy danh sách pods, hãy nhập lệnh sau:

kubectl get pods

Bạn sẽ nhận được kết quả tương tự: image.png

Bước 10. Bây giờ, hãy thu nhỏ pods xuống 3, hãy nhập cùng một lệnh, chỉ cần thay đổi số lượng bản sao trở lại 3:

kubectl scale statefulset gfg-example-statefulset --replicas=3

bây giờ nếu chúng ta kiểm tra danh sách pods bằng

kubectl get pods

bạn sẽ chỉ thấy 3 pod đang chạy: image.png

Theo cách này, chúng ta có thể tạo StatefulSets, mở rộng chúng ra và sau đó thu hẹp chúng lại. Đảm bảo xóa StatefulSet và dịch vụ trước khi đóng terminal. Để biết thêm các lệnh của kubectl, hãy tham khảo Kubectl Command Cheat Sheet.

Ứng dụng có trạng thái hoạt động như thế nào?

Trong các ứng dụng trạng thái như MySQL, nhiều pods không thể đồng thời đọc và ghi dữ liệu để tránh sự không nhất quán dữ liệu. Một pod được chỉ định là pod chính, chịu trách nhiệm ghi và thay đổi dữ liệu, trong khi các pod khác được chỉ định là pod phụ, chỉ được phép đọc dữ liệu. Mỗi pod có bản sao bộ nhớ dữ liệu riêng, đảm bảo tính độc lập và cách ly dữ liệu.

Các cơ chế đồng bộ hóa được sử dụng để đảm bảo rằng tất cả các pods có cùng trạng thái dữ liệu, với các pod phụ cập nhật bộ nhớ dữ liệu của chúng khi pod chính thay đổi dữ liệu. Việc đồng bộ hóa liên tục là cần thiết để duy trì tính nhất quán dữ liệu giữa tất cả các pods trong các ứng dụng trạng thái.

Ví dụ: Giả sử chúng ta có một pod chính và hai pod phụ của MySQL. Điều gì sẽ xảy ra khi một bản sao pod mới tham gia vào thiết lập hiện có? Bởi vì bây giờ pod mới đó cũng cần tạo bộ nhớ riêng và đảm nhiệm việc đồng bộ hóa nó, điều xảy ra là nó trước tiên sao chép dữ liệu từ pod trước đó và sau đó nó bắt đầu đồng bộ hóa liên tục để lắng nghe bất kỳ cập nhật nào của pod chính.

Vì mỗi pod có bộ nhớ dữ liệu riêng (persistent volume) được sao lưu bởi bộ nhớ vật lý riêng của nó, bao gồm dữ liệu đã đồng bộ hóa và trạng thái của pod. Mỗi pod có trạng thái riêng, chứa thông tin về việc nó là pod chính hay pod phụ và các đặc điểm riêng lẻ khác. Tất cả những điều này được lưu trữ trong bộ nhớ riêng của pod. Do đó, khi một pod chết và được thay thế, persistent pod. Identifiers đảm bảo rằng khối lượng bộ nhớ được gắn lại với pod thay thế. Bằng cách này, ngay cả khi cụm bị lỗi, dữ liệu vẫn được đảm bảo không bị mất.

Kết luận

Trong bài viết này, chúng ta đã thảo luận về cách sử dụng Kubernetes StatefulSets. StatefulSets là các thành phần Kubernetes được sử dụng để triển khai các ứng dụng trạng thái. Ứng dụng trạng thái là những ứng dụng duy trì một số dạng trạng thái hoặc dữ liệu liên tục. Một ví dụ điển hình là bất kỳ ứng dụng nào có cơ sở dữ liệu.

Chúng ta đã thảo luận về cách triển khai ứng dụng trạng thái bằng StatefulSets. Sau đó, chúng ta đã thảo luận về cách thức hoạt động của ứng dụng Stateful. Cuối cùng, chúng ta đã thảo luận về sự khác biệt giữa StatefulSet và Deployment, về cơ bản xoay quanh điểm triển khai được sử dụng để triển khai ứng dụng không trạng thái và StatefulSets được sử dụng để triển khai ứng dụng trạng thái.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí