Header Ads Widget

Ticker

6/recent/ticker-posts

Khi nào dùng Deployments, ReplicaSet, StatefulSets hay DaemonSet cho việc phát triển ứng dụng trên Kubernetes

Keyword: When use Deployments, ReplicaSet, StatefulSets or DaemonSet for Application on Kubernetes.

Dạo này tìm việc khó khăn quá, vì số lượng DevOps ngày càng tăng nên thành ra việc đòi hỏi một kỹ sư DevOps không đơn giản còn là kinh nghiệm không mà còn phải có các yếu tố khác nữa, trong đó Tiếng Anh lại là thứ chính cần thiết quyết định sự nghiệp của ngành DevOps này, thành ra bản thân mình cũng đang chuẩn bị đi học English để cố gắng phát triển hơn nữa, nên mới ít viết bài đến như vậy, lâu lâu viết một bài về Kubernetes để dễ nhớ xíu, cũng như cho một vài anh em vẫn còn theo dõi Blog của mình.

Mà giờ cũng đâu còn ai coi ngó gì đến mấy bài Blog nữa, bởi lẽ công nghệ ChatGPT tốt quá rồi, chỉ cần các bạn gõ vài dòng chữ cho một câu hỏi nào đó thì AI sẽ trả lời cấp tóc cho các bạn, thôi không nói nhiều vụ này nữa, vào chủ đề của chúng ta thôi nào, phía Kubernetes để triển khai cơ bản nhất chính là thằng Pod và bên trong Pod thì luôn chứa các Container của các ứng dụng của chúng ta vậy để quản lý Pod thì thế nào? phía Kubernetes đã cung cấp cho chúng ta vài thứ để thực hiện quản lý Pod đó chính là Deployments, StatefulSets và DaemonSet mình và các bạn sẽ cùng tìm hiểu từng thằng trước nhé.

  • Deployments: Quản lý các Ứng dụng không Trạng thái

Deployment là một tài nguyên rất phổ biến, được sử dụng để triển khai và quản lý các ứng dụng theo cách linh hoạt và tự động. Deployment giúp bạn quản lý số lượng Pod theo mong muốn và cung cấp một cơ chế tự động duy trì chúng. Mỗi Deployment được liên kết với một ReplicaSet – một tài nguyên giúp đảm bảo số lượng Pod luôn đạt yêu cầu. Deployment còn hỗ trợ các tác vụ cập nhật và quay lui về các phiên bản cũ một cách tự động, đảm bảo hệ thống luôn ở trạng thái mong muốn mà không gây gián đoạn cho người dùng.

Ví dụ, nếu bạn yêu cầu một Deployment duy trì chỉ một Pod, Kubernetes sẽ tạo một ReplicaSet để kiểm tra rằng luôn có đúng một Pod đang chạy. Nếu Pod bị lỗi hoặc gặp sự cố, ReplicaSet sẽ tự động tạo một Pod thay thế.

Lợi ích của việc sử dụng Deployment

Deployment rất phù hợp cho các ứng dụng không lưu trạng thái (stateless) với các ưu điểm nổi bật sau:

  • Tính sẵn sàng và tự động phục hồi: Deployment tự động khởi tạo lại các Pod bị lỗi để luôn duy trì trạng thái sẵn sàng của ứng dụng. Điều này đảm bảo rằng ứng dụng luôn có đủ số lượng bản sao đang hoạt động.
  • Mở rộng quy mô dễ dàng: Đối với những ứng dụng có nhu cầu mở rộng, bạn chỉ cần thay đổi số lượng Pod trong Deployment, Kubernetes sẽ tự động thêm hoặc bớt Pod để đáp ứng nhu cầu lưu lượng truy cập.
  • Hỗ trợ cập nhật và quay lui (rollback): Với Deployment, bạn có thể cập nhật phiên bản mới của ứng dụng và quay lui về phiên bản cũ nếu gặp lỗi. Kubernetes đảm bảo các bản cập nhật này diễn ra dần dần, giúp tránh gián đoạn dịch vụ.

