搜「Kubernetes安装部署教程」的人,多数不是不懂 Pod 和 Service 的概念,而是卡在命令敲完之后:kubeadm init 停在拉镜像、kubectl get nodes 报 localhost:8080 连不上、节点加进来却一直 NotReady。这三类基本覆盖了第一次部署失败的大头,所以下面按真实排查顺序写:先确认前提,再走最短可用路径,用一个具体集群把参数落到位,最后给出三个高频卡点的判断位置。
第一次装 Kubernetes,建议用 kubeadm 单控制面把集群跑通,而不是一上来做高可用或多运行时选型。前提是三件事必须确认:kubeadm/kubelet/kubectl 版本对得上、执行账号有 root 权限且 swap 已关、kubeconfig 在你能读到的位置。跑通的标准不是 init 成功,而是 kubectl get nodes 显示 Ready 且 kube-system 下 Pod 全部 Running。版本偏差和镜像仓库地址会变,以官方版本偏差页面和你所用镜像站的说明为准,不要照抄旧教程里的固定版本号。
Kubernetes安装部署之前先确认这三件事
这三件事缺一件,后面的命令都会以看起来无关的报错失败,先花五分钟查完再动手。
- 版本:控制面组件和节点组件版本差太大,
kubeadm init会直接拒绝或初始化后 kubelet 起不来。执行kubeadm version -o short、kubelet --version、kubectl version --client,再cat /etc/os-release看发行版和内核对 containerd 的支持情况。能装哪些版本,用包管理器看:apt list -a kubeadm或yum --showduplicates list kubeadm。允许的跨版本偏差去 kubernetes.io 的 version skew policy 页面核对,不要凭印象。 - 权限与主机状态:
id -u返回 0 才是 root,否则每条命令前加 sudo。swapon --show有输出说明 swap 还开着,kubelet 默认会报failed to run Kubelet: running with swap on is not supported,需要swapoff -a并注释/etc/fstab里的 swap 行。lsmod | grep br_netfilter为空要手动 modprobe。云主机还要在控制台安全组页面放通 6443(API Server)、10250(kubelet)、以及你所选 CNI 需要的端口。 - 入口位置:集群的入口就是 kubeconfig。
ls -l /etc/kubernetes/admin.conf是 kubeadm 生成的管理员凭证,普通用户要用它拷到~/.kube/config;已有配置时echo $KUBECONFIG看是否指向了别的文件,kubectl config view --minify能看到当前实际生效的 cluster 和 server 地址。托管集群则去云控制台的集群详情页,字段通常叫“连接信息”或“kubeconfig”,下载后替换本地文件。
Kubernetes安装部署:最短可用路径
下面这段前置配置在所有节点以 root 执行,作用是加载内核模块、打开转发、关掉 swap,可以直接复制:
modprobe overlay
modprobe br_netfilter
cat >/etc/modules-load.d/k8s.conf <<'EOF'
overlay
br_netfilter
EOF
cat >/etc/sysctl.d/99-k8s.conf <<'EOF'
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
swapoff -a
sed -ri 's/^([^#].*\sswap\s.*)$/#\1/' /etc/fstab
做完应该看到 sysctl --system 逐条打印出刚写入的三项,swapon --show 无输出。

