kind

Testiranje Kuberntetes deployment-a pomoću KIND-a

Bez obzira da li ste iskusni developer koji postavlja svoju produkcionu aplikaciju na multi-klaster okruženje, ili tek počinjete sa Kubernetes-om, verovatno ćete negde želeti da testirate svoje deployment-e. Ako vaša organizacija ima IT odeljenje, onda je verovatno testno okruženje već postavljeno. Ako to nije slučaj, u ovom tekstu ćemo objasniti kako da pomoću KIND alata testirate Kubernetes deployment-e.

KIND (Kubernetes in Docker) je alat za pokretanje lokalnih Kubernetes klastera korišćenjem Docker kontejner nodova.

Primarno je dizajniran za testiranje Kubernetes deployment-a, ali može biti korišćen i za lokalni razvoj CI-a.

Prvi korak u korišćenju Kubernetes-a u Docker-u

Možete početi da koristite KIND čak i na svom desktop/laptop računaru, pod pretpostavkom da imate instaliran Docker. Biće potrebno da instalirate ili preuzmete KIND na svoj računar i spremni ste da započnete:

MacOS

$ brew install kind

Windows

$ choco install kind

Linux

$ curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
$ chmod +x ./kind
$ mv ./kind /some-dir-in-your-PATH/kind

Sada kada ste instalirali KIND, možete da podesite vaš prvi klaster, izvršavanjem sledećeg koda:

$ kind create cluster

Izlaz će pokazati nešto slično ovome:


✓ Ensuring node image (kindest/node:v1.23.4) ?
✓ Preparing nodes ?
✓ Writing configuration ?
✓ Starting control-plane ?️
✓ Installing CNI ?
✓ Installing StorageClass ?
Set kubectl context to "kind-kind"

You can now use your cluster with:
kubectl cluster-info --context kind-kind

Have a nice day! ?

Komanda iznad će kreirati jedan lokalkni Kubernetes klaster pod nazivom kind. Pokretanje klastera po prvi put može da potraje nekoliko minuta, dok se svi neophodni Docker image-i preuzimanju.

Nakon što je klaster kreiran, KIND će takođe ažurirati vaš lokalni kubeconfig dodavanjem i prebacivanjem na novi kontekst. Imaćete puna admin prava za taj novi klaster. Od ove tačke na dalje, možete da imate interakciju sa lokalnim klasterom kao sa bilo kojim drugim.

$ kubectl get nodes

NAME STATUS ROLES AGE VERSION
kind-control-plane Ready control-plane,master 26m v1.23.4

Važno je napomenuti da niste limitirani samo na jedan klaster. Možete pokrenuti više lokalnih klastera, sve dok imate raspoloživih resursa.

Da biste dobili listu raspoloživih klastera, možete da koristite sledeću komandu:

$ kind delete cluster --name kind

Da uklonite KIND klaster, jednostavno pokrenite:

$ kind delete cluster --name kind

Dodatne opcije za testiranje Kubernetes deployment-a

Podrazumevano KIND će kreirati klaster koji se sastoji od samo jednog control-plane node-a. I dalje možete rasporediti vaše opterećenje na ovaj node.

Često ćete možda pisati Helm chart-ove ili deployment-e koji će imati konfigurisane određene pod affinity-e. Na primer, mogu zahtevati više nodova.

Razmotrite ovaj deployment:

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-cache
spec:
selector:
matchLabels:
app: store
replicas: 3
template:
metadata:
labels:
app: store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- store
topologyKey: "kubernetes.io/hostname"
containers:
- name: redis-server
image: redis:3.2-alpine

Na primeru iznad, trebaće vam najmanje tri node-a da uspešno postavite ovaj deployment.

Sa KIND-om možete da definišete tri worker node klastera kreiranjem cluster-3nodes.yaml fajla koji sadrži:

---
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: kind-3


nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker

Možete zatim da kreirate klaster uvođenjem ovog config fajla kao opcioni argument

$ kind create cluster --config cluster-3nodes.yaml

Ima mnogo više opcija za konfigurisanje između kojih možete birati. Na primer, možete da izložite node portove koji će vam omogućiti da pokrenete ingress kontrolere ili definišete extra host mount-e ka worker nodovima.

Napomena: Čak iako je KIND konfigurabilan, nije bezuslovno zamena za produkcione Kubernetes klastere. Jednom kada kreirate klaster, ne možete lako menjati njegovu konfiguraciju. Ograničenje je samo u dizajnu, jer nakon korišćenja odbacujete KIND klaster.

Praktična primena za testiranje Kubernetes deployments-a

