Kmom06: Container orchestration

By . Latest revision .

Er Microblog har fått många nya användare och ni behöver utöka er infrastruktur för att hantera trycket på servrarna. Ni börjar med att utöka hur ni använder Ansible och startar upp fler servrar och containrar på servrarna. Dock märker ni snabbt att det är krångligt och Ansible är inte gjort för att användas till detta. Istället börjar ni läsa på om container orchestration.

Hur det är att lära sig kubernetes.

Hur det är att lära sig kubernetes.

Vi kommer använda oss utav Kubernetes (K8s) för container orchestration men det är bra att känna till vilka andra verktyg som finns och lite om vad som skiljer dem åt.

Läs What Is Container Orchestration?

PS! Om ni har fått kmom05 rättat, radera alla era resurser på Azure förutom er DNS zone.

Innan ni sätter igång med kursmomentet kolla att ert Microblog repo är synkat med originalet, Syncing a fork.

PS! Om ni har fått kmom05 rättat, radera alla era resurser på Azure förutom er DNS zone.

#Kubernetes

Börja med en snabb introduktion till Kubernetes begrepp.

Kubernetes in 5 mins.

Om det inte var pedagogiskt nog förklaring av Kubernetes kan jag rekommendera följande video där de lär ut Kubernetes som en barnbok.

The Illustrated Children’s Guide to Kubernetes.

Kubernetes har själva väldigt mycket och bra material för att lära sig Kubernetes och alla dess delar. En bra utgångspunkt är deras dokumentation, där finns länkar till det mesta.

  • Jobba igenom modul 1-6 i Learn Kubernetes basics. För att få en bättre förståelse för grunderna i K8s (Kubernetes) och hur man kan interagera med det.

#Kubernetes yaml

Det finns två sätt att hantera objekt (pods, deployments, etc…) i K8s, imperative och declarative. I imperative kör vi kommandon i terminalen för att jobba mot ett K8s kluster, som ni gjorde i Kubernetes basics, och i declarative skriver vi konfiguration i filer och kör mot klustret.

Läs om deras olika för och nackdelar.

Vi vill givetvis jobba declarative för att då kan vi spara konfigurationen i Git och vi behöver inte oroa oss för snowflake servrar eller att bara en person har kunskapen om klustret.

