Advanced StatefulSet trong Kruise: Hướng Dẫn Tối Ưu Cho Ứng Dụng Có Trạng Thái

Advanced StatefulSet là phiên bản mở rộng mạnh mẽ của StatefulSet gốc trong Kubernetes, được thiết kế đặc biệt để quản lý các ứng dụng có trạng thái (stateful applications) ở quy mô lớn. Là thành phần cốt lõi của dự án OpenKruise (CNCF incubating project), Advanced StatefulSet cung cấp nhiều tính năng nâng cao giúp việc quản lý ứng dụng có trạng thái trở nên linh hoạt và hiệu quả hơn. Dù bạn đang vận hành Redis, MySQL, MongoDB hay các hệ thống lưu trữ phân tán như Elasticsearch, Cassandra, Advanced StatefulSet đều có thể nâng cao đáng kể hiệu suất vận hành và độ ổn định của hệ thống.

1. Cập Nhật Tại Chỗ: Giảm Thiểu Thời Gian Downtime

Một trong những tính năng đáng chú ý nhất của Advanced StatefulSet là khả năng cập nhật tại chỗ (in-place update). Khác với StatefulSet truyền thống yêu cầu phải xóa và tạo lại Pod, Advanced StatefulSet cho phép cập nhật trực tiếp image của container bên trong Pod mà không cần tái tạo toàn bộ.

Cấu hình cơ bản cho cập nhật tại chỗ:

apiVersion: apps.kruise.io/v1beta1
kind: StatefulSet
metadata:
  name: mongo-replica-set
spec:
  replicas: 3
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
      maxUnavailable: 2

Quy trình hoạt động:

  • Controller phát hiện thay đổi về image
  • Cập nhật image trực tiếp trong Pod hiện tại
  • Container được khởi động lại nhưng Pod IP và volume được giữ nguyên
  • Dịch vụ không bị gián đoạn, dữ liệu được bảo toàn

2. Chiến Lược Cập Nhật Song Song: Tăng Tốc Độ Triển Khai

StatefulSet truyền thống chỉ hỗ trợ cập nhật tuần tự từng Pod, điều này có thể gây ra thời gian triển khai kéo dài khi có nhiều replica. Advanced StatefulSet giới thiệu tham số maxUnavailable cho phép cập nhật đồng thời nhiều Pod.

Cấu hình cập nhật song song:

podManagementPolicy: Parallel
updateStrategy:
  rollingUpdate:
    maxUnavailable: 3

Lợi ích của cập nhật song song:

  • Với 20 replica, tốc độ cập nhật có thể tăng 5-10 lần
  • Có thể điều chỉnh số lượng Pod tối đa có thể unavailable để cân bằng giữa tốc độ và tính sẵn sàng của dịch vụ
  • Kết hợp với cập nhật tại chỗ để đạt được quá trình rolling update nhanh chóng và không downtime

Hình minh họa quy trình resize PVC động trong Advanced StatefulSet, bao gồm các bước kiểm tra trạng thái, xác thực tương thích với storage plugin và cơ chế resize an toàn

3. Mở Rộng PVC Động: Tăng Dung Lượng Lưu Trữ Không Cần Restart

Advanced StatefulSet hỗ trợ mở rộng PVC động - tính năng mà StatefulSet gốc không có. Khi nhu cầu lưu trữ tăng lên, bạn có thể mở rộng dung lượng PVC mà không cần khởi động lại ứng dụng.

Cấu hình PVC ban đầu:

volumeClaimTemplates:
  - metadata:
      name: persistent-storage
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: ssd-storage
      resources:
        requests:
          storage: 50Gi

Quy trình mở rộng:

  1. Cập nhật giá trị storage trong StatefulSet
  2. Controller tự động kích hoạt quá trình mở rộng PVC
  3. Hệ thống storage tăng dung lượng theo yêu cầu
  4. Pod tiếp tục hoạt động bình thường, dịch vụ không bị gián đoạn

Lưu ý quan trọng:

  • Chỉ hỗ trợ mở rộng, không hỗ trợ thu hẹp
  • Yêu cầu hệ thống storage underlying hỗ trợ online expansion
  • Một số storage system có thể cần thao tác mở rộng filesystem bổ sung