- 装容器运行时和三个组件:Ubuntu 系是
apt install -y containerd && systemctl enable --now containerd,然后按 pkgs.k8s.io 官方安装页添加仓库,再apt install -y kubelet kubeadm kubectl。做完systemctl status containerd应是 active (running),kubeadm version -o short有输出。 - 初始化控制面:
kubeadm init --pod-network-cidr=10.244.0.0/16 --cri-socket unix:///run/containerd/containerd.sock --image-repository=<你的镜像站地址>。做完看到末尾打印Your Kubernetes control-plane has initialized successfully!和一段kubeadm join命令,两样都要留存。 - 配好 kubectl:
mkdir -p $HOME/.kube && cp /etc/kubernetes/admin.conf $HOME/.kube/config && chown $(id -u):$(id -g) $HOME/.kube/config。做完kubectl get nodes能列出控制面节点,状态先显示 NotReady 是正常的。 - 装 CNI:按所选插件官方清单执行
kubectl apply -f <清单地址>,Flannel 与 Calico 的 Pod 网段参数要和上一步的--pod-network-cidr一致。做完kubectl get pods -n kube-system里 CNI 的 DaemonSet 全部 Running,节点转为 Ready。 - 加节点:在工作节点执行 init 结束时留存的
kubeadm join ...,带--cri-socket。做完在控制面kubectl get nodes应看到两台都是 Ready。
按这个顺序判断是否真的跑通,不要跳步:先看 kubectl get nodes 是否 Ready,再看 kubectl get pods -n kube-system 是否全部 Running,再看 kubectl run t --image=busybox --restart=Never -- sleep 60 能否调度成功,最后才考虑加工作负载。
Kubernetes安装部署:一个真实场景的完整做法
场景取一个常见规模:3 台 Ubuntu 22.04 虚拟机,内网 192.168.10.0/24,控制面 192.168.10.11,两台工作节点 .12 和 .13,单节点最大 110 个 Pod,Service 网段用默认的 10.96.0.0/12,Pod 网段选 10.244.0.0/16,容器运行时用 containerd。
先在控制面把配置写成文件 /root/kubeadm-config.yaml,而不是堆一长串命令行参数,方便回看和复用:
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.10.11
bindPort: 6443
nodeRegistration:
criSocket: unix:///run/containerd/containerd.sock
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.31.0
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
两个字段要按环境替换:kubernetesVersion 换成第 1 步 apt list -a kubeadm 里实际能装到的那一版;imageRepository 换成你网络里确实连得通的镜像站地址。API 结构会随 kubeadm 主版本变化,稳妥做法是先跑一次 kubeadm config print init-defaults,以打印出的 apiVersion 和字段结构为准再改,然后 kubeadm init --config /root/kubeadm-config.yaml --dry-run 预检,无报错再正式执行。

还有一个文件必须改:/etc/containerd/config.toml,找到 [plugins.'io.containerd.grpc.v1.cri'.containerd.runtimes.runc.options] 下的 SystemdCgroup,设为 true,再 systemctl restart containerd。用 containerd config default | grep SystemdCgroup 确认生效。不改这一项,kubelet 大概率起不来。
Kubernetes安装部署:跑不通先查这三处
按出现频率从高到低,三个卡点和各自的检查位置:
- 节点一直 NotReady,kube-system 里没有 CNI Pod:
kubectl describe node <节点名>的 Conditions 里会看到NetworkUnavailable,原因是cni plugin not initialized。检查kubectl get pods -n kube-system是否存在 flannel 或 calico 的 Pod,以及ls /etc/cni/net.d/是否为空。空目录就是 CNI 没装上或清单 apply 失败,回看 apply 时的报错。 - kubelet 反复重启:
journalctl -u kubelet -n 100 --no-pager里若出现failed to run Kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs",就是上面说的 containerdSystemdCgroup没开;若出现running with swap on is not supported,回查swapon --show和/etc/fstab。另一条常见的是failed to get sandbox image,检查crictl images里有没有 pause 镜像。 - kubectl 报 The connection to the server localhost:8080 was refused:这是没找到 kubeconfig,不是集群挂了。检查
ls -l /etc/kubernetes/admin.conf是否存在,echo $KUBECONFIG是否指了别的路径,以及当前用户~/.kube/config的属主是不是自己。按第 2 节的第三条重新拷一次即可。
另外提醒一个容易被忽略的坑:kubeadm init 成功只代表控制面起来了,不代表集群可用。此时节点还是 NotReady,任何 Pod 都调度不上去,所以不要把 init 的成功输出当成部署完成,接着把 CNI 装完再看节点状态,才算这一步结束。