Wdrożenia Kubernetes a StatefulSets

110

Dużo kopałem na Kubernetes i bardzo podoba mi się to, co widzę! Jedną z rzeczy, których nie mogłem uzyskać jasnego pojęcia, jest to, jakie są dokładne różnice między zasobami Deployment i StatefulSet oraz w jakich scenariuszach będziesz używać każdego z nich (lub jest ogólnie preferowany w stosunku do drugiego).

Jakiekolwiek doświadczenia, którymi ludzie mogliby się podzielić, byłyby niesamowite !!

SS781
źródło

Odpowiedzi:

114

Wdrożenia i kontrolery replikacji są przeznaczone do użycia bezstanowego i są raczej lekkie. StatefulSets są używane, gdy stan ma zostać utrwalony. Dlatego te ostatnie używają volumeClaimTemplates/ oświadczają na trwałych woluminach, aby zapewnić, że mogą zachować stan po ponownym uruchomieniu składnika.

Jeśli więc Twoja aplikacja jest stanowa lub jeśli chcesz wdrożyć stanową pamięć masową na Kubernetes, użyj StatefulSet.

Jeśli Twoja aplikacja jest bezstanowa lub jeśli stan można zbudować na podstawie systemów zaplecza podczas uruchamiania, użyj wdrożeń.

Więcej informacji na temat uruchamiania aplikacji stanowych można znaleźć we wpisie na blogu kubernetes z 2016 r. Dotyczącym aplikacji stanowych

pagid
źródło
16
Mogę również łączyć pody we wdrożeniu z trwałymi oświadczeniami o woluminie i być bezpiecznym.
Torsten Bronger
9
@TorstenBronger Zgadzam się - w którym momencie wracamy do pierwotnego pytania, jaki jest cel StatefulSets?
HDave
6
@HDave Dzięki dynamicznym woluminom trwałym i szybko rozwijającym się dostawcom pamięci masowej (takim jak Portworx, OpenEBS) problem trwałości danych można rozwiązać, ale kolejność nazewnictwa i uruchamiania / aktualizacji jest nadal inna w przypadku StatefulSets, umożliwiając aplikacjom, które wymagają konfiguracji głównej / podrzędnej lub innej konfiguracji prawidłowo tworzą klaster. Chociaż zgadzam się, że być może wszystko to można złożyć w jedną deploymentkonfigurację z prostą specyfikacją, aby ustawić 1-na-węzeł (zestaw demonów), repliki lub porządkowanie stanowe.
Mani Gandham
4
Ważne jest, aby zdać sobie sprawę, że „kolejność uruchamiania / uaktualniania” dotyczy replik Pod (tj. 1, 2, 3…) - a nie różnych podów (tj. Web, srv, db itp.). Innymi słowy, nie jest to podstawienie dla zależności docker-compose.
HDave
72
  • Wdrożenie - należy określić PersistentVolumeClaim, który jest współużytkowany przez wszystkie repliki pod. Innymi słowy, współdzielona głośność.

    Magazyn zapasowy oczywiście musi mieć tryb dostępu ReadWriteMany lub ReadOnlyMany, jeśli masz więcej niż jedną replikę pod.

  • StatefulSet - możesz określić volumeClaimTemplates , aby każda replika otrzymała unikatową powiązaną z nią PersistentVolumeClaim . Innymi słowy, brak wspólnego woluminu.

    W tym przypadku magazyn zapasowy może mieć tryb dostępu ReadWriteOnce .

    StatefulSet jest przydatny do uruchamiania rzeczy w klastrze, np. Klastrze Hadoop, klastrze MySQL, gdzie każdy węzeł ma swój własny magazyn.

Emmanuel Osimosu
źródło
23

TL; DR

Wdrożenie to zasób służący do wdrażania aplikacji bezstanowej. W przypadku korzystania z obwodu PVC wszystkie repliki będą używać tego samego wolumenu i żadna z nich nie będzie miała własnego stanu.

Statefulsets jest używany dla aplikacji Stateful, każda replika pod będzie miała swój własny stan i będzie używać własnego woluminu.

