Debian 上 Kubernetes 安装失败排查与修复
一 快速自检清单
sudo swapoff -a,并在 /etc/fstab 中注释含 swap 的行,永久生效。sudo apt update && sudo apt install -y containerd && sudo systemctl enable --now containerd。sudo apt-mark hold kubelet kubeadm kubectl 防止被升级破坏版本一致性。kubeadm init,常见参数包括 --apiserver-advertise-address=<本机IP>、--pod-network-cidr=10.244.0.0/16(与所选网络插件匹配)、必要时指定 --image-repository 使用国内镜像源。mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown $(id -u):$(id -g) $HOME/.kube/config。kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml。kubectl get nodes 检查状态是否为 Ready。二 常见故障与修复
registry.aliyuncs.com/google_containers),或提前用 crictl pull/docker pull 拉取所需镜像并重新打标签;若使用 containerd,确保 /etc/containerd/config.toml 的 sandbox_image 与拉取镜像一致。net.bridge.bridge-nf-call-iptables=1 等)。sudo ufw allow 6443,2379,2380,10250,10251,10252,10255/tcp && sudo ufw reload;如使用 firewalld/iptables,做等价的放行规则。kubectl get pods -n kube-system,确认 flannel/cilium/kube-proxy 运行正常;必要时重新应用网络插件清单。$HOME/.kube/config 存在且有效,执行 kubectl config view 校验当前上下文与集群信息。三 关键日志与定位命令
sudo journalctl -u kubelet -xe,关注启动失败原因(镜像、cgroup、swap、端口冲突等)。sudo journalctl -xe 或 /var/log/syslog,定位网络、服务、权限相关错误。kubectl logs -n kube-system <pod-name>,优先排查 coredns、kube-proxy、flannel 等系统 Pod。kubectl get nodes、kubectl get pods -A -o wide,快速判断网络插件与控制平面是否就绪。四 一键纠偏脚本示例
#!/usr/bin/env bash
set -e
# 0) 基本环境
sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release
# 1) 关闭 Swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 2) 安装 containerd(若已安装可跳过)
sudo apt install -y containerd
sudo systemctl enable --now containerd
# 3) 安装 kubelet/kubeadm/kubectl
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
# 4) UFW 放行(如启用)
sudo ufw allow 6443,2379,2380,10250,10251,10252,10255/tcp || true
sudo ufw reload || true
# 5) 初始化控制平面(按需修改参数)
API_IP=$(ip -4 addr show scope global | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n1)
sudo kubeadm init \
--apiserver-advertise-address=$API_IP \
--pod-network-cidr=10.244.0.0/16 \
--image-repository=registry.aliyuncs.com/google_containers
# 6) 配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 7) 安装 Flannel 网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
echo "Init done. Run on worker nodes:"
echo " sudo kubeadm join $API_IP:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>"
说明:请将 <token> 与 <hash> 替换为 kubeadm init 输出中的实际值;如使用云厂商或受限网络,请提前准备镜像或使用内网镜像仓库。
五 仍未解决时请准备的信息
kubeadm init 的完整输出与关键报错片段。sudo journalctl -u kubelet -xe 的最后 100 行。kubectl get nodes -o wide 与 kubectl get pods -A -o wide 的结果。uname -a、lsb_release -a、free -m、df -h、ip a、sudo ufw status 或防火墙规则。kubelet --version、crictl version 或 docker version)。