Kubernetes 배포 대 StatefulSet


110

저는 쿠 버네 티스에서 많은 것을 파헤 쳤고, 제가 많이 보는 것을 좋아합니다! 내가 명확하게 알 수 없었던 한 가지는 Deployment와 StatefulSet 리소스 간의 정확한 차이점과 각각을 사용하는 시나리오 (또는 일반적으로 선호되는 시나리오)입니다.

사람들이 공유 할 수있는 모든 경험은 굉장 할 것입니다 !!

답변:


114

배포 및 ReplicationController는 상태 비 저장 사용을위한 것이며 다소 가볍습니다. StatefulSet상태를 유지해야 할 때 사용됩니다. 따라서 후자 volumeClaimTemplates는 영구 볼륨에 대한 / 클레임을 사용 하여 구성 요소가 다시 시작되는 동안 상태를 유지할 수 있도록합니다.

따라서 애플리케이션이 상태 저장이거나 Kubernetes 위에 상태 저장 스토리지를 배포하려는 경우 StatefulSet을 사용합니다.

애플리케이션이 상태 비 추적이거나 시작 중에 백엔드 시스템에서 상태를 구축 할 수있는 경우 배포를 사용합니다.

상태 저장 애플리케이션 실행에 대한 자세한 내용은 상태 저장 애플리케이션에 대한 2016 kubernetes의 블로그 항목 에서 찾을 수 있습니다.


16
또한 영구 볼륨 클레임을 사용하여 배포 포드를 연결하고 안전 할 수 있습니다.
Torsten Bronger 2017-06-30

9
@TorstenBronger 동의합니다-어느 시점에서 StatefulSets의 요점이 무엇인지에 대한 원래 질문으로 돌아 갑니까?
HDave

6
@HDave 동적 영구 볼륨과 빠르게 발전하는 스토리지 공급자 (예 : Portworx, OpenEBS)를 사용하면 데이터 지속성 문제를 해결할 수 있지만 이름 지정 및 시작 / 업그레이드 순서가 StatefulSets와 여전히 다르므로 마스터 / 슬레이브 또는 기타 설정이 필요한 앱이 제대로 클러스터를 형성합니다. 이 모든 것이 deployment노드 당 1 개 (데몬 셋), 복제본 또는 상태 저장 순서를 설정하는 간단한 사양으로 단일 구성 으로 접힐 수 있다는 데 동의합니다 .
Mani Gandham

4
"시작 / 업그레이드 순서"는 다른 포드 (예 : 웹, srv, db 등)가 아니라 포드 복제본 (예 : 1, 2, 3 ...)에 관한 것임을 인식하는 것이 중요합니다. 달리 말하면 docker-compose 종속성을 대체하는 것이 아닙니다.
HDave 2017-10-06

72
  • 배포- 모든 포드 복제본이 공유 하는 PersistentVolumeClaim 을 지정합니다 . 즉, 공유 볼륨입니다.

    두 개 이상의 복제본 포드가있는 경우 백업 스토리지에는 분명히 ReadWriteMany 또는 ReadOnlyMany accessMode 가 있어야합니다 .

  • StatefulSet- 각 복제본 포드가 연결된 고유 한 PersistentVolumeClaim을 가져 오도록 volumeClaimTemplates를 지정 합니다. 즉, 공유 볼륨이 없습니다.

    여기서 백업 저장소는 ReadWriteOnce accessMode를 가질 수 있습니다 .

    StatefulSet은 클러스터에서 실행하는 데 유용합니다 (예 : Hadoop 클러스터, MySQL 클러스터). 여기서 각 노드에는 자체 스토리지가 있습니다.


23

TL; DR

배포는 상태 비 저장 애플리케이션을 배포하기위한 리소스입니다. PVC를 사용하는 경우 모든 복제본이 동일한 볼륨을 사용하고 어느 것도 자체 상태를 갖지 않습니다.

Statefulset은 Stateful 애플리케이션에 사용되며 포드의 각 복제본은 자체 상태를 가지며 자체 볼륨을 사용합니다.

DaemonSet은 포드가 클러스터의 모든 노드에서 실행되도록하는 컨트롤러입니다. 클러스터에서 노드가 추가 / 제거되면 DaemonSet이 자동으로 포드를 추가 / 삭제합니다.

