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

AlatKakav jeKada
Minikubepun klaster, mnogo dodataka, dashboardučenje i razvoj
kindklaster u Docker kontejnerima, vrlo brzautomatsko testiranje, CI
k3slagan ali pravi Kubernetesmali 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

Popular posts from this blog

Konverzija tipova podataka u Pythonu

Početak u Linuxu — šta je i zašto se uči

groupadd