← Blog / Kubernetes

Kubernetes od zera: pierwsze kroki z klastrem lokalnym (kubeadm)

Wprowadzenie

Kubernetes to de facto standard orkiestracji kontenerów w środowiskach produkcyjnych. Zanim jednak trafisz na klaster zarządzany w chmurze (AKS, IKS, GKE), warto zrozumieć jak działa od środka — budując własny klaster od zera. W tym artykule postawimy w pełni działający klaster K8s przy użyciu kubeadm na maszynach z Ubuntu 22.04.


Wymagania

Potrzebujesz minimum dwóch maszyn (fizycznych lub wirtualnych):

RolaCPURAMDyskSystem
control-plane (master)2 vCPU2 GB20 GBUbuntu 22.04
worker-node-12 vCPU2 GB20 GBUbuntu 22.04

Każda maszyna musi mieć unikalną nazwę hosta i stały adres IP. W tym przykładzie:

  • master — 192.168.1.10
  • worker-1 — 192.168.1.11

Krok 1 — Przygotowanie wszystkich węzłów

Wykonaj poniższe polecenia na każdym węźle (master i worker).

Wyłącz swap

swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

Załaduj moduły kernela

cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

Parametry sysctl dla Kubernetes

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sysctl --system

Zainstaluj containerd

apt update && apt install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
  tee /etc/apt/sources.list.d/docker.list

apt update && apt install -y containerd.io

containerd config default | tee /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd && systemctl enable containerd

Zainstaluj kubeadm, kubelet, kubectl

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | \
  gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
  https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | \
  tee /etc/apt/sources.list.d/kubernetes.list

apt update && apt install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

Krok 2 — Inicjalizacja węzła master

Wykonaj tylko na węźle master:

kubeadm init \
  --apiserver-advertise-address=192.168.1.10 \
  --pod-network-cidr=10.244.0.0/16 \
  --control-plane-endpoint=192.168.1.10

Skonfiguruj kubectl:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

Krok 3 — Instalacja wtyczki sieciowej (CNI)

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

kubectl get nodes
# NAME     STATUS   ROLES           AGE   VERSION
# master   Ready    control-plane   2m    v1.29.0

Krok 4 — Dołączenie węzłów worker

Wykonaj na każdym węźle worker komendę kubeadm join z outputu inicjalizacji:

kubeadm join 192.168.1.10:6443 --token abc123.xyz \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxx

Jeśli token wygasł, wygeneruj nowy:

kubeadm token create --print-join-command
kubectl get nodes -o wide
# NAME       STATUS   ROLES           AGE   VERSION
# master     Ready    control-plane   5m    v1.29.0   192.168.1.10
# worker-1   Ready    <none>          2m    v1.29.0   192.168.1.11

Krok 5 — Pierwsze wdrożenie aplikacji

kubectl create deployment nginx --image=nginx --replicas=2
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pods -o wide
kubectl get svc nginx

Output:

NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   10.96.145.200   <none>        80:31234/TCP   30s

Aplikacja dostępna pod: http://192.168.1.11:31234


Przydatne komendy na co dzień

kubectl cluster-info
kubectl get nodes -o wide
kubectl get pods --all-namespaces
kubectl describe node worker-1
kubectl logs <nazwa-poda> -f
kubectl exec -it <nazwa-poda> -- /bin/bash
kubectl delete deployment nginx

Podsumowanie

Masz działający klaster Kubernetes z jednym masterem i jednym workerem. To solidna baza do nauki — możesz teraz ćwiczyć wdrożenia, skalowanie, ConfigMapy, Secrety i serwisy. W kolejnym artykule pokażemy jak zainstalować Helm i wdrożyć pierwszą aplikację z użyciem chartów.