Sada ste spremni da počnete sa testiranjem Kubernetes deployments-a. Kao što smo već pomenuli, privremeni klasteri su dobro mesto za testiranje. Možete ih koristiti da naučite kako da radite sa Kubernetes-om, bez bojazni da ćete pokvariti nešto na produkciji.

Druga primena je korišćenje CI/CD pipeline-ova za izvođenje integracionih testova vaših deployments-a. Na primer, testiranje u vašem Helm chart-u će uspešno rasporediti sve komponente i uraditi sve što je previđeno da se uradi.

Evo primera GitLab CI fajla:

---
stages:
- lint
- cluster-init
- deploy
- verify
- cleanup

variables:
CHART_NAME: sample-chart
RELEASE_NAME: testing

.runner:
tags:
- docker
- kind

helmlint:
extends: .runner
stage: lint
script:
- helm lint ${CHART_NAME}

clusterinit:
extends: .runner
stage: cluster-init
script:
- kind create cluster --name ${CI_COMMIT_SHORT_SHA}

deploychart:
extends: .runner
stage: deploy
script:
- kind export kubeconfig --name ${CI_COMMIT_SHORT_SHA}
- helm upgrade --install ${RELEASE_NAME} ${CHART_NAME} --wait --timeout 300s

verify:
extends: .runner
stage: verify
script:
- kind export kubeconfig --name ${CI_COMMIT_SHORT_SHA}
- kubectl wait --for=condition=available --timeout=300s deployment/${RELEASE_NAME}-${CHART_NAME}
- kubectl get deployment ${RELEASE_NAME}-${CHART_NAME} -n default -o=jsonpath='{.status.replicas}' |grep 1

cleanup:
extends: .runner
stage: cleanup
script:
- kind delete cluster --name ${CI_COMMIT_SHORT_SHA}
when: always

Ovaj pojednostavljeni pipeline radi na shell executor-u sa instaliranim Docker-om, a GitLab runner je dozvolio pristup Docker-u. Najverovatnije ćete želeti da proširite ili modifikujete ovaj pipeline na svoje okruženje. U najmanju ruku, moraćete da promenite fazu verifikacije kako biste odražavali vaše potrebe za testiranjem integracije.

Hajde sada da prođemo kroz ovaj fajl:

stages: u liniji 2 definišemo pipeline faze, a u liniji 9 ćemo definisati neke promenljive, tako da ostatak pipeline-a može biti ponovo iskorišćen.

lint stage: Prvi job helmint radi unutar lint faze i prijaviće svaki problem sa chart sintaksom. Ukoliko imate neke dodatne lintere ili test za koji želite da pokrenete test, možete ih sve dodati u lint fazu, tako da mogu da rade paralelno pre nego dođemo do test integracije.

cluster-lint stage: U liniji 24, clusterinit job će obezbediti naš KIND klaster nazvan po skraćenici ovog commit-a (SHA). Na ovaj način obezbeđujemo da imamo jedan klaster za odbacivanje po pipeline-u, sprečavajući na taj način sve probleme koji bi mogli nastati ako bi više sličnih pipeline-a radilo paralelno.

deploy stage: Nakon što se klaster inicijalizuje, u liniji 30 deploichart job će eksportovati kubeconfig za ovaj specifični klaster, a zatim će instalirati naš uzorak charta kao izdanje za testiranje u našem KIND klasteru. Koristimo flag –wait tako da će sledeća faza pipeline-a čekati da Helm završi. Naš flag –timeout je tu da osigura prekid ako imamo neku pogrešnu konfiguraciju koja uzrokuje beskonačne petlje ili uslove koji se ne mogu ispuniti.

verify stage: U našem verify job-u u liniji 37, izvozimo kubeconfig i radimo dva jednostavna testa. Prvi test će sačekati dok implementacija ne bude u dostupnom stanju. Naravno, ovo je pomalo suvišno sa Helmovim -wait parametrom jer radi istu stvar. Drugi test je da osiguramo da imamo obezbeđenu tačno jednu repliku.

cleanup stage: Na kraju ćemo pokrenuti posao čišćenja da uklonimo ceo klaster. Ovde moramo da obezbedimo da ovaj posao uvek radi jer ne želimo da imamo zaostale klastere na našim runner-ima u slučaju neuspešnog postavljanja ili verifikacije faza.

Zaključak

KIND je odličan alat za testiranje naših Kubernetes deployments-a. Iako ovaj tekst pokriva samo osnove, naša je preporuka da za sve dodatne informacije pročitate dokumentaciju na KIND sajtu. Za sve koji počinju sa Kubernetesom, ovaj alat je odličan izvor za učenje, testiranje i razvoj vaših veština. Za sve napredne korisnike, KIND će biti još jedan od odličnih alata za integracione testove, debagovanje i proveru aplikacija.

Slični postovi:

Bez komentara

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *