Czy łatwo i wygodnie konfigurować klaster Kubernetes? Zapowiadamy addon-operator

Czy łatwo i wygodnie konfigurować klaster Kubernetes? Zapowiadamy addon-operator

Po shell-operator przedstawiamy jego starszego brata — addon-operator. To projekt Open Source, który jest używany do instalacji w klastrze Kubernetes komponentów systemowych, które można nazwać wspólnym słowem — dodatki.

Po co w ogóle jakieś dodatki?

Nie jest tajemnicą, że Kubernetes to nie gotowy produkt all-in-one, a do zbudowania „dojrzałego” klastra potrzebne będą różne dodatki. Addon-operator pomoże w instalacji, konfiguracji i utrzymaniu tych dodatków w aktualnym stanie.

Konieczność dodatkowych komponentów w klastrze została przedstawiona w raporcie koledzy driusha. Krótko mówiąc, sytuacja z Kubernetes na chwilę obecną jest taka, że do prostego zainstalowania „do zabawy” można obejść się komponentami z pudełka, dla deweloperów i testowania można dodać Ingress, ale do pełnoprawnej instalacji, o której można powiedzieć „twój produkcyjny klaster jest gotowy”, trzeba dodać około dziesięciu różnych dodatków: coś do monitorowania, coś do logów, nie zapomnieć o ingress i cert-manager, wyznaczyć grupy węzłów, dodać polityki sieciowe, przyprawić ustawieniami sysctl i pod autoscaler’em…

Czy łatwo i wygodnie konfigurować klaster Kubernetes? Zapowiadamy addon-operator

Na czym polega specyfika pracy z nimi?

Jak pokazuje praktyka, sama instalacja to nie wszystko. Aby komfortowo pracować z klastrem, dodatki należy aktualizować, wyłączać (usuwać z klastra), a coś może chcieć się przetestować przed zainstalowaniem w klastrze produkcyjnym.

Więc może Ansible wystarczy? Możliwe. Ale pełnoprawne dodatki w ogólnym przypadku nie działają bez konfiguracji. Te ustawienia mogą się różnić w zależności od opcji klastra (aws, gce, azure, bare-metal, do, …). Niektóre ustawienia nie mogą być określone z góry — trzeba je pobrać z klastra. A klaster nie jest statyczny: w przypadku niektórych ustawień trzeba będzie śledzić zmiany. I tu już Ansible nie wystarczy: potrzebny jest program, który żyje w klastrze, tzn. Kubernetes Operator.

Ci, którzy wypróbowali to w praktyce shell-operator, powiedzą, że zadania instalacji i aktualizacji dodatków oraz śledzenia konfiguracji można rozwiązać za pomocą hooków dla shell-operator. Można napisać skrypt, który będzie robił warunkowy kubectl apply i śledzić, na przykład, ConfigMap, w którym będą przechowywane ustawienia. Praktycznie to właśnie zostało zrealizowane w addon-operator.

Jak to zorganizowano w addon-operator?

Tworząc nowe rozwiązanie, kierowaliśmy się następującymi zasadami:

  • Instalator dodatków musi wspierać szablonowanie i deklaratywną konfigurację. Nie tworzymy magicznych skryptów instalujących rozszerzenia. Addon-operator używa Helma do instalacji rozszerzeń. Aby zainstalować, należy stworzyć chart i wyodrębnić wartości, które będą użyte do konfiguracji.
  • Ustawienia można generować podczas instalacji, można je uzyskać z klastra, albo otrzymywać aktualizacje, śledząc zasoby klastra. Te operacje można zrealizować za pomocą hooków.
  • Ustawienia można przechowywać w klastrze. Aby przechowywać ustawienia w klastrze, tworzy się ConfigMap/addon-operator, a Addon-operator monitoruje zmiany tego ConfigMap. Addon-operator daje hookom dostęp do ustawień za pomocą prostych konwencji.
  • Rozszerzenie zależy od ustawień. Jeśli ustawienia się zmienią, to Addon-operator wdraża chart Helma z nowymi wartościami. Połączenie charta Helma, jego wartości i hooków nazwaliśmy modułem (szczegóły poniżej).
  • Staging. Nie ma magicznych skryptów wydania. Mechanizm aktualizacji jest podobny do standardowej aplikacji — zbieramy rozszerzenia i addon-operator w obraz, tagujemy i wdrażamy.
  • Kontrola wyniku. Addon-operator potrafi udostępniać metryki dla Prometheusa.

