Kubernetes Deployments so với StatefulSets


110

Tôi đã nghiên cứu rất nhiều về Kubernetes, và tôi thích những gì tôi thấy nhiều! Một điều mà tôi không thể hiểu rõ ràng là sự phân biệt chính xác giữa tài nguyên Deployment và StatefulSet là gì và bạn sẽ sử dụng từng tình huống nào (hoặc thường được ưu tiên hơn so với kịch bản khác).

Mọi người có thể chia sẻ kinh nghiệm sẽ thật tuyệt vời !!

Câu trả lời:


113

Deployments và ReplicationControllers dành cho việc sử dụng không trạng thái và khá nhẹ. StatefulSets được sử dụng khi trạng thái phải được duy trì. Do đó, việc sử dụng volumeClaimTemplates/ xác nhận quyền sở hữu sau này đối với các khối lượng liên tục để đảm bảo chúng có thể giữ trạng thái khi khởi động lại thành phần.

Vì vậy, nếu ứng dụng của bạn là trạng thái hoặc nếu bạn muốn triển khai lưu trữ trạng thái trên Kubernetes, hãy sử dụng StatefulSet.

Nếu ứng dụng của bạn không có trạng thái hoặc nếu trạng thái có thể được xây dựng từ hệ thống phụ trợ trong quá trình khởi động thì hãy sử dụng Triển khai.

Bạn có thể tìm thêm thông tin chi tiết về việc chạy ứng dụng trạng thái trong mục blog của kubernetes năm 2016 về các ứng dụng trạng thái


16
Tôi cũng có thể kết nối các nhóm của một triển khai với yêu cầu khối lượng liên tục và an toàn.
Torsten Bronger

9
@TorstenBronger Tôi đồng ý - tại thời điểm đó chúng ta quay lại câu hỏi ban đầu về quan điểm của StatefulSets là gì?
HDave

6
@HDave Với khối lượng liên tục động và các nhà cung cấp lưu trữ đang phát triển nhanh chóng (như Portworx, OpenEBS), vấn đề liên tục dữ liệu có thể được giải quyết nhưng việc đặt tên và thứ tự khởi động / nâng cấp vẫn khác với StatefulSets, cho phép các ứng dụng cần thiết lập chính / phụ hoặc thiết lập khác đúng cách tạo thành một cụm. Mặc dù tôi đồng ý rằng có lẽ tất cả điều này có thể được xếp lại thành một deploymentcấu hình duy nhất với thông số kỹ thuật đơn giản để đặt 1-mỗi nút (daemonset), bản sao hoặc thứ tự trạng thái.
Mani Gandham

4
Điều quan trọng là nhận ra "thứ tự khởi động / nâng cấp" là về các bản sao Pod (tức là 1, 2, 3 ...) - không phải các nhóm khác nhau (tức là web, srv, db, v.v.). Nói cách khác, nó không phải là sự thay thế cho các phụ thuộc do docker-soạn.
HDave

72
  • Triển khai - Bạn chỉ định một PersentlyVolumeClaim được chia sẻ bởi tất cả các bản sao nhóm. Nói cách khác, khối lượng chia sẻ.

    Bộ nhớ sao lưu rõ ràng phải có ReadWriteMany hoặc ReadOnlyMany accessMode nếu bạn có nhiều hơn một nhóm bản sao.

  • StatefulSet - Bạn chỉ định volumeClaimTemplates để mỗi nhóm bản sao nhận được một PersentlyVolumeClaim duy nhất được liên kết với nó. Nói cách khác, không có khối lượng được chia sẻ.

    Ở đây, bộ nhớ sao lưu có thể có Mã truy cập ReadWriteOnce .

    StatefulSet rất hữu ích để chạy mọi thứ trong cụm, ví dụ cụm Hadoop, cụm MySQL, nơi mỗi nút có bộ nhớ riêng.


23

TL; DR

Triển khai là một tài nguyên để triển khai một ứng dụng không trạng thái, nếu sử dụng PVC, tất cả các bản sao sẽ sử dụng cùng một Khối lượng và không bản sao nào có trạng thái riêng.

Statefulsets được sử dụng cho các ứng dụng Stateful, mỗi bản sao của nhóm sẽ có trạng thái riêng và sẽ sử dụng Khối lượng riêng của nó.

