Wprowadzenie do Kind


Obecnie Kubernetes jest liderem wśród narzędzi do orkiestracji kontenerów. Zastanawiałeś się kiedyś, jak zapoznać się z jego komponentami, komendami czy innymi powiązanymi rozwiązaniami?

Jeśli potrzebujesz platformy, na której mógłbyś eksperymentować z Kubernetesem, dobrą wiadomością jest to, że masz wiele narzędzi do wyboru. Kubeadm, Kops, Kubespray, Minikube, Rancher Desktop i Killercoda to tylko niektóre z dostępnych opcji. Niemniej jednak każda z nich ma swoje ograniczenia. Niektóre środowiska są tymczasowe, jak w przypadku Killercody, inne pozwalają na utworzenie jedynie pojedynczego węzła sterującego z jedną bazą danych etcd, jak kubeadm, a jeszcze inne oferują tylko jeden klaster z jednym węzłem, jak minikube. Często też musisz płacić za zużywane zasoby.

Co by było, gdyby istniała możliwość stworzenia lokalnego klastra Kubernetes o wysokiej dostępności do celów rozwojowych i testowych? Klaster, który byłby trwały i nie wymagał dodatkowych opłat? Brzmi zachęcająco, prawda? A co, gdyby konfiguracja takiego klastra była prostym zadaniem?

Mówimy tutaj o kind (kubernetes in docker) – narzędziu pozwalającym uruchamiać lokalne klastry Kubernetes w kontenerach Docker. Chociaż głównym celem kind jest testowanie Kubernetesa, jest ono doskonałym rozwiązaniem do lokalnego rozwoju oraz integracji ciągłej (CI).

W tym artykule przyjrzymy się bliżej kind. Poznasz sposób jego użycia do tworzenia klastrów jedno- i wielowęzłowych oraz dowiesz się, jak wdrażać aplikacje w klastrze kind.

Czym jest kind?

Kind to narzędzie, które oferuje wiele unikalnych funkcji ułatwiających uruchamianie lokalnych klastrów Kubernetes. Jest to projekt wspierany przez Kubernetes SIGs i znacząco różni się od powszechnie używanego Minikube. Główną jego cechą jest możliwość tworzenia klastra w kontenerach Docker, co przyspiesza jego uruchamianie w porównaniu z metodami opartymi na maszynach wirtualnych.

Dokumentacja kind jest przystępna i zrozumiała. Więcej informacji znajdziesz tutaj.

Instalacja

Wymagania

  • Docker: Jest niezbędny do działania kind. Jeśli go nie masz, możesz pobrać go stąd.
  • Podman: Alternatywa dla dockera, bardzo ciekawy projekt. Szczegóły znajdziesz tutaj
  • Kubectl (opcjonalnie): kind nie wymaga kubectl, ale bez tego narzędzia nie będziesz mógł wykonać niektórych operacji opisanych w tym poradniku. Kubectl jest dostępny do pobrania stąd.

Instalacja kind

W zależności od systemu operacyjnego proces instalacji może się nieco różnić. Poniżej znajdują się ogólne instrukcje dla najpopularniejszych systemów.

  • MacOS:

    • używając Homebrew:

      brew install kind
      
    • używając MacPorts:

      sudo port selfupdate && sudo port install kind
      
    • plików binarnych:

      # for Intel Macs
      [ $(uname -m) = x86_64 ]&& curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-darwin-amd64
      # for M1 / ARM Macs
      [ $(uname -m) = arm64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-darwin-arm64
      chmod +x ./kind
      mv ./kind /some-dir-in-your-PATH/kind
      
  • Windows:

    • używając Chocolatey:

      choco install kind
      
    • używając pakietów binarnych:

      curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.17.0/kind-windows-amd64
      Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe
      
  • Linux:

    • używając pakietów binarnych:

      curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64
      chmod +x ./kind
      sudo mv ./kind /usr/local/bin/kind
      
    • używając Homebrew:

      brew install kind
      
    • Oczywiście większość dystrybucji Linuksa posiada kind w swoich repozytoriach i można po prostu użyć managara pakietów.

Jak stworzyć klaster

Klaster jednowęzłowy

Aby stworzyć klaster, wystarczy jedno polecenie:

kind create cluster

Kilkadziesiąt sekund później klaster jest gotowy do użycia, co można łatwo sprawdzić używając kubectl:

kubectl cluster-info
kubectl get nodes

Klaster wielowęzłowy

Niewątpliwą zaletą kind jest możliwość uruchamiana wielowęzłowych klastrów. Żeby to osiągnąć wystarczy stworzyć plik konfiguracyjny kind.yaml:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: worker
- role: worker

Teraz wystarczy stworzyć klaster za pomocą polecenia:

kind create cluster --config kind.yaml

Chwilę później możemy cieszyć się klastrem z czterema węzłami (dwa zarządcze i dwa robocze).

Konfiguracja klastra

Domyślnie konfiguracja dostępu do klastra znajduje się w pliku ~/.kube/config o ile zmienna $KUBECONFIG nie jest ustawiona.

Zmiana obrazu węzła

kind pozwala również na bardzo łatwą zmianę obrazu użytego do uruchomienia klastra. Pozwala to na łatwe żonglowanie wersjami Kubernetesa, co nie zawsze jest możliwe w rozwiązaniach chmurowych. Lista wspieranych wersji znajduje się tutaj.

kind create cluster --image kindest/node:v1.21.14@sha256:8a4e9bb3f415d2bb81629ce33ef9c76ba514c14d707f9797a01e3216376ba093

Powyższe polecenie uruchomi nam klaster k8s w wersji 1.21.14. Spróbuj to zrobić dzisiaj w Azure :)