Czym jest rozszerzenie w addon-operator?

Rozszerzeniem można nazwać wszystko, co dodaje do klastra nowe funkcje. Na przykład, instalacja Ingress to doskonały przykład rozszerzenia. Może to być dowolny operator lub kontroler ze swoim CRD: prometheus-operator, cert-manager, kube-controller-manager itp. Lub coś małego, co upraszcza eksploatację — na przykład secret copier, który kopiuje tajne dane rejestru do nowych przestrzeni nazw, lub sysctl tuner, który konfiguruje parametry sysctl na nowych węzłach.

Aby zrealizować rozszerzenia, Addon-operator oferuje kilka koncepcji:

  • Helm chart jest używany do instalacji różnego oprogramowania w klastrze — na przykład Prometheusa, Grafany, nginx-ingress. Jeśli dany komponent ma chart Helma, instalacja go za pomocą Addon-operatora będzie bardzo prosta.
  • Przechowalnia wartości. Charty Helma zazwyczaj mają wiele różnych ustawień, które mogą się zmieniać z czasem. Addon-operator wspiera przechowywanie tych ustawień i potrafi monitorować ich zmiany, aby ponownie zainstalować chart Helma z nowymi wartościami.
  • Hooki — to pliki wykonywalne, które Addon-operator uruchamia na zdarzenia i które mają dostęp do przechowalni values. Hak może monitorować zmiany w klastrze i aktualizować wartości w przechowalni values. Tzn. za pomocą haków można przeprowadzić discovery, aby zbierać wartości z klastra podczas uruchamiania lub według harmonogramu, a także można przeprowadzić continuous discovery, zbierając wartości z klastra według zmian w klastrze.
  • Moduł — to połączenie wykresu Helm, przechowalni values i haków. Moduły można włączać i wyłączać. Wyłączenie modułu polega na usunięciu wszystkich wydań wykresu Helm. Moduły mogą dynamicznie włączać same siebie, na przykład jeśli włączone są wszystkie potrzebne im moduły lub jeśli discovery w hakach znalazło odpowiednie parametry — robi się to z pomocą pomocniczego skryptu enabled.
  • Globalne haki. To haki „same w sobie”, nie są dołączone do modułów i mają dostęp do globalnej przechowalni values, wartości z której są dostępne wszystkim hakom w modułach.

Jak te części współpracują? Zobaczmy obrazek z dokumentacji:

Czy łatwo i wygodnie konfigurować klaster Kubernetes? Zapowiadamy addon-operator

Scenariuszy pracy są dwa:

  1. Globalny hak uruchamiany jest na zdarzenie — na przykład, gdy zasób w klastrze ulega zmianie. Ten hak przetwarza zmiany i zapisuje nowe wartości w globalnej przechowalni values. Addon-operator dostrzega, że globalna przechowalnia się zmieniła i uruchamia wszystkie moduły. Każdy moduł za pomocą swoich haków określa, czy powinien się włączyć, i aktualizuje swoją przechowalnię values. Jeśli moduł jest włączony, to Addon-operator uruchamia instalację wykresu Helm. Wykresowi Helm są wówczas dostępne wartości z przechowalni modułu i z globalnej przechowalni.
  2. Drugi scenariusz jest prostszy: modułowy hak uruchamiany jest na zdarzenie, zmienia wartości w przechowalni values modułu. Addon-operator to dostrzega i uruchamia wykres Helm z zaktualizowanymi wartościami.

Dodatek może być zrealizowany jako pojedynczy hak lub jako jeden wykres Helm, lub nawet jako kilka zależnych modułów — to zależy od złożoności komponentu instalowanego w klastrze i od wymaganego poziomu elastyczności ustawień. Na przykład, w repozytorium (/examples) znajduje się dodatek sysctl-tuner, który został zrealizowany zarówno jako prosty moduł z hakiem i wykresem Helm, jak i z wykorzystaniem przechowalni values, co daje możliwość dodawania ustawień przez edytowanie ConfigMap.

Dostawa aktualizacji

