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):
| Rola | CPU | RAM | Dysk | System |
|---|---|---|---|---|
| control-plane (master) | 2 vCPU | 2 GB | 20 GB | Ubuntu 22.04 |
| worker-node-1 | 2 vCPU | 2 GB | 20 GB | Ubuntu 22.04 |
Każda maszyna musi mieć unikalną nazwę hosta i stały adres IP. W tym przykładzie:
master— 192.168.1.10worker-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.