Giả sử bạn có một ứng dụng web và muốn duy trì ít nhất 2 bản sao để đảm bảo tính sẵn sàng. Việc sử dụng Deployment giúp Kubernetes tự động duy trì số lượng Pod đúng như mong muốn, thay thế bất kỳ Pod nào gặp sự cố mà không cần can thiệp thủ công.

Khi nào không nên sử dụng Deployment?

Mặc dù Deployment rất hữu ích, nhưng nó không phù hợp trong mọi trường hợp, đặc biệt là với các ứng dụng có trạng thái ổn định (stateful) hoặc có yêu cầu lưu trữ cục bộ:

  • Ứng dụng cần lưu trữ trạng thái: Nếu ứng dụng của bạn cần lưu trữ dữ liệu lâu dài trên từng Pod (stateful), việc sử dụng StatefulSet sẽ thích hợp hơn. Pod trong Deployment có tính chất tạm thời và dữ liệu sẽ bị mất nếu Pod bị xóa hoặc di chuyển. StatefulSet cung cấp khả năng quản lý dữ liệu riêng biệt trên mỗi Pod, giúp lưu trữ trạng thái ổn định.
  • Sử dụng Persistent Volume (PV): Một số ứng dụng không lưu trạng thái vẫn cần lưu dữ liệu tạm thời. Gắn Persistent Volume vào Deployment có thể là một cách, nhưng các Pod sẽ dùng chung Volume, dẫn đến dữ liệu giống nhau. Với ứng dụng yêu cầu lưu dữ liệu riêng biệt cho từng Pod, StatefulSet hoặc các chiến lược lưu trữ khác sẽ thích hợp hơn.
  • Yêu cầu triển khai một Pod duy nhất trên mỗi node: Nếu chỉ cần chạy một Pod trên mỗi node trong cluster, sử dụng Pod hoặc DaemonSet thay vì Deployment sẽ phù hợp hơn. DaemonSet đảm bảo mỗi node đều chạy một Pod của ứng dụng, trong khi Deployment lại không hỗ trợ cơ chế này.

Cách thức hoạt động của Deployment khi triển khai ứng dụng

Khi triển khai một ứng dụng qua Deployment, Kubernetes sử dụng Service để tạo cơ chế cân bằng tải (load balancing), điều phối lưu lượng truy cập đến các Pod. Các Pod này được cấu hình thông qua biến môi trường và ConfigMaps, giúp chúng dễ dàng kết nối với cơ sở dữ liệu và hoạt động nhất quán. Nếu có yêu cầu tăng số lượng bản sao ứng dụng, Kubernetes sẽ tự động tạo thêm Pod với cùng cấu hình ban đầu, giúp hệ thống hoạt động liên tục mà không cần phải tái cấu hình thủ công.

  • StatefulSets: Quản lý các Ứng dụng Có Trạng thái

StatefulSet là một loại Controller đặc biệt được thiết kế để quản lý các ứng dụng có trạng thái (stateful applications), giúp triển khai và duy trì các Pod với một danh tính và thứ tự nhất định. Khác với Deployment vốn tạo các Pod không có thứ tự cố định và không cần lưu trữ dữ liệu cục bộ, StatefulSet đảm bảo rằng mỗi Pod có một danh tính độc nhất và lưu trữ dữ liệu của nó một cách ổn định thông qua PersistentVolume (PV).


StatefulSet không tạo ReplicaSet như Deployment mà thay vào đó, nó tự quản lý các Pod với tên duy nhất. Mỗi Pod sẽ được gán một tên theo cấu trúc <tên-statefulset>-<index>, với index tăng dần, chẳng hạn như database-0, database-1, database-2,...  

Danh tính cố định này giúp StatefulSet đảm bảo rằng mỗi Pod có thể được tạo lại mà không mất đi dữ liệu hoặc gây ra sự thay đổi không mong muốn.

Tại sao nên dùng StatefulSet?

