Jak nasadit aplikace v Kubernetes

Kubernetes je vysoce populární platforma pro automatizaci, která umožňuje snadné nasazování, škálování a správu kontejnerizovaných aplikací v rámci clusteru, složeného z hostitelů nebo uzlů.

Tento článek se zaměřuje na klíčový prvek v Kubernetes – nasazení (Deployment). Prozkoumáme jeho principy, způsob vytváření, aktualizace a odstraňování.

Co je to Deployment?

Deployment je objekt Kubernetes používaný k řízení spouštění podů. Pro bezstavové aplikace je doporučováno využívat právě Deployment. Bez něj by bylo nutné ručně vytvářet, modifikovat a odstraňovat jednotlivé pody, což by bylo velmi obtížné a neefektivní, zejména při větším počtu podů.

Deployment definujeme v souboru YAML, kde nejen specifikujeme vytváření podů, ale také zajišťujeme jejich nepřetržitý provoz a aktuálnost. Deployment umožňuje jednoduché automatické škálování aplikací. Slouží tedy k škálování, nasazování a vracení se k předchozím verzím aplikací běžících v podech.

Deployment udává Kubernetes, kolik instancí podu má běžet a Kubernetes se postará o ostatní. Při vytváření deploymentu, přidružený kontroler vygeneruje ReplicaSet z konfigurace deploymentu. Následně kontroler spojený s ReplicaSet vytváří pody dle konfigurace ReplicaSet.

Výhody použití deploymentu namísto přímého vytváření ReplicaSet:

  • Historizace objektu: Jakákoli modifikace objektu (pomocí „apply“ nebo „edit“) vytvoří zálohu předchozí verze.
  • Správa aktualizací a vracení: Díky historizaci se můžete snadno vrátit k předchozí konfiguraci.

Vytvoření Deploymentu

Můžeme použít dva způsoby pro vytvoření deploymentu v Kubernetes:

Imperativní přístup

Kubernetes API umožňuje přímý a okamžitý přístup, bez nutnosti vytvářet konfigurační soubory nebo manifesty v YAML. V tomto přístupu pouze specifikujeme, co chceme udělat, a Kubernetes se postará o definici potřebných kroků pro dosažení cíle.

Pro použití imperativního přístupu použijte následující příkaz:

kubectl create deployment nginx-deployment --image nginx --port=80

Deklarativní přístup

V tomto přístupu musíte deklarovat vše. Kubernetes pak pouze čte vaše definice a vytváří objekty přesně dle deklarace.

Pro deklarativní vytvoření deploymentu je nutné vytvořit soubor YAML.

YAML soubor pro deployment s názvem `new_deployment.yaml`:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  #Určuje počet kopií podu
  replicas: 3
  #Vybere pod, který má být spravován nasazením
  selector:
    #Odpovídá definovaným štítkům
    matchLabels:
      deploy: example
  template:
    metadata:
      #Určuje štítky na podu.
        labels:
          deploy: example
    spec:
      containers:
        - name: nginx
          image: nginx:1.20.2

V tomto YAML souboru, po definici verze Kubernetes API, typu vytvářeného objektu a názvu deploymentu následuje sekce `spec`. V této sekci nejprve definujete `replicas`, která udává počet instancí podů, které má deployment udržovat aktivní.

Pomocí štítku `selector` identifikujete pody v deploymentu. Štítek `deploy` říká, že všechny pody, které odpovídají tomuto štítku, patří do tohoto deploymentu.

Dále je zde objekt `template`, kde se nachází definice podu. Když deployment vytváří pody, použije tuto šablonu. Specifikace běžného podu je uvedena pod klíčem `template`.

S tímto deploymentem budou pody s Nginx obrazy a definovanými štítky nasazeny. Je třeba dát pozor na to, že pod je jednotkou škálovatelnosti v Kubernetes, a zvážit, jaký vzor chcete použít, pokud do stejného podu umístíte několik kontejnerů.

Pro aplikaci YAML souboru `new_deployment.yaml` použijte následující příkaz:

kubectl apply -f new_deployment.yaml

Po několika sekundách můžete zjistit stav deploymentu pomocí:

kubectl get all

Zjištění a aktualizace Deploymentu

Můžete vidět, že jsou vytvořeny pody, deployment a také ReplicaSet. Deployment vždy generuje a spravuje ReplicaSet. Pro detailní popis deploymentu můžete použít:

kubectl describe deployment nginx-deployment

Získáte tak detailní popis deploymentu. Je zdůrazněna strategie použitá pro vytváření nebo aktualizaci podů, kde je nastavena RollingUpdate.

Strategie RollingUpdate umožňuje plynulou migraci mezi verzemi aplikace. Je to výchozí strategie v Kubernetes.

Kromě této existují také další strategie:

  • Recreate: Ukončí všechny běžící instance podu a vytvoří je znovu s novou verzí.
  • Blue/Green: Vytvoří dvě samostatná, ale identická prostředí. V modrém prostředí běží stávající aplikace, zatímco v zeleném prostředí je připravena nová verze.
  • Canary: Postupné uvolňování nové verze aplikace, kdy je nová verze nejdříve dostupná pro malou skupinu uživatelů.

Při použití strategie „rolling-update“ můžete detailně konfigurovat její chování s ohledem na počet požadovaných replik.

  • `maxSurge`: Umožňuje definovat (procentuálně nebo absolutní hodnotou), kolik podů může být vytvořeno navíc oproti aktuálnímu počtu replik.
  • `maxUnavailable`: Umožňuje určit (procentuálně nebo absolutní hodnotou), kolik podů může být „nedostupných“ během aktualizace, s ohledem na celkový počet replik.

Dle požadavků vaší aplikace a automatického škálování, tyto konfigurace umožní zajistit kvalitu služeb (QoS) nebo urychlit nasazení.

Dále změňte počet replik na 10 a obraz Nginx na nejnovější verzi.

kubectl scale deployment nginx-deployment --replicas=10

Můžete vidět, že se vytváří 5 kontejnerů a z 10 podů je 5 k dispozici.

Po několika sekundách použijte následující příkaz:

kubectl get all

Nyní vidíte, že všechny pody byly vytvořeny a kontejnery běží.

Odstranění Deploymentu

Pro odstranění deploymentu v Kubernetes můžete použít následující příkazy:

kubectl delete deploy nginx-deployment 
kubectl delete deploy new_deployment.yaml

Helm: Zjednodušení nasazení

Pokud chcete nasadit složitější aplikaci, která zahrnuje desítky nebo stovky zdrojů v Kubernetes, `kubectl` se stává nepraktickým. Proto byl vyvinut nástroj Helm. Helm je správce balíčků pro Kubernetes, který staví na `kubectl` a zjednodušuje proces nasazování aplikací.

V terminologii Helmu se aplikace nazývá *vydání* (release). Je spojená s *grafem* (chart), což je sada konfiguračních souborů ve formátu YAML, obsahující globální proměnné a šablony popisující zdroje Kubernetes.

Závěr

Deployment je fundamentální objekt v Kubernetes. Protože velká moc přináší velkou zodpovědnost, je potřeba být opatrný při jeho konfiguraci, abyste se vyhnuli nežádoucímu chování. Další informace o konfiguracích deploymentu naleznete v oficiální dokumentaci Kubernetes.

Můžete také prozkoumat některé z nejlepších tutoriálů pro Kubernetes, abyste se naučili základy a stali se odborníky v této oblasti.