digitalocean förklarar [imperativ vs declarative](https://www.digitalocean.com/community/tutorials/imperative-vs-declarative-kubernetes-management-a-digitalocean-comic)

digitalocean förklarar imperativ vs declarative

K8s använder yaml filer för att skriva konfigurationen i filer, som Ansible. För en överblick av hur filerna struktureras och vad de kan innehålla. Ska ni läsa en guide men ni behöver inte jobba med i guiden, det räcker om ni läser och förstår.

Läs igenom Kubernetes deployment tutorial

Gör följande Katakoda för att öva på k8s. Deploy containers using Yaml.

#Stateless applications

K8s bygger på virtualisering och containrar, vilket i grunden är stateless. Vi har inte tillgång till persistent data, när vi stänger ner en container så försvinner dess data. K8s och även Docker är i grunden byggt för att köra stateless applikationer, men när populariteten av verktygen har ökat har även användningsområden ökat och de har då lagt till olika lösningar för att få till persistent data (stateful). Men det är inte lika lätt att få till persistent data i K8s som det är i Docker.

Läs Stateful vs Stateless Applications on Kubernetes för en bättre genomgång av skillnaden.

Ni ska börja med att öva på att skapa en stateless applikation och som tur är har K8s själva en bra guide för det. För guiden behöver ni ha tillgång till ett k8s kluster. I guiden finns det länkar till sandbox miljöer både i “Katacoda” och “Play with Kubernetes” som ni kan använda. Jag rekommenderar Katacoda då jag inte fick Play with K8s att fungera. Katacoda har dessutom Nano installerat så ni kan skriva konfigurationen till filer. Allt borde fungera utan problem fram tills steget Viewing the Frontend Service via NodePort, Katacoda använder inte minikube för att starta sitt kluster så då kan ni inte använda det för att få en extern ip till ert kluster. Istället kan ni i Katacoda klicka på + som finns uppe på er terminal och välja select port to view on host 1. Då öppnas en ny tab i webbläsaren med koppling till klustret och där skriver ni in NodePort för er frontend service.

Jobba igenom Deploying PHP Guestbook application with Redis.

#Stateful applications

Nu när ni har testat på att köra en stateless applikation i K8s ska ni lära er hur man kan köra en stateful applikation. Börja med att läsa The sad state of stateful Pods in Kubernetes för en förklaring av problemet med stateful applikationer.

Kolla på följande videos om volymer i Kubernetes.

Kubernetes Volumes 1: emptydir, NFS, YAML, volumes, and intro to Persistent Volume Claims

Kubernetes Volumes 2: Understanding Persistent Volume (PV) and Persistent Volume Claim (PVC)

Jobba igenom Persistent volumes på Katacoda.

#Designa för Kubernetes

Ni har nu titta lite på hur en applikations design/arkitektur påverkar hur lätt det är att köra den i K8s. Det finns så klart flera saker som är bra att tänka på när man skapa sin applikation men även hur man sätter upp den i K8s.

Läs Architecting Applications for Kubernetes som tar upp lite om hur man ska tänka runt applikationen men även hur man använder K8s.

Läs Modernizing Applications for Kubernetes som handlar mer om hur man kan skriva om en applikation för att den ska fungera bättre för K8s.

#Kubernetes i Azure

Det finns en uppsjö av olika sätt och verktyg för att köra Kubernetes beroende på vilken miljö man vill köra det i. Man kan installera det lokalt, köpa in sig på redan uppsatta k8s miljöer eller tjänster som sätter upp k8s miljön åt oss. Vi ska använda sista alternativet, Azure’s AKS tjänst.

Ni ska nu jobba igenom en artikel som går igenom hur vi sätter upp ett kluster i AKS, installerar en demo och fixar HTTPS till den.

Jobba igenom Sätt upp ett Kubernetes kluster i AKS med HTTPS.

#Microblog i Kubernetes

Nu ska ni sätta upp Microbloggen i Kubernetes. Skapa ett nytt kluster i AKS med samma inställningar som ni gjorde sist, i videon. Arbetet är uppdelat i tre sektioner nedanför. Spara alla filer i kubernetes/ mappen.

#Mysql i Kubernetes

Jobba igenom Mysql i Kubernetes för att sätta upp en Mysql server i ert kluster. Den förutsätter att ni har skapat klustret och kopplat kubectl till det.

Ni behöver inte köra någon SQL kod då Migrations i Flask sköter det när vi startar Microblogen.

#Microblog deployment

Nästa steg är att skapa en deployment för Microblogen. Ni borde ha lärt er tillräckligt för att skapa en service, deployment och ingress för Microblogen. Er microblog deployment ska ha 2 replicas, så att det alltid finns två pods rullande som kan hantera trafik. Ni ska komma åt er Microblog med ert domännamn och använda HTTPS.

Kolla i er docker-compose.yml för vilka env variabler ni behöver för att starta containern. Ni kan använda mysql istället för en IP till database i env variabeln DATABASE_URL. OBS! starta inte containern med ett specifikt network i er deployment, vi låter K8s hantera nätverk.

För att felsöka kan ni använda följande kommandon.

kubectl get po

kubectl describe po

kubectl describe deployment microblog

kubectl logs <pod-name>

kubectl describe ingress

Ett tips är att lägga till en livenessProbe, på containern i er Deployment. Det används av K8s för att kolla om containern är redo att användas. K8s kommer pinga / och kolla vad den får tillbaka för status kod, alla mellan 200 och 399 så tolkas det som att containern mår bra och kan användas.

       ...
       livenessProbe:
          httpGet:
            path: /
            port: 5000
        ...

När ni kan se er microblog via webbläsaren med ett domännamn är ni klara.

#Automatisk skalning av er deployment

När ni har fått upp microblogen och kopplat på er domän ska ni testa att automatiskt skala er Microblog deployment, med hjälp av Horizontal Pod Autoscaler.

Läs om fyra olika sätt att skapa k8s, Azure Auto Scaling- Why and How ?

Jobba sen med i följande video för att testa på att skala er deployment.

Autoscale ett kubernetes kluster med HPA.

När ni har gjort det kan ni radera ert AKS kluster i Azure, ni behöver bara lämna in filerna för rättning.

#Kubernetes i produktion

Vårt kluster är väldigt simpelt, det är mer ett utvecklings kluster än något man hade kört i produktion. För att få en inblick i vad som krävs för att lyckas med Kubernetes i produktion ska ni läsa följande artiklar:

Kolla på “Running Kubernetes in Production: A Million Ways to Crash Your Cluster” där Henning Jacobs från websidan Zalando.se pratar om hur de använder Kubernetes och vad de lärt sig av att köra det i produktions miljön.

Running Kubernetes in Production: A Million Ways to Crash Your Cluster

#Video

Det finns generellt kursmaterial i video form.

  1. Kursen innehåller föreläsningar som spelas in och därefter läggs i spellistan “devops streams ht21”.

  2. I “kursen devops” hittar du alla videor som är kopplade till kursmomentet, de börjar på 6xx i namnet.

#Uppgifter

Följande uppgifter skall utföras och resultatet skall redovisas via me-sidan.

  1. Sätt upp Microbloggen i Kubernetes på AKS, skapa alla objekten deklarativt och spara filerna i kubernetes mappen.

  2. Radera ert AKS kluster.

  3. Försäkra dig om att du har pushat repot med din senaste kod och taggat din inlämning med version v6.0.0.

#Resultat & Redovisning

Läs instruktionen om hur du skall redovisa.

Se till att följande frågor besvaras i texten:

  1. Vad är ert första intryck av Kubernetes? Skulle ni vilja använda det i framtiden?

  2. Vad är Container orchestration?

  3. Varför är det svårare med stateful applikation jämfört med stateless i k8s?

  4. Vad ska vi tänka på när vi designar ett projekt som ska köras i K8s?

  5. Vad är viktigt att tänka på när man ska köra K8s i produktion?

  6. Hur känns det efter att ni använt K8s, var det lika svårt som alla skriver/säger att det är?

#Revision history

  • 2021-12-03: (C, aar) Bytt Minikube till AKS.
  • 2020-12-04: (B, aar) Bytt AWS till Minikube.
  • 2019-10-15: (A, aar) Första versionen.

Document source.