Minikube — Kubernetes klaster na sopstvenom računaru
Sve dosadašnje Kubernetes lekcije opisuju objekte i komande — ali bez klastera na kom se to isprobava, ostaje teorija. Minikube pravi klaster na tvom računaru za nekoliko minuta, besplatno i bez cloud naloga.
Šta ti treba
- 2 procesorska jezgra, 2 GB slobodne memorije, 20 GB diska
- Docker, ili neki hipervizor (KVM, VirtualBox)
- kubectl
Ovo su najniži zahtevi. Realno, sa 4 GB dodeljene memorije rad je osetno prijatniji.
Minikube, kind ili k3s
| Alat | Kakav je | Kada |
|---|---|---|
| Minikube | pun klaster, mnogo dodataka, dashboard | učenje i razvoj |
| kind | klaster u Docker kontejnerima, vrlo brz | automatsko testiranje, CI |
| k3s | lagan ali pravi Kubernetes | mali produkcijski serveri, IoT |
Za učenje uzmi Minikube — ima najviše ugrađenih dodataka i najbolje poruke o greškama. Kad ti zatreba da klaster nastane i nestane za deset sekundi u nekom skriptu, pređi na kind. A k3s je jedini od ova tri koji se zaista koristi u produkciji.
Instalacija
Docker
Ako ga još nemaš, prođi lekciju
Instalacija Dockera na
Linuxu. Dodaj svog korisnika u grupu docker:
$ sudo usermod -aG docker $USER $ newgrp docker $ docker ps
Minikube se ne pokreće kao root. Ako pokušaš, odbiće te.
kubectl
$ curl -LO "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" $ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl $ kubectl version --client
Minikube
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 $ sudo install minikube-linux-amd64 /usr/local/bin/minikube $ rm minikube-linux-amd64 $ minikube version
Pokretanje
$ minikube start
Prvi put traje nekoliko minuta — preuzima se osnovni image. Kad završi:
$ kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready control-plane 45s v1.30.0
Minikube je sam podesio ~/.kube/config, pa kubectl odmah
radi.
Korisne opcije
$ minikube start --cpus=4 --memory=8192 $ minikube start --kubernetes-version=v1.29.5 $ minikube start --driver=docker $ minikube start --nodes=3
Podrazumevani klaster ima jedan čvor koji je istovremeno i control plane
i worker. Sa --nodes=3 dobijaš više čvorova, što je zgodno kad
učiš raspoređivanje Podova — ali troši osetno više memorije.
Drajveri
Drajver određuje gde klaster živi:
$ minikube start --driver=docker # u kontejneru, najbrže $ minikube start --driver=kvm2 # virtuelna mašina, bolja izolacija $ minikube start --driver=none # direktno na hostu, samo Linux
Za učenje je docker sasvim dobar izbor i podrazumevani je na
većini sistema.
Osnovne komande
$ minikube status $ minikube stop # zaustavi, podaci ostaju $ minikube start # nastavi gde si stao $ minikube delete # obriši klaster $ minikube delete --all # obriši sve profile $ minikube ssh # uđi u čvor $ minikube ip $ minikube dashboard # veb interfejs
minikube stop ti štedi baterju i memoriju između sesija —
klaster se sledeći put digne za dvadesetak sekundi umesto par minuta.
Profili
$ minikube start -p test-1-29 --kubernetes-version=v1.29.5 $ minikube profile list $ minikube profile test-1-29
Svaki profil je zaseban klaster. Korisno kad hoćeš da uporediš ponašanje na dve verzije Kubernetesa.
Addons
Minikube ima gotove dodatke koji se uključuju jednom komandom:
$ minikube addons list $ minikube addons enable ingress $ minikube addons enable metrics-server $ minikube addons enable dashboard
Bez metrics-server ne radi kubectl top, a bez
ingress ne možeš isprobati
Ingress. Uključi
oba odmah.
Prva aplikacija
$ kubectl create deployment web --image=nginx:1.25 $ kubectl expose deployment web --port=80 --type=NodePort $ kubectl get pods
Pristup:
$ minikube service web
Otvara pregledač na pravoj adresi. Ako ti treba samo URL:
$ minikube service web --url http://192.168.49.2:31294
Zašto NodePort ne radi kako očekuješ
Sa docker drajverom klaster je u kontejneru sa sopstvenom
mrežom, pa minikube ip nije dostupan sa svih mesta. Zato
postoji minikube service — pravi tunel do servisa.
Isti posao radi i port-forward, koji je prenosiv na svaki
klaster:
$ kubectl port-forward svc/web 8080:80 $ curl localhost:8080
LoadBalancer
Tip Service-a
LoadBalancer lokalno ostaje zauvek u stanju
Pending, jer nema cloud provajdera da dodeli adresu. Rešenje:
$ minikube tunnel
Komanda traži sudo i mora ostati pokrenuta u zasebnom
terminalu. Dok radi, servisi tog tipa dobijaju stvarnu adresu.
Sopstveni image u klasteru
Ovo je najčešća prepreka. Sagradiš image sa docker build, ali ga klaster ne vidi:
Failed to pull image "moja-app:1.0": not found
Razlog je što Minikube ima svoje skladište image-a, odvojeno od tvog Dockera. Dva rešenja.
Učitavanje postojećeg image-a
$ docker build -t moja-app:1.0 . $ minikube image load moja-app:1.0 $ minikube image ls | grep moja-app
Gradnja direktno u Minikube
$ eval $(minikube docker-env) $ docker build -t moja-app:1.0 .
Posle eval tvoj docker radi nad Minikube
demonom, pa je image odmah dostupan. Važi samo u tom terminalu; poništava se
sa:
$ eval $(minikube docker-env -u)
U oba slučaja obavezno postavi:
imagePullPolicy: IfNotPresent
Bez toga Kubernetes pokušava da povuče image iz registryja i pada, iako
ga lokalno ima. Za oznaku latest to je čak podrazumevano
ponašanje — još jedan razlog da je ne koristiš.
Ingress
$ minikube addons enable ingress $ kubectl get pods -n ingress-nginx
Manifest:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
ingressClassName: nginx
rules:
- host: web.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
$ kubectl apply -f ingress.yaml $ kubectl get ingress
Da bi ime domena radilo, dodaj ga u /etc/hosts:
$ echo "$(minikube ip) web.local" | sudo tee -a /etc/hosts $ curl http://web.local
Trajno skladište
Minikube ima ugrađen storage provisioner, pa PVC radi bez podešavanja:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: podaci
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
$ kubectl apply -f pvc.yaml $ kubectl get pvc
Podaci preživljavaju minikube stop, ali ne i
minikube delete.
Deljenje direktorijuma sa hosta:
$ minikube mount ~/projekat:/data
Kad zapne
Klaster ne startuje
$ minikube delete $ minikube start --alsologtostderr
Prvo proveri da Docker uopšte radi i da tvoj korisnik ima pristup:
$ docker ps
Podovi u Pending stanju
$ kubectl describe pod POD
Skoro uvek nema dovoljno resursa. Podigni ih:
$ minikube stop $ minikube start --cpus=4 --memory=8192
Nema mesta na disku
$ minikube ssh -- df -h $ minikube ssh -- docker system prune -a
kubectl gleda pogrešan klaster
$ kubectl config current-context $ kubectl config use-context minikube
Sve zajedno — vežba za kraj
Ovo spaja poslednjih nekoliko lekcija u jednu celinu.
1. Napravi Python ili statičku aplikaciju i za nju Dockerfile:
$ docker build -t moja-app:1.0 . $ minikube image load moja-app:1.0
2. Napiši deployment.yaml sa dve replike,
imagePullPolicy: IfNotPresent i
ConfigMap-om za
podešavanja.
3. Dodaj Service i Ingress na app.local.
4. Primeni sve i proveri:
$ kubectl apply -f k8s/ $ kubectl get all $ curl http://app.local
5. Sagradi verziju 1.1, učitaj je i ažuriraj:
$ kubectl set image deployment/moja-app app=moja-app:1.1 $ kubectl rollout status deployment/moja-app
6. Vrati prethodnu verziju:
$ kubectl rollout undo deployment/moja-app
7. Namerno slomi nešto — pogrešno ime image-a ili nepostojeći ConfigMap — pa pronađi uzrok samo pomoću describe i logs.
Kad ovo prođeš od početka do kraja, prošao si ceo put od koda do aplikacije koja radi u Kubernetesu.
Šta dalje
Minikube je odlična učionica, ali nije produkcija. Kad savladaš ovo, sledeći koraci su Helm za pakovanje manifesta, k3s za pravi mali klaster na serveru, i pravi klaster kod nekog provajdera.
Vredi znati i da je razlika između Minikube-a i produkcijskog klastera
uglavnom u okruženju — kubectl komande, manifesti i način rada
su isti. Ono što ovde naučiš prenosi se u celosti.
Povezano: kubectl · Dockerfile i docker build · Šta je Pod · Šta je Ingress · DevOps
Comments
Post a Comment