黄老师

“按教程搭 K8s 集群,节点连不上;好不容易启动服务,多节点通信又报‘Timeout’;翻日志半天找不到问题?” 不少运维、开发新手都被这些报错卡过,其实 K8s 集群搭建涉及环境、网络、配置等环节,一点小疏漏就会翻车。今天针对 “集群搭建失败”“多节点报错”,拆解决策方案 + 实操命令,帮你少走弯路。
点击查看>>>深入解析 Kubernetes 架构组成,手把手完成 K8s 环境的安装、配置视频教学
很多搭建失败不是步骤错,而是前期准备不到位,这 3 个问题占失败原因的 60%,先逐一核对:
K8s 对系统有明确要求,不满足就会 “启动失败”“服务无响应”:
- 系统版本:CentOS 选 7.9/8.5,Ubuntu 选 20.04/22.04,别用 CentOS 6 这类旧版本,多数 K8s 组件不兼容;
- 内核参数:必须开 “网桥转发” 和 “IPv4 转发”,否则 Pod 间没法通信。执行命令检查,返回 “1” 才合格:
sysctl net.bridge.bridge-nf-call-iptables sysctl net.ipv4.ip_forward
没开启的话,用这两条命令配置并生效:
echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
- 依赖包:得提前装 containerd(或 Docker)、kubelet、kubeadm、kubectl,少一个都不行。以 CentOS 为例,安装命令参考:
yum install -y containerd.io cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0 --disableexcludes=kubernetes
K8s 节点间靠特定端口通信(比如 Master 的 6443 端口、Worker 的 10250 端口),防火墙、SELinux 会直接拦截:
- 关防火墙:CentOS 用 firewalld,Ubuntu 用 ufw,以 CentOS 为例:
systemctl stop firewalld
systemctl disable firewalld
- 关 SELinux:这是 Linux 安全模块,会限制容器资源访问。临时关用setenforce 0,永久关得改配置文件:
setenforce 0 vi /etc/selinux/config
K8s 默认用 Containerd 当容器运行时,配置不对会 “容器启动失败”“镜像拉取超时”:
- Containerd 配置:得设 “SystemdCgroup=true”,不然 Kubelet 管不了容器:
containerd config default > /etc/containerd/config.toml vi /etc/containerd/config.toml systemctl restart containerd
- Docker 配置(用 Docker 的话):要加 “exec-opts”: ["native.cgroupdriver=systemd"],和 Kubelet 的 Cgroup 驱动保持一致,不然报 “Cgroup driver mismatch”:
vi /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] } systemctl restart docker systemctl restart kubelet
基础环境没问题,却在 “Master 初始化”“Worker 加集群”“节点通信” 环节报错?这三类问题最常见,附具体解决办法:
执行kubeadm init常遇 “镜像拉取超时”“etcd 启动失败”:
- 报错 1:镜像拉取超时(Failed to pull image k8s.gcr.io/xxx)原因:默认镜像源在国外,国内服务器拉不下来。解决:用阿里云镜像源,初始化时加参数:
kubeadm init --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
- 报错 2:etcd 启动失败(etcd exited with code 1)原因:之前初始化过,etcd 数据有残留,或端口被占。解决:重置 K8s + 清数据,再重新初始化:
kubeadm reset -f rm -rf /var/lib/etcd/*
执行 Master 生成的kubeadm join命令,常遇 “Token 过期”“连接超时”:
- 报错 1:Token 已过期(error: token has expired)原因:Token 默认 24 小时过期,超期用不了。解决:在 Master 节点重新生成 Token:
kubeadm token create --print-join-command
- 报错 2:连接 Master 超时(dial tcp 192.168.1.100:6443: connect: connection refused)原因:Master 的 6443 端口没开,或 Worker 与 Master 网络不通。解决:先在 Worker 节点测端口连通性:
nc -zv 192.168.1.100 6443
不通的话,检查 Master 防火墙(参考第一部分关防火墙)或网络是否互通。
Worker 加集群后,状态是 “NotReady”,多是 “没装网络插件” 或 “内存不足”:
- 原因 1:没装网络插件(Calico/Flannel)K8s 靠网络插件实现 Pod 通信,没装就一直 NotReady。推荐装 Calico:
kubectl apply -f https://docs.projectcalico.org/v3.26/manifests/calico.yaml kubectl get nodes
- 原因 2:节点内存不足(K8s 至少要 2GB 内存)内存不够,Kubelet 启动不了。执行free -h看内存,不够就扩容,或关无用服务:
free -h systemctl stop httpd
解决完报错,这些习惯能减少后续问题,让集群更稳:
新手别直接输kubeadm init,先生成配置文件改参数:
kubeadm config print init-defaults > kubeadm-config.yaml vi kubeadm-config.yaml kubeadm init --config=kubeadm-config.yaml
K8s 组件日志是 “排障神器”,遇到问题先看:
- 查 Kubelet 日志(最常用):
- 查 etcd 日志(Master 节点,etcd 有问题会影响集群):
把常用命令整理好,比如:
K8s 集群搭建失败,多是 “基础环境不达标”“配置不对”“网络受阻”,按 “先查基础坑→再解多节点报错→养成避坑习惯” 的步骤,90% 的问题都能解决。遇到报错别慌,先看日志抓关键词(比如 “timeout”“mismatch”),再对应本文的命令尝试,很快就能搭成集群。
如果想深入学 K8s 运维,比如 “扩容节点”“部署应用”“排查 Pod 故障”,可以关注 “K8s 集群运维实战” 类内容,积累实战经验,让 K8s 真正帮你提升工作效率。