StatefulSet được thiết kế cho các trường hợp mà thứ tự khởi tạo, danh tính độc nhất của Pod và lưu trữ dữ liệu là rất quan trọng. Điều này bao gồm:

  • Các dịch vụ dữ liệu: Ứng dụng như cơ sở dữ liệu quan hệ (MySQL, PostgreSQL), cơ sở dữ liệu NoSQL (Cassandra), hoặc các hệ thống lưu trữ key-value như Redis, thường yêu cầu mỗi Pod có dữ liệu riêng biệt, được lưu trữ an toàn và được truy cập theo một thứ tự cụ thể.
  • Hệ thống đồng thuận (consensus) và bầu chọn leader: Các ứng dụng clustering hoặc yêu cầu chọn leader như Kafka, Hadoop cần đảm bảo rằng các Pod được triển khai theo thứ tự nhất định để duy trì cấu trúc và toàn vẹn dữ liệu của hệ thống.
  • Ứng dụng yêu cầu triển khai tuần tự: Với StatefulSet, các Pod được tạo và xóa lần lượt theo thứ tự, giúp quản lý dễ dàng hơn cho những ứng dụng yêu cầu triển khai tuần tự, như các hệ thống phân tán có tính phụ thuộc lẫn nhau.

Cách thức hoạt động của StatefulSet

Mỗi Pod trong StatefulSet được gắn với một PersistentVolume riêng biệt thông qua Persistent Volume Claim (PVC), đảm bảo rằng dữ liệu của nó không bị mất ngay cả khi Pod gặp sự cố. Kubernetes sẽ gán các Pod của StatefulSet vào các volume cố định, và nếu một Pod được xóa hoặc gặp sự cố, Kubernetes sẽ tạo lại Pod với cùng danh tính và volume ban đầu.

Một ví dụ điển hình là khi bạn triển khai một cụm cơ sở dữ liệu. StatefulSet sẽ đảm bảo rằng mỗi Pod có một bộ dữ liệu riêng và được gán vào cùng PersistentVolume mỗi khi nó được khởi động lại. Nhờ đó, dữ liệu của từng Pod vẫn an toàn và sẵn sàng cho hệ thống dù Pod có bị khởi tạo lại.

Khi nào không nên sử dụng StatefulSet?

StatefulSet không phải lúc nào cũng là giải pháp phù hợp. Một số trường hợp mà StatefulSet không được khuyến nghị bao gồm:

  • Ứng dụng không trạng thái (stateless): Nếu ứng dụng của bạn không yêu cầu lưu trữ cục bộ hoặc thứ tự triển khai, bạn nên sử dụng Deployment thay vì StatefulSet. Deployment đơn giản hơn và cho phép triển khai song song, nhanh chóng, phù hợp với các ứng dụng không yêu cầu lưu trữ dữ liệu giữa các Pod.
  • Không cần danh tính cố định: Nếu không yêu cầu danh tính cố định hoặc dữ liệu không cần được lưu trữ lâu dài, StatefulSet là một sự phức tạp không cần thiết.
  • Cần triển khai song song: StatefulSet triển khai các Pod theo tuần tự, làm giảm khả năng triển khai song song nhanh chóng so với các Controller khác như Deployment. Nếu ứng dụng của bạn đòi hỏi tính đồng thời và khả năng mở rộng nhanh, hãy cân nhắc dùng Deployment hoặc một giải pháp không trạng thái khác.

Kết luận

StatefulSet là lựa chọn mạnh mẽ và tối ưu cho các ứng dụng cần danh tính cố định, thứ tự khởi tạo cụ thể và khả năng lưu trữ dữ liệu riêng biệt. Tuy nhiên, nếu không có các yêu cầu này, việc chọn StatefulSet có thể gây ra sự phức tạp không cần thiết cho hệ thống. Cân nhắc kỹ loại ứng dụng và nhu cầu lưu trữ trước khi quyết định sử dụng StatefulSet để tối ưu hóa quản lý và hiệu suất trên Kubernetes.

  • DaemonSet: Giải pháp Cho Các Ứng Dụng Cấp Cụm

DaemonSet là một controller đảm bảo rằng mỗi node trong cluster sẽ có một bản sao của một pod cụ thể. Khi sử dụng DaemonSet, mỗi lần thêm hoặc xóa node, một pod mới sẽ tự động được tạo hoặc gỡ bỏ tương ứng. Điều này đặc biệt hữu ích cho các ứng dụng cần chạy trên mọi node trong cluster để thực hiện các chức năng cấp cụm như giám sát, thu thập log, hoặc quản lý tài nguyên hệ thống.