4. Chính Sách Giữ Lại PVC: Quản Lý Lưu Trữ Tinh Vi

Advanced StatefulSet cung cấp các chính sách giữ lại PVC linh hoạt, cho phép bạn kiểm soát chính xác hành vi của PVC khi StatefulSet bị xóa hoặc scale down.

Cấu hình chính sách giữ lại:

persistentVolumeClaimRetentionPolicy:
  whenDeleted: Retain
  whenScaled: Delete

Các tùy chọn chính sách:

  • Retain: Giữ lại PVC, cần xóa thủ công
  • Delete: Tự động xóa PVC, giải phóng tài nguyên lưu trữ
  • Hỗ trợ cấu hình riêng biệt cho trường hợp xóa và scale down

5. Số Thứ Tự Replica Linh Hoạt: Chiến Lược Triển Khai Đa Dạng

Advanced StatefulSet cho phép tùy chỉnh số thứ tự bắt đầu của các replica, điều này đặc biệt hữu ích trong các kịch bản migration và blue-green deployment.

Cấu hình số thứ tự tùy chỉnh:

spec:
  replicas: 5
  ordinals:
    start: 2

Trường hợp sử dụng:

  • Migration từ StatefulSet khác để tránh xung đột tên
  • Blue-green deployment với quy tắc đặt tên nhất quán
  • Đánh số thống nhất khi triển khai đa cluster

6. Khởi Động Lại Container Nóng: Phục Hồi Nhanh Chóng

Advanced StatefulSet hỗ trợ khởi động lại container ở cấp độ container mà không cần tái tạo toàn bộ Pod. Tính năng này đặc biệt hữu ích trong các trường hợp thay đổi cấu hình container hoặc rò rỉ bộ nhớ.

Hình minh họa quy trình khởi tạo lại container hoàn chỉnh, bao gồm các bước từ trigger của người dùng, xử lý API server, điều phối của Kruise manager đến thực thi bởi container runtime

Ưu điểm của hot restart:

  • Giữ nguyên Pod IP và cấu hình mạng
  • Giữ nguyên trạng thái storage mount
  • Phục hồi nhanh các container gặp sự cố
  • Hỗ trợ pre-stop và post-start hooks

7. Ưu Tiên Cập Nhật: Lập Lịch Thông Minh

Advanced StatefulSet hỗ trợ chiến lược ưu tiên cập nhật dựa trên label, cho phép bạn kiểm soát thứ tự cập nhật các Pod.

Cấu hình chiến lược ưu tiên:

updateStrategy:
  rollingUpdate:
    unorderedUpdate:
      priorityStrategy:
        weightPriority:
          - weight: 75
            matchSelector:
              matchLabels:
                priority: high
          - weight: 25
            matchSelector:
              matchLabels:
                priority: normal

Các loại chiến lược ưu tiên:

  • Ưu tiên dựa trên label của node
  • Ưu tiên dựa trên label của Pod
  • Cấu hình trọng số tùy chỉnh
  • Hỗ trợ kết hợp nhiều selector

8. Thời Gian Chuẩn Bị Tối Thiểu: Đảm Bảo Ổn Định Dịch Vụ

Bằng cách cấu hình tham số minReadySeconds, bạn có thể đảm bảo Pod được coi là ready sau khi cập nhật chỉ khi đã trải qua đủ thời gian, tránh tình trạng nhận traffic quá sớm.

Cấu hình thời gian chuẩn bị tối thiểu:

updateStrategy:
  rollingUpdate:
    minReadySeconds: 45

Giá trị thực tiễn:

  • Cung cấp đủ thời gian cho ứng dụng khởi động và warm up
  • Tránh các vấn đề cold start ảnh hưởng đến chất lượng dịch vụ
  • Kết hợp với health check để đảm bảo dịch vụ thực sự sẵn sàng

9. Tạm Dừng và Tiếp Tục Cập Nhật: Kiểm Soát Quá Trình Phát Hành