DaemonSet to kontroler, który zapewnia, że ​​pod działa na wszystkich węzłach klastra. Jeśli węzeł jest dodawany / usuwany z klastra, DaemonSet automatycznie dodaje / usuwa pod.

Pisałem o szczegółowych różnicach między Deployments, StatefulSets i Daemonsets oraz o tym, jak wdrożyć przykładową aplikację przy użyciu tych zasobów K8: Deployments vs StatefulSets vs DaemonSets .

Ali Kahoot
źródło
4
Kontynuując twój komentarz, wydaje mi się, że różnica między nimi polega na tym, że jeden ma możliwość określenia pamięci specyficznej dla poda (i tym samym utrzymuje stan określonego poda), podczas gdy drugi nie (i dlatego może utrzymywać tylko usługę stan ogólnokrajowy). W tym sensie na poziomie usług oba można postrzegać jako stanowe. Ale na poziomie pod, tylko Statefulsets jest stanowy.
parch
14

StatefulSet

Użyj „StatefulSet” ze stanowymi aplikacjami rozproszonymi, które wymagają, aby każdy węzeł miał trwały stan . StatefulSet umożliwia skonfigurowanie dowolnej liczby węzłów dla aplikacji / komponentu pełnostanowego za pomocą konfiguracji (repliki = N).

Istnieją dwa rodzaje aplikacji rozproszonych ze stanem: Master-Master i Master-Slave. Wszystkie węzły w konfiguracji Master-Master i węzły Slave w konfiguracji Master-Slave mogą korzystać z StatefulSet.
Przykłady:
Master-Slave -> Datanodes (slave) w klastrze Hadoop
Master-Master -> Węzły bazy danych (master-master) w klastrze Cassandra

Każdy Pod (replika / węzeł) w StatefulSet ma unikalną i stabilną tożsamość sieciową. Na przykład w zestawie Cassandra StatefulSet o nazwie „cassandra” i liczbie węzłów replik równej N każdy pod (węzeł) Cassandra ma:

  • Indeks porządkowy dla każdego strąka: 0,1, .., N-1
  • Identyfikator stabilnej sieci: cassandra-0, cassandra-1, .., cassandra-N-1
  • Oddzielny trwały wolumin dla każdego poda w szablonie oświadczenia woluminu, tj. Oddzielny magazyn dla każdego poda (węzła)
  • Pods są tworzone w kolejności od 0 do N-1 i zakończone w kolejności odwrotnej od N-1 do 0

Zobacz: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

Rozlokowanie

Z drugiej strony „wdrażanie” jest odpowiednie dla aplikacji / usług bezstanowych , w których węzły nie wymagają żadnej specjalnej tożsamości. Moduł równoważenia obciążenia może dotrzeć do dowolnego wybranego węzła. Wszystkie węzły są równe. Wdrożenie jest przydatne do tworzenia dowolnej liczby dowolnych węzłów za pomocą konfiguracji (repliki = N).

Anurag
źródło
7

Różnica między StatefulSet a wdrożeniem

StatefulSet jest odpowiednikiem specjalnego wdrożenia. Każdy pod w StatefulSet ma stabilny, unikatowy identyfikator sieci, którego można użyć do wykrywania innych członków klastra. Jeśli nazwa StatefulSet to Kafka, to pierwsza kapsuła nazywa się Kafka-0, druga Kafka-1 i tak dalej; kontrolowana jest sekwencja początku i końca kopii pod kontrolowanej przez StatefulSet. Kiedy n-ty kapsuła jest uruchomiona, pierwsze zasobniki N-1 są już uruchomione i gotowe. Stan dobry; kapsuła w StatefulSet wykorzystuje stabilną, trwałą pojemność, zaimplementowaną przez PV lub PVC. Podczas usuwania poda wolumin pamięci skojarzony z StatefulSet nie jest domyślnie usuwany (ze względu na bezpieczeństwo danych); StatefulSet musi być powiązany z wolumenem PV. Używane do przechowywania danych stanu pod, a także używane w połączeniu z usługami headless, zadeklarowanymi jako należące do tej usługi headless;

Adler.Liu
źródło