Tworzenie klastra kubernetes narzędziem kind – k8s w 2 minuty na Linux

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

About the author

Autor "BIELI" to zapalony entuzjasta otwartego oprogramowania, który dzieli się swoją pasją na blogu poznajlinuxa.pl. Jego wpisy są skarbnicą wiedzy na temat Linuxa, programowania oraz najnowszych trendów w świecie technologii. Autor "BIELI" wierzy w siłę społeczności Open Source i zawsze stara się inspirować swoich czytelników do eksplorowania i eksperymentowania z kodem.