Advanced StatefulSet hỗ trợ tạm dừng và tiếp tục quá trình cập nhật, rất hữu ích trong các trường hợp cần can thiệp thủ công hoặc triển khai theo giai đoạn.

Thao tác tạm dừng cập nhật:

# Tạm dừng cập nhật
kubectl patch sts.apps.kruise.io/my-database \
  --type='merge' -p '{"spec":{"updateStrategy":{"rollingUpdate":{"paused":true}}}}'

# Tiếp tục cập nhật
kubectl patch sts.apps.kruise.io/my-database \
  --type='merge' -p '{"spec":{"updateStrategy":{"rollingUpdate":{"paused":false}}}}'

Các trường hợp sử dụng:

  • Xác minh thủ công trong quá trình canary release
  • Tạm dừng phát hành trong tình huống khẩn cấp
  • Kiểm soát tinh vi cho việc triển khai theo từng giai đoạn

10. Cấu Hình Nâng Cao: Ví Dụ Thực Tế

Ví dụ cấu hình Advanced StatefulSet hoàn chỉnh:

apiVersion: apps.kruise.io/v1beta1
kind: StatefulSet
metadata:
  name: elasticsearch-cluster
spec:
  replicas: 3
  serviceName: elasticsearch
  podManagementPolicy: Parallel
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
      maxUnavailable: 1
      minReadySeconds: 60
      paused: false
      unorderedUpdate:
        priorityStrategy:
          weightPriority:
            - weight: 100
              matchSelector:
                matchLabels:
                  hardware-type: gpu-node
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Retain
    whenScaled: Retain
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: es-node
        image: elasticsearch:8.11.0
        ports:
        - containerPort: 9200
          name: http
        - containerPort: 9300
          name: transport
  volumeClaimTemplates:
  - metadata:
      name: es-data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 100Gi

Tham Khảo Source Code Chính

  • Định nghĩa API: apis/apps/v1beta1/statefulset_types.go - Định nghĩa đầy đủ các kiểu dữ liệu của Advanced StatefulSet
  • Controller Implementation: pkg/controller/statefulset/ - Logic điều khiển cốt lõi
  • Resize PVC Implementation: pkg/controller/statefulset/statefulset_resize_pvc.go - Chức năng mở rộng PVC động
  • In-place Update Implementation: pkg/util/inplaceupdate/ - Các công cụ cốt lõi cho cập nhật tại chỗ
  • Webhook Validation: pkg/webhook/statefulset/ - Validation nâng cao và thiết lập giá trị mặc định

Advanced StatefulSet mang đến những cải tiến đáng kể cho việc quản lý ứng dụng có trạng thái trong Kubernetes. Với các tính năng như cập nhật tại chỗ, cập nhật song song, và mở rộng PVC động, bạn có thể:

  • Giảm đáng kể thời gian cập nhật ứng dụng - Kết hợp cập nhật song song và cập nhật tại chỗ, tốc độ cập nhật có thể tăng 5-10 lần
  • Thực hiện bảo trì không downtime - Cập nhật tại chỗ giữ nguyên Pod IP và storage, dịch vụ liên tục
  • Mở rộng dung lượng lưu trữ linh hoạt - Mở rộng PVC online mà không cần khởi động lại ứng dụng
  • Kiểm soát phát hành tinh vi - Tạm dừng/tiếp tục, chiến lược ưu tiên, thời gian chuẩn bị tối thiểu và các tính năng kiểm soát nâng cao khác

Đối với các ứng dụng có trạng thái trong môi trường production, khuyến nghị chuyển đổi từ StatefulSet gốc sang Advanced StatefulSet. Quá trình migration diễn ra trơn tru, chỉ cần thay đổi API version và thêm các tham số cấu hình cần thiết.

Bắt đầu sử dụng:

# Cài đặt OpenKruise
kubectl apply -f https://github.com/openkruise/kruise/releases/download/v1.6.0/kruise.yaml

# Tạo Advanced StatefulSet đầu tiên
kubectl apply -f my-advanced-statefulset.yaml

Thẻ: Kubernetes kruise statefulset DevOps cloud-native

Đăng vào ngày 7 tháng 7 lúc 10:47