最近在部署Kubernetes 1.33.7集群时,遇到了不少"坑",从控制平面启动失败到网络插件问题,再到权限配置和资源调度异常。本文将完整还原整个部署过程,并针对每个关键错误提供解决方案。这些经验来自实际生产环境中的反复验证,不同于官方文档的理想化场景,更聚焦于真实环境中可能遇到的各类问题及其解决方法。
在开始安装前,必须确保系统满足以下最低要求:
关键系统参数检查:
bash复制# 检查内存和交换空间
free -h
# 检查磁盘空间
df -h
# 确保IP转发已启用(必须为1)
sysctl net.ipv4.ip_forward
# 如果未启用,执行以下命令临时生效并永久写入配置
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sysctl -p
Kubernetes 1.33.7默认使用containerd作为容器运行时,正确配置其sandbox镜像至关重要:
bash复制# 检查当前sandbox镜像配置
grep sandbox_image /etc/containerd/config.toml
# 如果未正确配置或使用国外镜像源,执行替换(使用阿里云镜像源)
sed -i 's#sandbox_image = ".*"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"#g' /etc/containerd/config.toml
# 重启containerd使配置生效
systemctl restart containerd
注意:pause镜像是Kubernetes Pod的基础镜像,配置错误会导致所有Pod无法启动。国内环境务必使用可靠的镜像源,否则可能因网络问题导致镜像拉取失败。
以下是经过验证可用的初始化命令,包含每个关键参数的说明:
bash复制kubeadm init \
--apiserver-advertise-address=192.168.235.128 \ # 指定API Server监听地址
--image-repository registry.aliyuncs.com/google_containers \ # 使用国内镜像源
--kubernetes-version v1.33.7 \ # 明确指定版本避免兼容问题
--service-cidr=10.96.0.0/12 \ # 服务虚拟IP范围
--pod-network-cidr=10.244.0.0/16 \ # Pod IP范围(需与CNI插件匹配)
--ignore-preflight-errors=all \ # 跳过非致命性检查(生产环境慎用)
--cri-socket=unix:///run/containerd/containerd.sock \ # 明确指定容器运行时接口
--v=5 # 详细日志输出级别
当遇到如下错误时:
code复制error execution phase wait-control-plane: failed while waiting for the control plane to start: [kube-controller-manager check failed...]
这表明控制平面组件(kube-apiserver, kube-controller-manager, kube-scheduler)未能正常启动。按以下步骤排查:
bash复制crictl --runtime-endpoint unix:///run/containerd/containerd.sock ps -a | grep kube | grep -v pause
bash复制# 获取故障容器ID后查看日志
crictl --runtime-endpoint unix:///run/containerd/containerd.sock logs <container_id>
bash复制kubeadm reset -f --cri-socket=unix:///run/containerd/containerd.sock
rm -rf /etc/kubernetes/
rm -rf /var/lib/kubelet/
rm -rf /etc/cni/net.d/
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm --clear
systemctl restart containerd
症状:CoreDNS Pod处于ContainerCreating状态,describe查看事件显示:
code复制Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox
解决方案:
bash复制# 下载并安装CNI插件(根据架构选择)
CNI_VERSION="v1.3.0"
ARCH="amd64" # 或 arm64
mkdir -p /opt/cni/bin
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-${ARCH}-${CNI_VERSION}.tgz" | \
sudo tar -C /opt/cni/bin -xz
# 验证安装
ls -lh /opt/cni/bin/
# 重启kubelet并重建Pod
systemctl restart kubelet
kubectl delete pod -n kube-system coredns-757cc6c8f8-7sbd9
kubectl delete pod -n kube-system coredns-757cc6c8f8-k5bv8
错误信息:
code复制Warning FailedScheduling 2m46s default-scheduler 0/1 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }
解决方案(移除控制平面节点的NoSchedule污点):
bash复制# 移除新版污点标签
kubectl taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule-
# 兼容旧版污点标签(双重保险)
kubectl taint nodes --all node-role.kubernetes.io/master:NoSchedule-
生产环境注意:移除污点后工作负载可以调度到控制平面节点,可能影响稳定性。建议仅在测试环境或资源受限时使用此方案。
当执行kubectl命令出现:
code复制Error from server (Forbidden): pods is forbidden: User "system:root" cannot list resource "pods" in API group "" at the cluster scope
检查并修复kubectl别名问题:
bash复制# 检查是否存在冲突别名
alias | grep kubectl
# 移除问题别名
unalias kubectl
# 验证默认配置
kubectl get nodes
正确做法是使用admin.conf配置文件:
bash复制export KUBECONFIG=/etc/kubernetes/admin.conf
# 或
kubectl --kubeconfig=/etc/kubernetes/admin.conf get nodes
bash复制# 查看所有节点状态(应显示Ready)
kubectl get nodes -o wide
# 检查所有系统Pod状态(应全部Running)
kubectl get pods -n kube-system
# 详细检查集群组件健康状态
kubectl get --raw='/readyz?verbose'
# 检查事件日志(关注Warning和Error)
kubectl get events --sort-by='.metadata.creationTimestamp' -A
bash复制# 查看kubelet日志
journalctl -u kubelet -f
# 查看containerd日志
journalctl -u containerd -f
bash复制# 安装metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 验证节点资源使用
kubectl top nodes
bash复制# 部署测试Pod验证网络连通性
kubectl run busybox --image=busybox -- sleep 3600
kubectl exec busybox -- ping <另一个Pod的IP>
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containerskubelet --system-reserved=memory=500Mikubeadm certs check-expirationkubeadm certs renew all通过这次部署实践,我深刻体会到Kubernetes安装过程中"细节决定成败"的道理。特别是在资源受限的环境下,每个配置项都需要精心调整。建议在正式环境部署前,先在相同配置的测试环境完整走通整个流程。当遇到问题时,善用kubectl describe和journalctl查看详细日志,这些工具能提供90%以上的问题线索。