Konrad Kowalski (rootsher)Principal Platform & Reliability Architect100101000100010010010010111101011110100111110010

Control Plane w Kubernetes

data
kategoria
Containers
czytanie
2 min / 499 słów

Control plane to część Kubernetes odpowiedzialna za sterowanie całym klastrem.

Nie jest to jeden program ani jeden serwer. To zestaw współpracujących komponentów, z których każdy ma jasno określoną rolę.

Najważniejsze z nich to:

  • kube-apiserver,
  • etcd,
  • kube-scheduler,
  • kube-controller-manager.

Opcjonalnie, szczególnie w środowiskach chmurowych, pojawia się też cloud-controller-manager.

kube-apiserver: centralny punkt komunikacji

kube-apiserver to jeden z najważniejszych komponentów Kubernetes.

To przez niego przechodzi komunikacja z klastrem.

Gdy wykonujesz:

bash
kubectl get pods

albo:

bash
kubectl apply -f app.yaml

kubectl nie rozmawia bezpośrednio z etcd, schedulerem czy kubeletem.

Rozmawia z API Serverem.

text
kubectl
   |
   v
kube-apiserver

API Server odpowiada m.in. za:

  • przyjęcie żądania,
  • uwierzytelnienie,
  • autoryzację,
  • walidację danych,
  • udostępnienie API Kubernetes,
  • zapis lub odczyt stanu klastra.

To centralny punkt, wokół którego zbudowana jest reszta systemu.

Dlaczego wszystko przechodzi przez API

Kubernetes jest systemem mocno opartym na API.

Scheduler, controllery i kubelety również obserwują stan właśnie przez API Server.

Dzięki temu poszczególne komponenty nie muszą bezpośrednio znać swoich implementacji.

Mają wspólny kontrakt: Kubernetes API.

To upraszcza architekturę i pozwala rozdzielać odpowiedzialności.

etcd: pamięć klastra

etcd jest rozproszonym magazynem typu key-value.

Kubernetes wykorzystuje go do przechowywania swojego stanu.

Można go traktować jako źródło prawdy dla control plane.

W etcd znajdują się informacje o obiektach, konfiguracji i stanie deklarowanym w klastrze.

Ważne jest jednak to, czego etcd nie robi.

etcd:

  • nie uruchamia kontenerów,
  • nie wybiera node,
  • nie zarządza ruchem sieciowym,
  • nie wykonuje logiki kontrolerów.

Jego rolą jest przechowywanie spójnych danych.

Jeśli stracisz etcd bez poprawnego backupu, możesz stracić wiedzę o stanie całego klastra.

Dlatego w self-managed Kubernetes jest to jeden z najbardziej krytycznych elementów do zabezpieczenia.

kube-scheduler: wybór node

Gdy powstaje Pod, może początkowo nie mieć przypisanego node.

Scheduler obserwuje takie Pody i wybiera dla nich odpowiednią maszynę.

Podczas wyboru może brać pod uwagę m.in.:

  • dostępne CPU,
  • pamięć,
  • labels,
  • affinity,
  • anti-affinity,
  • taints,
  • tolerations,
  • ograniczenia topologiczne.

W dużym uproszczeniu:

text
nowy Pod
   |
   v
scheduler
   |
   v
wybór Node

Bardzo ważne:

scheduler nie uruchamia kontenera.

On tylko podejmuje decyzję, na którym node Pod powinien się znaleźć.

Uruchomieniem zajmuje się później kubelet.

kube-controller-manager: pilnowanie rzeczywistości

kube-controller-manager uruchamia wiele kontrolerów.

Ich wspólnym zadaniem jest pilnowanie, aby rzeczywisty stan klastra zgadzał się z deklarowanym.

To klasyczny mechanizm reconciliation loop.

Przykład:

text
desired state: 3
actual state: 2

Kontroler zauważa różnicę i inicjuje działania prowadzące do utworzenia brakującego zasobu.

Potem ponownie sprawdza stan.

I robi to cały czas.

To właśnie kontrolery są jednym z głównych powodów, dla których Kubernetes potrafi reagować na awarie i samoczynnie wracać do oczekiwanego stanu.

cloud-controller-manager

W środowiskach chmurowych może działać również cloud-controller-manager.

Jego zadaniem jest integracja Kubernetes z infrastrukturą konkretnego providera.

Może odpowiadać np. za część operacji związanych z:

  • nodami,
  • load balancerami,
  • informacją o infrastrukturze cloud.

W nowoczesnych środowiskach wiele funkcji związanych np. ze storage jest realizowanych przez osobne interfejsy, takie jak CSI.

Jak komponenty współpracują

Najprostszy obraz wygląda tak:

text
               ┌───────────────────────┐
               │    kube-apiserver     │
               └──────────┬────────────┘
                          │
             ┌────────────┼─────────────┐
             │            │             │
           etcd      scheduler    controller-manager

API Server jest centralnym punktem komunikacji.

etcd przechowuje stan.

Scheduler wybiera node.

Controller manager pilnuje, aby rzeczywistość zgadzała się z deklaracją.

Co zapamiętać

Control plane to nie jeden "mózg", ale zestaw komponentów.

Każdy ma osobną odpowiedzialność:

text
API Server          -> komunikacja
etcd                -> stan
Scheduler           -> wybór node
Controller Manager  -> reconciliation

Razem tworzą warstwę sterującą Kubernetes.