Deployments, StatefulSets 및 Daemonsets 간의 자세한 차이점과 이러한 리소스 K8 : Deployments vs StatefulSets vs DaemonSets를 사용하여 샘플 애플리케이션을 배포하는 방법에 대해 작성했습니다 .


4
귀하의 의견에 대해 후속 조치를 취하기 위해 두 가지의 차이점은 하나는 포드 특정 저장소를 지정 (따라서 포드 특정 상태 유지)하는 기능이있는 반면 다른 하나는 그렇지 않은 것입니다 (따라서 서비스 만 지속 할 수 있음). -전체 주). 그런 의미에서 서비스 수준에서 둘 다 상태 저장으로 볼 수 있습니다. 그러나 포드 수준에서는 Statefulset 만 상태 저장입니다.
scabbage

14

StatefulSet

각 노드가 영구 상태 를 가져야하는 상태 저장 분산 애플리케이션과 함께 'StatefulSet'을 사용 합니다. StatefulSet은 구성 (복제본 = N)을 통해 상태 저장 애플리케이션 / 구성 요소에 대해 임의의 수의 노드를 구성하는 기능을 제공합니다.

상태 저장 분산 응용 프로그램에는 마스터-마스터와 마스터-슬레이브의 두 가지 종류가 있습니다. 마스터-마스터 구성의 모든 노드와 마스터-슬레이브 구성의 슬레이브 노드는 StatefulSet를 사용할 수 있습니다.
예 :
마스터-슬레이브-> Hadoop 클러스터의
데이터 노드 ( 슬레이브) 마스터-마스터-> Cassandra 클러스터의 데이터베이스 노드 (마스터-마스터)

StatefulSet의 각 포드 (복제본 / 노드)에는 고유하고 안정적인 네트워크 ID가 있습니다. 예를 들어 이름이 'cassandra'이고 복제본 노드 수가 N 인 Cassandra StatefulSet에서 각 Cassandra 포드 (노드)에는 다음이 포함됩니다.

  • 각 포드의 서수 색인 : 0,1, .., N-1
  • 안정적인 네트워크 ID : cassandra-0, cassandra-1, .., cassandra-N-1
  • 볼륨 클레임 템플릿에 대한 각 포드에 대한 별도의 영구 볼륨, 즉 모든 포드 (노드)에 대한 별도의 저장소
  • 포드는 0에서 N-1까지의 순서로 생성되고 N-1에서 0까지의 역순으로 종료됩니다.

참조 : https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

전개

반면에 '배포' 는 노드에 특별한 ID가 필요하지 않은 상태 비 저장 애플리케이션 / 서비스에 적합합니다 . 로드 밸런서는 선택한 모든 노드에 도달 할 수 있습니다. 모든 노드가 동일합니다. 배포는 구성 (복제본 = N)을 통해 임의의 노드를 생성하는 데 유용합니다.


7

StatefulSet와 배포의 차이점

StatefulSet는 특수 배포와 동일합니다. StatefulSet의 각 포드에는 클러스터의 다른 구성원을 검색하는 데 사용할 수있는 안정적이고 고유 한 네트워크 식별자가 있습니다. StatefulSet의 이름이 Kafka이면 첫 번째 포드는 Kafka-0, 두 번째 포드는 Kafka-1 등입니다. StatefulSet에 의해 제어되는 포드 복사의 시작 및 중지 시퀀스가 ​​제어됩니다. n 번째 포드가 작동되면 첫 번째 N-1 포드가 이미 실행 중이고 준비 상태가 양호합니다. StatefulSet의 포드는 PV 또는 PVC로 구현 된 안정적인 영구 저장소 볼륨을 사용합니다. 포드를 삭제할 때 StatefulSet와 연결된 스토리지 볼륨은 기본적으로 삭제되지 않습니다 (데이터 보안을 위해). StatefulSet은 PV 볼륨에 바인딩되도록 바인딩됩니다. 포드 상태 데이터를 저장하는 데 사용되며 해당 헤드리스 서비스에 속하는 것으로 선언 된 헤드리스 서비스와 함께 사용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.