Załóżmy, że jako inżynier oprogramowania lub DevOps, chcesz postawić klaster kubernetes i na nim wystawić testową aplikację hello-world, ot tak w 2 minuty, aby zobaczyć, jak k8s działa na Twojej lokalnej maszynce.
Oto kroki do tego celu, czyli poszczególne komendy w terminalu Linux, które stawiają klaster, przy pomocy narzędzia kind i wystawiają port z endpointem testowym HTTP.
Instalacja narzędzia kind na Linux z terminala
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.31.0/kind-$(uname)-amd64
Poniższe komendy w Linux pozwalają postawić klaster Kubernetes oraz wystawić endpoint HTTP na lokalnym hoście (gospodarza)
kind create cluster
kubectl cluster-info --context kind-kind
kubectl get nodes -o wide
kubectl get pods -A
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/kind/deploy.yaml
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx
sleep 20
kubectl create deployment echo --image=hashicorp/http-echo --port=5678
kubectl expose deployment echo --port=80 --target-port=5678
kubectl describe pod -n ingress-nginx ingress-nginx-controller-78dcdd7454-q5kxl
kubectl label node kind-control-plane ingress-ready=true
kubectl get pods -n ingress-nginx
sleep 20
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo
spec:
ingressClassName: nginx
rules:
- host: echo.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: echo
port:
number: 80
EOF
kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8080:80
Sprawdzenie, jaki proces dockerowy uruchomił klaster kuberneter
docker ps -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
ee8418c4d7e2 kindest/node:v1.27.3 "/usr/local/bin/entr…" 7 minutes ago Up 6 minutes 127.0.0.1:38279->6443/tcp kind-control-plane 5.99MB (virtual 938MB)
Jak wyglądają zasoby klastera kubernetes postawionego powyżej narzędziem kind w Linux
~$ kubectl get all -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default pod/echo-bb7f5b9b7-l4mgj 1/1 Running 0 14m
ingress-nginx pod/ingress-nginx-admission-create-4gg7t 0/1 Completed 1 19m
ingress-nginx pod/ingress-nginx-admission-patch-nljhw 0/1 Completed 2 19m
ingress-nginx pod/ingress-nginx-controller-78dcdd7454-2tkp7 1/1 Running 0 19m
kube-system pod/coredns-5d78c9869d-5gmbv 1/1 Running 0 19m
kube-system pod/coredns-5d78c9869d-p9n9v 1/1 Running 0 19m
kube-system pod/etcd-kind-control-plane 1/1 Running 0 19m
kube-system pod/kindnet-zfvjq 1/1 Running 0 19m
kube-system pod/kube-apiserver-kind-control-plane 1/1 Running 0 19m
kube-system pod/kube-controller-manager-kind-control-plane 1/1 Running 0 19m
kube-system pod/kube-proxy-glzch 1/1 Running 0 19m
kube-system pod/kube-scheduler-kind-control-plane 1/1 Running 0 19m
local-path-storage pod/local-path-provisioner-6bc4bddd6b-zv5m2 1/1 Running 1 (18m ago) 19m
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/echo ClusterIP 10.96.1.233 <none> 80/TCP 14m
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19m
ingress-nginx service/ingress-nginx-controller NodePort 10.96.111.230 <none> 80:30950/TCP,443:32474/TCP 19m
ingress-nginx service/ingress-nginx-controller-admission ClusterIP 10.96.135.35 <none> 443/TCP 19m
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 19m
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system daemonset.apps/kindnet 1 1 1 1 1 kubernetes.io/os=linux 19m
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 19m
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
default deployment.apps/echo 1/1 1 1 14m
ingress-nginx deployment.apps/ingress-nginx-controller 1/1 1 1 19m
kube-system deployment.apps/coredns 2/2 2 2 19m
local-path-storage deployment.apps/local-path-provisioner 1/1 1 1 19m
NAMESPACE NAME DESIRED CURRENT READY AGE
default replicaset.apps/echo-bb7f5b9b7 1 1 1 14m
ingress-nginx replicaset.apps/ingress-nginx-controller-78dcdd7454 1 1 1 19m
kube-system replicaset.apps/coredns-5d78c9869d 2 2 2 19m
local-path-storage replicaset.apps/local-path-provisioner-6bc4bddd6b 1 1 1 19m
NAMESPACE NAME COMPLETIONS DURATION AGE
ingress-nginx job.batch/ingress-nginx-admission-create 1/1 45s 19m
ingress-nginx job.batch/ingress-nginx-admission-patch 1/1 61s 19m
Usunięcie klastra wymaga wydania w terminalu Linuxa komendy kind
kind delete cluster
A TERAZ OPISZMY CO SIĘ ZDARZYŁO – KROK PO KROKU
Lokalny klaster Kubernetes z kind + NGINX Ingress Controller (od zera do działającego Ingress)
W tym wpisie pokazujemy, jak w kilka minut uruchomić lokalny klaster Kubernetes przy użyciu kind (Kubernetes IN Docker) oraz jak dołożyć do niego NGINX Ingress Controller, a następnie wystawić prostą aplikację HTTP przez Ingress.
To idealne środowisko do nauki Kubernetes bez potrzeby VPS-a czy chmury.
1. Tworzenie klastra kind
Pierwszy krok to uruchomienie lokalnego klastra Kubernetes w Dockerze:
kind create cluster
Po chwili mamy działający klaster oparty o pojedynczy node w kontenerze.
2. Weryfikacja klastra
Sprawdzamy, czy wszystko działa poprawnie:
kubectl cluster-info --context kind-kind
Następnie sprawdzamy node’y:
kubectl get nodes -o wide
oraz wszystkie podstawowe komponenty:
kubectl get pods -A
W tym momencie widzimy m.in.:
- CoreDNS
- kube-proxy
- control plane
- local-path-storage
3. Instalacja NGINX Ingress Controller
Aby móc korzystać z Ingressów, instalujemy kontroler:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/kind/deploy.yaml
Po instalacji monitorujemy rollout:
kubectl get pods -n ingress-nginx -w
oraz sprawdzamy usługę:
kubectl get svc -n ingress-nginx
4. Prosta aplikacja testowa
Tworzymy deployment prostego serwera HTTP:
kubectl create deployment echo --image=hashicorp/http-echo --port=5678
i wystawiamy go jako Service:
kubectl expose deployment echo --port=80 --target-port=5678
5. Debug instalacji (ważny krok w kind)
Jeśli pod Ingress Controller nie startuje poprawnie, sprawdzamy jego status:
kubectl describe pod -n ingress-nginx ingress-nginx-controller-<id>
Częsty problem w kind to brak odpowiedniego labela na node.
Można go naprawić ręcznie:
kubectl label node kind-control-plane ingress-ready=true
Dzięki temu scheduler pozwala uruchomić Ingress Controller.
6. Sprawdzenie działania Ingress Controller
Po poprawce ponownie obserwujemy pody:
kubectl get pods -n ingress-nginx -w
Gdy wszystko działa, controller powinien mieć status Running.
7. Tworzenie Ingress
Teraz definiujemy regułę routingu HTTP:
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo
spec:
ingressClassName: nginx
rules:
- host: echo.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: echo
port:
number: 80
EOF
8. Dostęp do aplikacji (port-forward)
Ponieważ kind nie daje publicznego IP, używamy port-forward:
kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8080:80
9. Test działania
Teraz możemy przetestować Ingress:
curl -H "Host: echo.local" http://localhost:8080
Jeśli wszystko działa poprawnie, otrzymamy odpowiedź z http-echo.
10. Czyszczenie środowiska
Po zakończeniu pracy usuwamy klaster:
kind delete cluster
Podsumowanie
W tym tutorialu:
- uruchomiliśmy lokalny klaster Kubernetes (kind)
- zainstalowaliśmy NGINX Ingress Controller
- wdrożyliśmy prostą aplikację HTTP
- skonfigurowaliśmy routing przez Ingress
- przetestowaliśmy wszystko lokalnie