Wiele środowisk (staging, QA, produkcja itp.) Z Kubernetes

121

Co jest uważane za dobrą praktykę w K8S do zarządzania wieloma środowiskami (QA, Staging, Production, Dev, itp.)?

Jako przykład załóżmy, że zespół pracuje nad produktem, który wymaga wdrożenia kilku interfejsów API wraz z aplikacją front-end. Zwykle będzie to wymagało co najmniej 2 środowisk:

  • Staging: do iteracji / testów i walidacji przed wydaniem klientowi
  • Produkcja: to środowisko, do którego klient ma dostęp. Powinien zawierać stabilne i dobrze przetestowane funkcje.

Zakładając, że zespół korzysta z Kubernetes, jaka byłaby dobra praktyka w zakresie hostowania tych środowisk? Do tej pory rozważaliśmy dwie opcje:

  1. Użyj klastra K8s dla każdego środowiska
  2. Używaj tylko jednego klastra K8 i przechowuj je w różnych przestrzeniach nazw.

(1) Wydaje się najbezpieczniejszą opcją, ponieważ minimalizuje ryzyko potencjalnych błędów ludzkich i awarii maszyn, które mogłyby zagrozić środowisku produkcyjnemu. Jednak wiąże się to z kosztem większej liczby maszyn głównych, a także kosztem lepszego zarządzania infrastrukturą.

(2) Wygląda na to, że upraszcza zarządzanie infrastrukturą i wdrażaniem, ponieważ istnieje jeden klaster, ale rodzi kilka pytań, takich jak:

  • W jaki sposób można się upewnić, że błąd człowieka może wpłynąć na środowisko produkcyjne?
  • W jaki sposób można się upewnić, że duże obciążenie środowiska przejściowego nie spowoduje utraty wydajności w środowisku produkcyjnym?

Mogą istnieć inne obawy, więc kontaktuję się ze społecznością K8s na StackOverflow, aby lepiej zrozumieć, jak ludzie radzą sobie z tego rodzaju wyzwaniami.

Yoanis Gil
źródło
2
Jak w końcu to zrobiłeś? Proszę, daj nam znać ... Ja też się uczę i staram się wypracować najlepszy sposób. Wygląda na to, że zakładanie oddzielnych klastrów jest prawdopodobnie właściwą drogą ...
Piotr Kula
3
Skończyło się na tym, że mieliśmy dwa klastry, jeden do etapów, a drugi do produkcji. Istnieje dodatkowe zarządzanie z punktu widzenia infrastruktury, ale w naszym przypadku poziom izolacji był tego wart.
Yoanis Gil
1
@YoanisGil Czy jest tutaj odpowiedź, którą możesz oznaczyć jako zaakceptowaną?
tdensmore
3
@tdensmore większość odpowiedzi jest dobra na swój sposób. Rzecz w tym, że nie ma jednej odpowiedzi i zależy to od danego przypadku użycia. Myślę, że K8s i jego społeczność bardzo dojrzeli, odkąd pierwszy raz zadałem to pytanie (prawie 3 lata teraz) i wydaje się, że istnieje przynajmniej kilka minimalnych najlepszych praktyk, które można zastosować, niezależnie od tego, ile klastrów jest używanych iw jakim celu ( Myślę o przestrzeniach nazw, zasadach sieciowych, selektorach węzłów, seccomp itp.).
Yoanis Gil

Odpowiedzi:

33

Rozważania dotyczące wielu klastrów

Spójrz na ten post na blogu autorstwa Vadima Eisenberga ( IBM / Istio ): Lista kontrolna: zalety i wady korzystania z wielu klastrów Kubernetes oraz sposób dystrybucji obciążeń między nimi .

Chciałbym podkreślić niektóre zalety / wady:

Powody posiadania wielu klastrów

  • Rozdzielenie produkcji / rozwoju / testów: szczególnie do testowania nowej wersji Kubernetes, siatki usług, innego oprogramowania klastra
  • Zgodność: zgodnie z niektórymi przepisami niektóre aplikacje muszą działać w oddzielnych klastrach / oddzielnych sieciach VPN
  • Lepsza izolacja dla bezpieczeństwa
  • Chmura / lokalnie: aby podzielić obciążenie między usługi lokalne

Powody posiadania jednego klastra

  • Zmniejsz koszty konfiguracji, konserwacji i administracji
  • Popraw wykorzystanie
  • Redukcja kosztów