DaemonSet là một bộ điều khiển đảm bảo rằng pod chạy trên tất cả các nút của cụm. Nếu một nút được thêm / xóa khỏi một cụm, DaemonSet sẽ tự động thêm / xóa nhóm.

Tôi đã viết về sự khác biệt chi tiết giữa Deployments, StatefulSets & Daemonsets và cách triển khai một ứng dụng mẫu bằng cách sử dụng các Tài nguyên này K8s: Deployments vs StatefulSets vs DaemonSets .


4
Để theo dõi nhận xét của bạn, có vẻ như đối với tôi sự khác biệt giữa cả hai là, một loại có khả năng chỉ định bộ nhớ cụ thể của nhóm (và do đó duy trì trạng thái cụ thể của nhóm), trong khi cái kia thì không (và do đó chỉ có thể duy trì dịch vụ -toàn bang). Theo nghĩa đó, ở cấp độ dịch vụ, cả hai đều có thể được xem là trạng thái. Nhưng ở cấp độ nhóm, chỉ có Statefulsets là trạng thái.
scabbage

14

StatefulSet

Sử dụng 'StatefulSet' với các Ứng dụng Phân tán Trạng thái , yêu cầu mỗi nút phải có trạng thái ổn định . StatefulSet cung cấp khả năng định cấu hình một số lượng nút tùy ý, cho một ứng dụng / thành phần trạng thái, thông qua một cấu hình (bản sao = N).

Có hai loại ứng dụng phân tán trạng thái: Master-Master và Master-Slave. Tất cả các nút trong cấu hình Master-Master và các nút Slave trong cấu hình Master-Slave có thể sử dụng StatefulSet.
Ví dụ:
Master-Slave -> Datanodes (nô lệ) trong một cụm Hadoop
Master-Master -> Các nút cơ sở dữ liệu (chính-chủ) trong một cụm Cassandra

Mỗi Pod (bản sao / nút) trong StatefulSet có danh tính mạng Duy nhất và Ổn định. Ví dụ: trong Cassandra StatefulSet có tên là 'cassandra' và số lượng nút bản sao là N, mỗi nhóm Cassandra (nút) có:

  • Chỉ số thứ tự cho mỗi nhóm: 0,1, .., N-1
  • Id mạng ổn định: cassandra-0, cassandra-1, .., cassandra-N-1
  • Một khối lượng liên tục riêng biệt cho từng nhóm so với mẫu yêu cầu khối lượng tức là một bộ nhớ riêng cho mỗi nhóm (nút)
  • Các nhóm được tạo theo thứ tự 0 đến N-1 và kết thúc theo thứ tự ngược lại N-1 đến 0

Tham khảo: https://kubernetes.io/docs/concept/workloads/controllers/statefulset/

Triển khai

Mặt khác, 'triển khai' phù hợp với các ứng dụng / dịch vụ không trạng thái mà các nút không yêu cầu bất kỳ danh tính đặc biệt nào. Bộ cân bằng tải có thể tiếp cận bất kỳ nút nào mà nó chọn. Tất cả các nút đều bằng nhau. Triển khai hữu ích để tạo bất kỳ số lượng nút tùy ý nào, thông qua cấu hình (bản sao = N).


7

Sự khác biệt giữa StatefulSet và triển khai

StatefulSet tương đương với một triển khai đặc biệt. Mỗi nhóm trong StatefulSet có một định danh mạng duy nhất, ổn định có thể được sử dụng để khám phá các thành viên khác trong cụm. Nếu tên của StatefulSet là Kafka, thì nhóm đầu tiên được gọi là Kafka-0, Kafka-1 thứ hai, v.v.; trình tự bắt đầu và dừng của bản sao nhóm do StatefulSet kiểm soát được kiểm soát. Khi nhóm thứ n được vận hành, các nhóm N-1 đầu tiên đã chạy và sẵn sàng ở trạng thái Tốt; nhóm trong StatefulSet sử dụng khối lượng lưu trữ ổn định liên tục, do PV hoặc PVC thực hiện. Khi xóa nhóm, dung lượng lưu trữ được liên kết với StatefulSet không bị xóa theo mặc định (để bảo mật dữ liệu); StatefulSet bị ràng buộc với khối lượng PV. Được sử dụng để lưu trữ dữ liệu trạng thái nhóm và cũng được sử dụng cùng với các dịch vụ không đầu, được tuyên bố là thuộc về dịch vụ không đầu đó;

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.