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:
- Użyj klastra K8s dla każdego środowiska
- 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.
źródło
Odpowiedzi:
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:
Biorąc pod uwagę niezbyt drogie środowisko, z przeciętną konserwacją, a jednocześnie zapewniające izolację bezpieczeństwa dla aplikacji produkcyjnych, polecam:
Parzystość środowiska
Jest to dobry zarażenia się wirusem HIV , aby utrzymać rozwój, inscenizację i produkcję jak najbardziej podobne:
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 (
kubectl
interakcje)Aby temu zaradzić:
asdf
do zarządzania wielomakubectl
wersjamiKUBECONFIG
zmienną env na zmianę między wielomakubeconfig
plikamikube-ps1
do śledzenia bieżącego kontekstu / przestrzeni nazwkubectx
i,kubens
aby szybko zmieniać klastry / przestrzenie nazwMam 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:
źródło
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ąćstaging
wpływuproduction
.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
źródło
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.
źródło
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:
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:
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.
źródło
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ć
nodeSelector
zasobó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.
ClusterRoleBindings
sugerują 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ą.
źródło
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:
Zobacz dokumentację i wydanie /
źródło
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.
źródło