Biorąc pod uwagę niezbyt drogie środowisko, z przeciętną konserwacją, a jednocześnie zapewniające izolację bezpieczeństwa dla aplikacji produkcyjnych, polecam:

  • 1 klaster dla DEV i STAGING (oddzielony przestrzeniami nazw, może nawet izolowany, przy użyciu zasad sieciowych, jak w Calico )
  • 1 klaster dla PROD

Parzystość środowiska

Jest to dobry zarażenia się wirusem HIV , aby utrzymać rozwój, inscenizację i produkcję jak najbardziej podobne:

Różnice między usługami wspierającymi oznaczają, że pojawiają się drobne niezgodności, powodując, że kod, który działał i przeszedł testy w fazie rozwoju lub przemieszczania, kończy się niepowodzeniem w produkcji. Tego typu błędy powodują tarcia, które zniechęcają do ciągłego wdrażania.

Połącz potężne narzędzie CI / CD ze sterem . Możesz użyć elastyczności wartości helm, aby ustawić domyślne konfiguracje, po prostu zastępując konfiguracje, które różnią się w zależności od środowiska.

GitLab CI / CD z AutoDevops ma potężną integrację z Kubernetes, która umożliwia zarządzanie wieloma klastrami Kubernetes już z obsługą Helm.

Zarządzanie wieloma klastrami ( kubectlinterakcje)

Podczas pracy z wieloma klastrami Kubernetes łatwo jest zepsuć konteksty i uruchomić kubectlw niewłaściwym klastrze. Poza tym Kubernetes ma ograniczenia dotyczące niezgodności wersji między klientem ( kubectl) a serwerem (wzorcem kubernetes), więc uruchamianie poleceń w odpowiednim kontekście nie oznacza uruchamiania odpowiedniej wersji klienta.

Aby temu zaradzić:

  • Służy asdfdo zarządzania wieloma kubectlwersjami
  • UstawKUBECONFIG zmienną env na zmianę między wieloma kubeconfigplikami
  • Służy kube-ps1do śledzenia bieżącego kontekstu / przestrzeni nazw
  • Użyj kubectxi,kubens aby szybko zmieniać klastry / przestrzenie nazw
  • Użyj aliasów, aby połączyć je wszystkie razem

Mam artykuł, który ilustruje, jak to osiągnąć: Używanie różnych wersji kubectl z wieloma klastrami Kubernetes

Polecam również następujące lektury:

Eduardo Baitello
źródło
26

Zdecydowanie używaj oddzielnego klastra do programowania i tworzenia obrazów Dockera, aby klastry przemieszczania / produkcji można było zablokować pod względem bezpieczeństwa. Decyzja o tym, czy użyjesz oddzielnych klastrów staging + production, zależy od ryzyka / kosztu - z pewnością oddzielenie ich pomoże uniknąć stagingwpływu production.

Gorąco polecam również używanie GitOps do promowania wersji aplikacji między środowiskami.

Aby zminimalizować błąd ludzki, zalecam również, abyś zajął się automatyzacją w jak największym stopniu dla CI / CD i promocji.

Tutaj jest demonstracja sposobu automatyzacji ciągłej integracji / ciągłej integracji z wieloma środowiskami na Kubernetes przy użyciu GitOps do promocji między środowiskami i środowiskami podglądu w żądaniach ściągania, która została wykonana na żywo w GKE, chociaż Jenkins X obsługuje większość klastrów kubernetes

James Strachan
źródło
1
link wydaje się być uszkodzony
Tibin
19

To zależy od tego, co chcesz przetestować w każdym ze scenariuszy. Generalnie starałbym się unikać uruchamiania scenariuszy testowych na klastrze produkcyjnym, aby uniknąć niepotrzebnych skutków ubocznych (wpływ na wydajność itp.).

Jeśli zamierzasz testować za pomocą systemu pomostowego, który dokładnie naśladuje system produkcyjny zalecałbym uruchomienie dokładnej repliki całego klastra i zamknięcie go po zakończeniu testów i przeniesieniu wdrożeń do produkcji.

Jeśli Twoim celem jest testowanie systemu pomostowego, który umożliwia testowanie aplikacji wdrożenia, uruchomiłbym na stałe mniejszy klaster przejściowy i zaktualizowałbym wdrożenia (również w wersji skalowanej w dół) zgodnie z wymaganiami ciągłego testowania.

Aby kontrolować różne klastry, wolę mieć oddzielną maszynę ci / cd, która nie jest częścią klastra, ale jest używana do uruchamiania i zamykania klastrów, a także do wykonywania prac wdrożeniowych, inicjowania testów itp. Pozwala to na konfigurację i zamknięcie klastry jako część scenariuszy testów automatycznych.

