diff --git a/nixos/kubeadm/modules/k8s-common.nix b/nixos/kubeadm/modules/k8s-common.nix index 1d157a0..e44c66b 100644 --- a/nixos/kubeadm/modules/k8s-common.nix +++ b/nixos/kubeadm/modules/k8s-common.nix @@ -195,15 +195,47 @@ in env -i PATH=/run/current-system/sw/bin:/usr/bin:/bin kubeadm init \ --config /tmp/kubeadm/init-config.yaml \ --upload-certs \ - --ignore-preflight-errors=NumCPU,HTTPProxyCIDR,Port-10250 || { - echo "==> kubeadm init failed, checking pod status:" + --ignore-preflight-errors=NumCPU,HTTPProxyCIDR,Port-10250 \ + --skip-phases=wait-control-plane || { + echo "==> kubeadm init phases failed, checking pod status:" crictl pods || true crictl ps -a || true + echo "==> Checking if VIP is bound:" + ip -4 addr show | grep "$vip" || echo "VIP NOT BOUND" + echo "==> kube-vip logs:" + crictl logs $(crictl ps --name kube-vip -q 2>/dev/null | head -1) 2>/dev/null || echo "Could not get kube-vip logs" echo "==> kubelet logs:" journalctl -xeu kubelet --no-pager -n 50 exit 1 } + echo "==> Waiting for kube-vip to claim VIP $vip" + for i in $(seq 1 60); do + if ip -4 addr show | grep -q "$vip"; then + echo "==> VIP $vip is bound" + break + fi + if [ "$i" -eq 60 ]; then + echo "==> WARNING: VIP not bound after 2 minutes, proceeding anyway" + fi + sleep 2 + done + + echo "==> Waiting for API server to be ready" + for i in $(seq 1 60); do + if curl -sk "https://$vip:6443/healthz" 2>/dev/null | grep -q "ok"; then + echo "==> API server is healthy" + break + fi + if [ "$i" -eq 60 ]; then + echo "==> ERROR: API server not healthy after 2 minutes" + crictl pods || true + crictl ps -a || true + exit 1 + fi + sleep 2 + done + mkdir -p /root/.kube cp /etc/kubernetes/admin.conf /root/.kube/config chmod 600 /root/.kube/config