Không giống như Deployment, DaemonSet không yêu cầu chỉ định số lượng bản sao (replicas). Thay vào đó, số lượng pod sẽ được kiểm soát dựa trên số lượng node hiện tại. Khi một node mới tham gia vào cluster, DaemonSet sẽ tạo ngay một pod trên node đó và ngược lại, nếu node bị xóa, pod tương ứng sẽ bị gỡ bỏ.

Các Trường Hợp Ứng Dụng của DaemonSet

DaemonSet đặc biệt hữu ích khi triển khai các ứng dụng cần có mặt trên toàn bộ hoặc một nhóm node trong cluster. Một số trường hợp tiêu biểu bao gồm:

  • Giám sát và thu thập log: Để giám sát tài nguyên hoặc thu thập log từ mỗi node, DaemonSet giúp triển khai các công cụ như Prometheus Node Exporter hoặc Fluentd. Nhờ vậy, các pod giám sát và thu thập log này luôn hiện diện trên mọi node, giúp thu thập thông tin đầy đủ từ toàn bộ hệ thống.
  • Dịch vụ hệ thống cần mặt trên mọi node: Một số dịch vụ cấp hệ thống, như kube-proxy hoặc các dịch vụ điều khiển mạng, cần có mặt trên tất cả các node để đảm bảo tính nhất quán của cluster.
  • Các công cụ bảo mật và quản lý tài nguyên: DaemonSet cũng phù hợp để triển khai các agents bảo mật (như Falco), hoặc các công cụ phân tích và quản lý tài nguyên. Các agents này giám sát tài nguyên, bảo vệ các node và duy trì tính ổn định của hệ thống.

Cách Triển Khai và Lưu Ý

DaemonSet sẽ triển khai một pod trên mỗi node. Tuy nhiên, trong trường hợp bạn muốn hạn chế DaemonSet chỉ chạy trên một số node cụ thể, Kubernetes cung cấp công cụ nodeSelector. Điều này giúp bạn chỉ định một nhóm node nhất định để chạy DaemonSet thay vì toàn bộ cluster, chẳng hạn như chỉ trên những node có type=monitor.

Ngoài ra, để cho phép DaemonSet chạy trên các node có taint (ví dụ: node master), bạn cần chỉ định tolerations trong cấu hình pod. Tolerations cho phép pod có thể chạy trên các node bị đánh dấu hạn chế, đảm bảo triển khai đúng nhu cầu.

Khi Nào Không Nên Sử Dụng DaemonSet?

DaemonSet không phải lúc nào cũng là giải pháp tối ưu, đặc biệt khi:

  • Ứng dụng không cần chạy trên mỗi node: Nếu ứng dụng không yêu cầu sự có mặt trên mọi node, Deployment hoặc StatefulSet có thể là lựa chọn linh hoạt hơn, giúp tiết kiệm tài nguyên và tăng hiệu suất.
  • Ứng dụng cần mở rộng dựa trên tải: DaemonSet không hỗ trợ auto-scaling (mở rộng tự động theo nhu cầu). Nếu ứng dụng yêu cầu số lượng pod thay đổi theo tải, một giải pháp như Deployment sẽ phù hợp hơn.
  • Ứng dụng có trạng thái phức tạp: Các ứng dụng cần lưu trữ dữ liệu cố định và có danh tính pod riêng biệt sẽ phù hợp hơn với StatefulSet, vì DaemonSet không hỗ trợ duy trì trạng thái cho các pod.

Kết Luận

DaemonSet là công cụ mạnh mẽ trong Kubernetes cho phép đảm bảo các ứng dụng cần thiết có mặt trên mọi node trong cluster. Đây là giải pháp tối ưu cho các ứng dụng giám sát, thu thập log, và các công cụ bảo mật hệ thống. Tuy nhiên, nếu ứng dụng không yêu cầu tính năng này hoặc có nhu cầu mở rộng linh hoạt, bạn nên cân nhắc các lựa chọn khác như Deployment hoặc StatefulSet để đạt hiệu quả tốt nhất.

Nguồn: www.itblognote.com

Post a Comment

0 Comments