Oswin Noetzelmann
źródło
3
Nadal jest to kwestia debaty, ale ta dyskusja okazała się pomocna: groups.google.com/forum/#!topic/kubernetes-users/GPaGOGxCDD8
Indradhanush Gupta
1
Głosowałem za wspomnieniem o dwóch typach środowisk przejściowych.
John David
8

Oczywiste jest, że utrzymując klaster produkcyjny z dala od klastra przejściowego, zmniejsza się ryzyko potencjalnych błędów wpływających na usługi produkcyjne. Jednak wiąże się to z większym kosztem zarządzania infrastrukturą / konfiguracją, ponieważ wymaga co najmniej:

  • co najmniej 3 masterów dla klastra produkcyjnego i co najmniej jednego mastera dla pomostu
  • 2 pliki konfiguracyjne Kubectl do dodania do systemu CI / CD

Nie zapominajmy też, że może istnieć więcej niż jedno środowisko. Na przykład pracowałem w firmach, w których są co najmniej 3 środowiska:

  • QA: to miejsce, w którym przeprowadzaliśmy codzienne wdrożenia i gdzie przeprowadzaliśmy naszą wewnętrzną kontrolę jakości przed udostępnieniem klientowi)
  • Kontrola jakości klienta: to miejsce, w którym wdrożyliśmy przed wdrożeniem do produkcji, aby klient mógł zweryfikować środowisko przed wydaniem do produkcji)
  • Produkcja: w przypadku wdrażania usług produkcyjnych.

Myślę, że klastry efemeryczne / na żądanie mają sens, ale tylko w niektórych przypadkach użycia (testowanie obciążenia / wydajności lub bardzo „duża” integracja / testowanie od końca do końca), ale w przypadku bardziej trwałych / lepkich środowisk widzę narzut, który może zostać zmniejszony uruchamiając je w jednym klastrze.

Chyba chciałem dotrzeć do społeczności k8s, aby zobaczyć, jakie wzorce są używane w takich scenariuszach, jak te, które opisałem.

Yoanis Gil
źródło
6

O ile zgodność lub inne wymagania nie nakazują inaczej, preferuję jeden klaster dla wszystkich środowisk. Przy takim podejściu punkty uwagi to:

  • Upewnij się, że grupujesz również węzły według środowiska za pomocą etykiet. Następnie możesz użyć nodeSelectorzasobów on, aby upewnić się, że działają na określonych węzłach. Zmniejszy to szanse (nadmiernego) zużycia zasobów na przenoszenie się między środowiskami.

  • Traktuj przestrzenie nazw jako podsieci i domyślnie zabraniaj całego ruchu wychodzącego / przychodzącego. Zobacz https://kubernetes.io/docs/concepts/services-networking/network-policies/ .

  • Opracuj strategię zarządzania kontami usług. ClusterRoleBindingssugerują coś innego, jeśli klaster obsługuje więcej niż jedno środowisko.

  • Korzystaj z dokładności podczas korzystania z narzędzi takich jak Helm. Niektóre wykresy rażąco instalują konta usług z uprawnieniami obejmującymi cały klaster, ale uprawnienia do kont usług powinny być ograniczone do środowiska, w którym się znajdują.

Cochise Ruhulessin
źródło
Jak można zaplanować niepowodzenie aktualizacji klastra?
Tibin
2

Używanie wielu klastrów jest normą, na samej liście, aby wymusić silny rozdział między produkcją a „nieprodukcją”.

W tym duchu zwróć uwagę, że GitLab 13.2 (lipiec 2020) obejmuje teraz:

Wdrożenie wielu klastrów Kubernetes w Core

Używanie GitLab do wdrażania wielu klastrów Kubernetes z GitLab wymagało wcześniej licencji Premium.
Nasza społeczność przemówiła, a my wysłuchaliśmy: wdrażanie w wielu klastrach jest przydatne nawet dla indywidualnych współpracowników.
Na podstawie Twoich opinii, począwszy od GitLab 13.2, możesz wdrażać w wielu klastrach grup i projektów w Core.

https://about.gitlab.com/images/13_2/MultipleProjectClusters.png

Zobacz dokumentację i wydanie /

VonC
źródło
1

Myślę, że uruchomienie pojedynczego klastra ma sens, ponieważ zmniejsza narzut i monitorowanie. Ale musisz upewnić się, że wprowadziłeś zasady sieciowe i kontrolę dostępu.

Zasady sieciowe - aby uniemożliwić obciążeniu środowiska dev / qa interakcję z prod / staging store.

Kontrola dostępu - którzy mają dostęp do różnych zasobów środowiska przy użyciu ról klastrów, ról itp.

Akash Sharma
źródło