Dynamic Volume Provisioning

Dynamic Volume Provisioning w Kubernetes to mechanizm pozwalający na tworzenie wolumenów pamięci masowej na żądanie.

Domyślnie Kind ma już wstępnie skonfigurowaną, gotową do użycia klasę pamięci, która jest dostępna w momencie tworzenia klastra.

Żeby wyświetlić dostępne klasy wystarczy wydać polecenie:

kubectl get sc

Stwórzmy zatem PVC używają poniższego kodu:

# local path provisioner only supports readwriteonce
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi

Zakładając, że nazwa pliku to pvc.yaml:

kubectl create -f pvc.yaml

Potrzebny będzie jeszcze jeden plik yaml dla poda busybox:

apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  volumes:
  - name: host-volume
    persistentVolumeClaim:
      claimName: pvc
  containers:
  - image: busybox
    name: busybox
    command: ["/bin/sh"]
    args: ["-c", "sleep 600"]
    volumeMounts:
    - name: host-volume
      mountPath: /data

Poniższa komenda utworzy poda w klastrze:

kubectl apply -f busybox.yaml

Żeby potwierdzić, że wszystko działa jak należy użyjemy następujących poleceń:

kubectl get pv,pvc
kubectl get pod

Mamy teraz wielowęzłowy klaster z zamontowanym wolumenem w podzie.

Po wdrożeniu usługi na Kubernetesie trzeba ją jeszcze udostępnić. Dostęp do klastra można uzyskać na trzy sposoby: ingress, loadbalancer lub node port.

Wdrażanie aplikacji

Najprostszym i najszybszym sposobem na wdrożenie aplikacji jest użycie kubectl. Jako przykład posłuży Nginx. Bardzo podstawowy deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.3
        ports:
        - containerPort: 80

Wystarczy zapisać ten plik jako deployment.yaml i użyć poniższej komendy:

kubectl apply -f deployment.yaml

Zostanie utworzony deployment z trzema replikami serwera Nginx.

Żeby połączyć się z serwerem www potrzebny jest serwis, który udostępnu usługę. Poniżej znajduje się przykładowa definicja serwisu:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: ClusterIP

Zapisujemy plik pod nazwą service.yaml i uruchamiamy polecenie:

kubectl apply -f service.yaml

Jeśli wszystko poszło zgodnie z planem wystarczy jeszcze przekierować port:

kubectl port-forward svc/nginx-service 9090:80

I sprawdzić w przeglądarce czy wszystko działa. Stona powinna być dostępna pod tym adresem.

Eksportowanie logów klastra

Kind posiada możliwośc wyeksportowania wszystkich logów. Jest to szczególnie ważne w przypadku użycia klastra w porcesach CI/CD.

Żeby wyeksportować logi wystarczy jedna komenda:

kind export logs

Podsumowanie

Po lekturze tego artykułu dowiesz się jak zainstalować kind, stworzyć klaster i wdrożyć aplikację. Jest to oczywiście wierzchołek góry lodowej i temat ten będę rozwijał w kolejnych artykułach. Kind jest bardzo użytecznym narzędziem nie tylko do testowania Kubernetesa samego w sobie, ale też różnych konfiguracji ale i szerokiej gamy narzędzi i aplikacji.