Introduksjon til Kubernetes Deployments
Kubernetes har etablert seg som en av de mest fremtredende plattformene for automatisering av distribusjon, skalering og styring av applikasjonscontainere i en klynge av servere eller noder.
Denne artikkelen går nærmere inn på et sentralt element i Kubernetes, nemlig «deployment» (distribusjon). Målet er å gi en forståelse av hvordan disse fungerer, og hvordan man kan opprette, oppdatere og fjerne dem.
Hva er egentlig en distribusjon?
En distribusjon er en mekanisme for å initiere «Pods», som er den minste enheten i Kubernetes. Det anbefales sterkt å bruke distribusjoner for statsløse applikasjoner. Uten distribusjoner ville det være nødvendig å manuelt håndtere oppretting, oppdatering og fjerning av individuelle Pods, noe som er en tungvint prosess, særlig ved håndtering av mange Pods.
Gjennom en distribusjon kan man i en enkel YAML-fil spesifisere ikke bare opprettelsen av Pods, men også sikre at de er oppdaterte og i drift. Distribusjoner gjør det også enkelt å skalere applikasjoner automatisk. En distribusjon er altså sentral for skalering, distribusjon og tilbakerulling av applikasjonsversjoner i Pods.
En distribusjon forteller Kubernetes hvor mange kopier av en Pod som skal kjøre. Kubernetes håndterer så resten. Når man oppretter en distribusjon, vil den tilknyttede kontrolleren lage et «ReplicaSet» basert på konfigurasjonen. Kontrolleren knyttet til ReplicaSet genererer så Pods fra denne konfigurasjonen.
Det finnes flere fordeler ved å benytte seg av distribusjoner fremfor å opprette et ReplicaSet direkte:
- Objekthistorikk: Hver endring som gjøres i objektet (ved bruk av «apply» eller «edit») lagrer en kopi av den foregående versjonen.
- Utrulling og tilbakeføring: Man kan enkelt gå tilbake til en tidligere konfigurasjon, takket være historikken.
Hvordan opprette en distribusjon?
Det finnes to hovedmetoder for å opprette en Kubernetes-distribusjon:
Imperativ metode
Kubernetes API gir en direkte, imperativ tilnærming som ikke krever konfigurasjonsfiler eller YAML-formaterte manifester. I denne metoden angir man bare ønsket resultat, og Kubernetes definerer automatisk hva som er nødvendig for å oppnå dette.
For å bruke den imperative metoden, benyttes følgende kommando:
kubectl create deployment nginx-deployment --image nginx --port=80
Deklarativ metode
I denne metoden må man deklarere alle detaljene. Når koden benyttes, leser Kubernetes definisjonene og oppretter det nøyaktig slik det er spesifisert.
For å benytte en deklarativ distribusjon, må man først opprette en YAML-fil.
Eksempel på en YAML-fil for distribusjon, kalt new_deployment.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: # Angir antall Pod-kopier replicas: 3 # Velger Pods som skal administreres av distribusjonen selector: # Samsvarer med de definerte etikettene matchLabels: deploy: example template: metadata: # Spesifiserer etikettene på Pods. labels: deploy: example spec: containers: - name: nginx image: nginx:1.20.2
I denne YAML-filen, etter å ha definert Kubernetes API-versjonen, objekttypen og navnet på distribusjonen, følger spesifikasjonsdelen. Her definerer man først replika-nøkkelen, som angir antall Pod-instanser som distribusjonen skal holde aktiv.
Man bruker en velgeretikett for å identifisere Pods innenfor distribusjonen. Her kan man benytte distribusjonsetiketten, som signaliserer at alle Pods som samsvarer med disse etikettene, er gruppert i distribusjonen.
Deretter følger malobjektet, som inneholder en Pod-modell i distribusjonsspesifikasjonen. Når distribusjonen oppretter Pods, benyttes denne malen. Spesifikasjonen for en vanlig pod finnes under malnøkkelen.
Denne distribusjonen vil distribuere Nginx-bilder med angitte etiketter til Pods. Det er også viktig å merke seg at Pod er skalerbarhetsenheten i Kubernetes, så man må tenke nøye gjennom hvordan man organiserer flere containere i samme Pod.
For å bruke den opprettede new_deployment.yaml-filen, benyttes følgende kommando:
kubectl apply -f new_deployment.yaml
Etter kort tid kan man sjekke statusen på distribusjonen ved hjelp av:
kubectl get all
Hente og oppdatere distribusjon
Man kan nå se at det er opprettet Pods, en distribusjon og et ReplicaSet. En distribusjon oppretter og administrerer alltid et ReplicaSet. For å beskrive distribusjonen nærmere, benyttes følgende kommando:
kubectl describe deployment nginx-deployment
Dette gir en detaljert beskrivelse av distribusjonen, inkludert strategien for oppretting/rekonstruksjon av pods ved en oppdatering, som er satt til RollingUpdate.
RollingUpdate-strategien sikrer en smidig overgang fra en applikasjonsversjon til en nyere. Dette er standardstrategien i Kubernetes.
I tillegg til denne strategien finnes også:
- Gjenopprett: Avslutter eksisterende Pod-instanser og gjenskaper dem med den nye versjonen.
- Blå/grønn: Oppretter to separate, men identiske miljøer. I det blå miljøet kjører nåværende applikasjon, mens det grønne miljøet kjører applikasjonen slik den vil se ut i fremtiden.
- Canary: En distribusjonsstrategi hvor en liten gruppe brukere er involvert i den gradvise utrullingen av en ny applikasjon eller tjeneste.
Ved bruk av «rullende oppdatering», kan man konfigurere antall replikaer.
- maxSurge tillater å angi (i prosent eller som et absolutt tall) hvor mange Pods som kan opprettes i tillegg til det konfigurerte antall replikaer.
- maxUnavailable lar en indikere (i prosent eller absolutt) hvor mange Pods som kan være utilgjengelige under oppdateringen, avhengig av antall konfigurerte replikaer.
Disse innstillingene kan optimalisere QoS eller akselerere distribusjonene, avhengig av applikasjonen og autoskaleringen.
For å skalere Pods til 10 og endre Nginx-bildekoden til den nyeste, kan man benytte følgende kommando:
kubectl scale deployment nginx-deployment --replicas=10
Her ser man at fem containere er under opprettelse, og at det er fem av ti Pods som er tilgjengelige.
Etter kort tid kan man benytte følgende kommando:
kubectl get all
Her ser man at alle Pods er opprettet og containerne kjører.
Slette en distribusjon
For å fjerne en Kubernetes-distribusjon, kan følgende kommandoer benyttes:
kubectl delete deploy nginx-deployment kubectl delete deploy new_deployment.yaml
Helm: Forenkler implementeringer
Når man skal distribuere komplekse applikasjoner som består av et stort antall Kubernetes-ressurser, blir kubectl-verktøyet lite hensiktsmessig. Derfor ble Helm utviklet. Helm er en pakkehåndterer for Kubernetes som bygger på kubectl og forenkler applikasjonsdistribusjoner.
I Helm-terminologi kalles en applikasjon en «release». Dette er knyttet til et «chart», som er en samling konfigurasjonsfiler i YAML-format som inneholder globale variabler og maler som beskriver Kubernetes-ressurser.
Konklusjon
Distribuering er en viktig komponent i Kubernetes. Ettersom det innebærer stort ansvar, er det viktig å være nøyaktig i konfigurasjonen for å unngå uventet oppførsel. For mer informasjon om distribusjonskonfigurasjoner, henvises det til Kubernetes-dokumentasjonen.
Man kan også undersøke de mange Kubernetes-opplæringene som er tilgjengelig for å tilegne seg ekspertise fra grunnen av.