Cluster mit kubeadm aufsetzen, nicht nur konsumieren
Ein gemanagter Cluster versteckt genau die Teile, die du verstehen willst. Für jede spätere Fehlersuche lohnt sich ein Cluster aus drei virtuellen Maschinen, den du selbst installierst.
# Swap aus, das kubelet verweigert sonst den Start
sudo swapoff -a
sudo sed -i.bak '/ swap / s/^/#/' /etc/fstab
# Kernel-Modul und sysctl für das Pod-Netzwerk
sudo modprobe br_netfilter
printf 'net.ipv4.ip_forward = 1\nnet.bridge.bridge-nf-call-iptables = 1\n' \
| sudo tee /etc/sysctl.d/99-kubernetes.conf
sudo sysctl --system
# Container-Runtime, die RHEL-Familie zieht containerd.io aus dem Docker-Repo
sudo apt install -y containerd
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerdSystemdCgroup = true ist der Schritt, den fast jede Anleitung erwähnt und trotzdem fast jeder vergisst. Steht dort false, während systemd den cgroup-Treiber stellt, starten Pods scheinbar zufällig nicht mehr.
# Paketquelle je Minor: https://pkgs.k8s.io/core:/stable:/v1.XX/deb/
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p "$HOME/.kube"
sudo install -o "$(id -u)" -g "$(id -g)" /etc/kubernetes/admin.conf "$HOME/.kube/config"
# CNI-Plugin einspielen, vorher bleibt jeder Node NotReady
kubectl apply -f MANIFEST-DES-GEWAEHLTEN-CNI
kubectl get nodes -o wideSolange kein CNI installiert ist, bleibt der Node NotReady und CoreDNS hängt in Pending. Das ist kein Fehler, sondern der erwartete Zwischenzustand. Zwischen den Knoten müssen 6443/tcp zum API-Server, 10250/tcp zum kubelet sowie 2379 und 2380/tcp für etcd offen sein. Auf der RHEL-Familie steht firewalld dem CNI dabei häufig im Weg.