Blog: Narzedzia devops 2

O czym warto pamiętać podczas pracy z K8s?

O czym warto pamiętać podczas pracy z K8s?
  • 612 views

Kubernetes to narzędzie, które z roku na rok zyskuje coraz większą popularność. Rozwiązanie typu open-source, w pełni skalowalne i solidne wsparcie gigantów IT - argumentów na rzecz tego narzędzia jest dużo więcej. Nie można również zapominać o jego gotowych konfiguracjach dla rozwiązań chmurowych (np. Google Kubernetes Engine – GKE). O czym warto pamiętać podczas pracy z Kubernetesem? Oto kilka wskazówek przydatnych na początek:

Udostępnij!

O czym warto pamiętać podczas pracy z K8s?

1. Korzystaj z małych obrazów pod kontenery.

Podpunkt ten dotyczy przede wszystkim Dockera, ma jednak duży wpływ na działanie naszych aplikacji w architekturze Kubernetesa. Korzystając z K8s najczęściej zależy nam na wysokiej dostępności (ang. high availability) oraz bezpieczeństwie oprogramowania. Mniejsze obrazy pod aplikacje (np. alpine zamiast ubuntu) pozwalają na lepsze „dostrojenie” obrazu kontenera do naszych potrzeb – nie będzie on zawierał niepotrzebnych bibliotek, które mogą negatywnie wpłynąć na bezpieczeństwo oraz szybkość wdrażania zmian w aplikacji. Dodatkowo oszczędzamy miejsce na dysku. Różnica nie będzie widoczna od razu, ale wraz z archiwizowaniem kolejnych wersji zaczniemy ją coraz bardziej zauważać.

2. Ustaw limit i wymagane zasoby.

Pomimo tego, że, podobnie jak Docker, Kubernetes w dynamiczny sposób zarządza zasobami dostępnymi na maszynach (w przeciwieństwie do maszyn wirtualnych nie mamy zablokowanych zasobów, nawet kiedy nie są wykorzystane), nadal warto korzystać z limitów. Rozróżniamy dwa rodzaje ograniczeń:

  • Limity ( limits) – maksymalne zasoby, jakie mogą zostać wykorzystane przez pod.
  • Wymagania ( requests) – zasoby, które są niezbędne do uruchomienia naszej aplikacji w podzie.

Sprawne zarządzanie zasobami pozwoli nam uniknąć przerw w działaniu programu. Przykładowo,  aplikacja potrzebuje do uruchomienia 512 MB pamięci. Po ustawieniu parametru requests.memory Kubernetes nie będzie próbował uruchomić poda z naszą aplikacją na dowolnej maszynie, tylko na takiej, która zawiera wymaganą ilość pamięci. Podobnie jest w przypadku parametru limits – jeżeli do naszej aplikacji wkradłby się błąd, który spowoduje zapętlone zapotrzebowanie na pamięć, zajęta zostanie tylko ilość pamięci ustalona w parametrze limits.memory –przykładowe 512 MB. Reszta pamięci maszyny nie zostanie „wchłonięta”.

3. Sekret nie jest domyślnie sekretem.

Sekret to obiekt w Kubernetesie, który służy do przechowywania danych wrażliwych takich jak  tokeny czy hasła. W domyślnej konfiguracji nie posiada on żadnej formy enkrypcji danych. Wykorzystuje kodowanie 64 (ang. base64), które nie zapewnia żadnej ochrony w razie ataku na  infrastrukturę, niezależnie od formy wykorzystywania tego sekretu przez nasze pody. W tym wypadku – o ile korzystamy z Google Cloud Platform –  lepiej sięgnąć po systemy przeznaczone do przechowywania danych wrażliwych jak np. Vault by HashiCorp lub Secret Manager.

4. Korzystaj z RBAC oraz firewall

Ten punkt jest powiązany z poprzednim, wiąże się zatem z bezpieczeństwem naszego klastra. Potencjalny haker będzie próbował wykorzystać wszystkie dostępne sposoby na dostanie się do naszego Kubernetesa. Zgodnie z zasadą, że wszystko w IT jest hakowalne (everything is hackable),  kwestia bezpieczeństwa naszej infrastruktury powinna być priorytetowa. Warto więc korzystać z RBAC (ang. Role-Based Access Controler). RBAC pozwala na tworzenie ról z uprawnieniami do obiektów naszego klastra (np. podów, serwisów czy całych namespace’ów). Dzięki temu ograniczamy dostęp użytkowników do wybranych elementów – przykładowo użytkownik K8s odpowiedzialny za wdrażanie naszej aplikacji powinien mieć uprawnienia jedynie do płaszczyzny (namespace), w której znajduje się program. Nawet w sytuacji dostania się do infrastruktury Kubernetesa poprzez tego użytkownika, intruz nie będzie miał możliwości wyrządzania szkód w innych miejscach klastra.

5.Monitoruj komponenty klastra.

Bardzo popularny błąd popełniany przez wielu młodych adeptów konteneryzacji. Zamiast polegać na natywnych panelach jak Kubernetes Dashboard, warto skonfigurować dodatkowy system monitoringu naszego klastra (np. Prometheus, dla którego Kubernetes może generować metryki w znanym dla tego narzędzia formacie) lub utworzyć odpowiednie grafy i metryki w systemach chmurowych. System tak naprawdę składa się z kilku elementów niezbędnych do kontrolowania i sprawnego funkcjowania całej infrastruktury: API, kubelet, kube-proxy, kube-dns, etcd (dla którego warto również tworzyć dodatkowy backup) czy controller-manager. Dzięki temu możemy na bieżąco obserwować stan naszego klastra (np. zużycie zasobów i aktualne obciążenie) oraz uniknąć potencjalnych awarii w przyszłości.

Podsumowując, Kubernetes to potężne narzędzie do konteneryzacji, które z każdym dniem staje się coraz bardziej popularne. Ilość zmian w stosunku do klasycznych infrastruktur pod aplikacje, jak na przykład wirtualizacja, wymaga od użytkownika ciągłego pogłębiania wiedzy o tym rozwiązaniu oraz „poszukiwania” najlepszych praktyk, odpłacając się przy tym bardzo dobrą skalowalnością oraz oferowanymi możliwościami.