Kilka słów na temat organizacji aktualizacji komponentów, które instaluje Addon-operator.

Aby uruchomić Addon-operator w klastrze, należy stworzyć obraz z dodatkami w postaci plików hooków i Helm-chartów, dodać plik binarny addon-operator i wszystko, co będzie potrzebne do hooków: bash, kubectl, jq, python itd. Następnie ten obraz można wdrożyć w klastrze jak zwykłą aplikację i prawdopodobnie będziecie chcieli zorganizować jakąś wersję tagowania. Jeśli klastrów jest niewiele, podejście takie jak w przypadku aplikacji może być wystarczające: nowa wersja, nowa edycja, przejść przez wszystkie klastry i zmienić obraz dla Podów. Jednak w przypadku wdrożenia na znaczną liczbę klastrów, bardziej odpowiednia jest koncepcja samodzielnej aktualizacji z kanału.

U nas wygląda to tak:

  • Kanał to w zasadzie identyfikator, który można definiować dowolnie (np. dev/stage/ea/stable).
  • Nazwa kanału to tag obrazu. Kiedy trzeba wdrożyć aktualizacje w kanale, tworzony jest nowy obraz i tagowany jest nazwą kanału.
  • Kiedy w rejestrze pojawia się nowy obraz, Addon-operator jest restartowany i uruchamiany z nowym obrazem.

To nie jest najlepsza praktyka, o czym pisano w dokumentacji Kubernetes. Tak nie powinno się robić, ale mówimy o zwykłej aplikacji, która żyje w jednym klastrze. W przypadku Addon-operatora aplikacja to wiele wdrożeń rozproszonych po klastrach, a samodzielna aktualizacja bardzo pomaga i ułatwia życie.

Kanały pomagają także w testowaniu: jeśli istnieje pomocniczy klaster, można skonfigurować go na kanał stage i wdrożyć w nim aktualizacje przed wprowadzeniem ich w kanałach ea i stable. Jeśli z klastrem na kanale ea pojawił się błąd, można go przełączyć na stable, podczas gdy trwa dochodzenie w sprawie problemu z tym klastrem. Jeśli klaster zostanie wyłączony z aktywnego wsparcia, przełącza się na swój „zamrożony” kanał — na przykład, freeze-2019-03-20.

Oprócz aktualizacji hooków i Helm-chartów, może być konieczne zaktualizowanie także komponentu zewnętrznego. Na przykład, zauważyliście błąd w warunkowym node-exporter i wymyśliliście, jak go poprawić. Następnie otworzyliście PR i czekacie na nową wersję, aby przejść przez wszystkie klastry i zwiększyć wersję obrazu. Aby nie czekać nieokreślony czas, można zbudować własny node-exporter i przełączyć się na niego do czasu zaakceptowania PR.

Ogólnie rzecz biorąc, można to zrobić również bez Addon-operator, ale z Addon-operator moduł do instalacji node-exporter będzie widoczny w jednym repozytorium, a Dockerfile do budowy własnego obrazu można trzymać od razu tam, wszystkim uczestnikom procesu łatwiej jest zrozumieć, co się dzieje... A jeśli jest kilka klastrów, staje się to prostsze zarówno w testowaniu swojego PR, jak i w wdrażaniu nowej wersji!

Ta organizacja aktualizacji komponentów działa u nas pomyślnie, ale można wdrożyć dowolny inny odpowiedni schemat — w końcu w tym przypadku Addon-operator jest prostym plikiem binarnym.

Podsumowanie

Zasady wdrażane w Addon-operatorze pozwalają na zbudowanie przejrzystego procesu tworzenia, testowania, instalacji i aktualizacji dodatków w klastrze, analogicznego do procesów rozwoju zwykłych aplikacji.

Dodatki dla Addon-operatora w formacie modułów (Helm-chart + hooki) można udostępniać szeroko. My, firma Flant, planujemy w ciągu lata udostępnić nasze osiągnięcia w formie takich dodatków. Dołącz do rozwoju na GitHubie (shell-operator, addon-operator), spróbuj stworzyć swój dodatek na podstawie przykładów i dokumentacji, czekaj na wiadomości na Habra i na naszym kanale YouTube!

P.S.

Przeczytaj także na naszym blogu:

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster