云服务器上从零搭一套Kubernetes集群,踩过的坑都给你标出来了
单机 Docker 跑几个容器,一开始挺爽。等到要滚动更新、某个服务挂了想自动拉起、流量上来了想多开几个实例时,你就开始手忙脚乱了。这时候大概率会想到 K8s,然后打开教程一看——全是本地虚拟机、三台 VMware、直接连内网 IP,照搬到云服务器上,第一步就卡在节点之间 ping 不通。这篇文章就是写给国内站长和中小团队看的:教你在云服务器上用 kubeadm 搭一套能用的三节点集群,顺带把选购配置和几个高频坑说清楚。不需要你是运维老手,会点 Linux 基本命令就行。
第一步:买机器,别一上来就抠配置
最少三台。一台 Master(控制面),两台 Worker(跑业务)。配置建议 2核4G 起步,Master 别用 2G 内存,kube-apiserver 和 etcd 稳住阵脚就要吃掉一截,2G 容易在初始化时直接 OOM,别问我是怎么知道的。
买的时候注意三点:同一地域、同一可用区、走内网互通。云厂商同账号同地域的机器一般内网自动通,但你要确认安全组放行了这些端口:
- Master:6443(API Server)、2379-2380(etcd)
- 所有节点:10250(kubelet)、30000-32767(NodePort 服务)
- Calico 网络插件:UDP 4789(VXLAN),如果用 IPIP 模式还要放行协议号 4
系统选 Ubuntu 22.04 或 CentOS Stream 9 都行,干净的最小安装最好,别用带宝塔面板的镜像,你会在后面被各种莫名其妙的 iptables 规则搞到怀疑人生。
第二步:三台机器统一做系统初始化
三台都执行,一步都别省:
# 1. 主机名(每台不同:k8s-master / k8s-node1 / k8s-node2)
hostnamectl set-hostname k8s-master
# 2. hosts 互相解析,用内网 IP
cat >> /etc/hosts <<EOF
10.0.0.11 k8s-master
10.0.0.12 k8s-node1
10.0.0.13 k8s-node2
EOF
# 3. 关 swap(K8s 强制要求,不关 kubelet 起不来)
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 4. 时间同步,证书校验高度依赖时间
apt install -y chrony && systemctl enable --now chrony # CentOS 用 yum
# 5. 内核参数
cat >> /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
modprobe br_netfilter && sysctl --system
然后装容器运行时。新版 K8s 已经不支持 Docker 了,用 containerd:
apt install -y containerd
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 关键:把 SystemdCgroup 改成 true,否则集群初始化会报错
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
第三步:装 kubeadm、kubelet、kubectl
国内直连 Google 源基本没戏,加阿里云源:
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/Release.key | \
gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/ /" > /etc/apt/sources.list.d/kubernetes.list
apt update && apt install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl # 锁版本,不然哪天自动升级集群就炸了
第四步:初始化 Master,装网络插件
在 Master 上执行,注意把 IP 换成你自己的内网 IP,镜像仓库用阿里云:
kubeadm init \
--apiserver-advertise-address=10.0.0.11 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=192.168.0.0/16 \
--kubernetes-version=v1.29.0
成功后按提示配置 kubectl:
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
然后装 Calico(网络不通,Pod 之间没法通信):
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
这个 yaml 国内可能拉不动,拉不到就本地下载后上传,或者把里面的镜像地址换成 registry.cn-hangzhou.aliyuncs.com 前缀。
第五步:加入节点,跑个应用验证
在 Node 上执行 Master 初始化完打印出来的 kubeadm join ... 命令,等几十秒,回 Master 跑 kubectl get nodes,三台都是 Ready 就成功了。
跑个 Nginx 试试:
kubectl create deployment web --image=nginx:alpine --replicas=2
kubectl expose deployment web --port=80 --type=NodePort
kubectl get svc web
用 节点公网IP:NodePort 能打开页面,说明整套链路是通的。
避坑提醒:新手最容易栽的三个地方
第一,只买一台机器硬装集群,然后 Pod 调度不上去——因为 Master 默认带污点不接受业务 Pod,得自己删掉 taint 才行。第二,安全组只放了 22 和 80,结果 join 时一直超时,排查半天以为是网络问题。第三,忘了关 swap 或者忘了锁 kubelet 版本,前者导致 kubelet 反复重启,后者某次 apt upgrade 之后集群直接不认节点了。别笑,这三个我都见过,包括我自己。
机器选谁家:推荐一个省心的选项
搭 K8s 对机器的要求其实不高,但要的是稳定内网、够用的带宽、不被莫名其妙攻击打断。这里推荐下沐雨云服务器:提供高防云服务器,单机 50-200G DDoS/CC 防御,跑 K8s 最怕被人打流量,有这层防护心里踏实;香港/美国/日本免备案 VPS,采用 BGP/CN2 优质线路,纯 SSD 固态硬盘,跨地域组集群或者做边缘节点都合适。入门款 2核2G 轻量云 12.8 元/月起,先拿来练手或者搭个小集群完全够,支持支付宝/微信付款,适合个人博客、电商网站、游戏服务器、外贸独立站这些场景。
最后回顾一下要点
- 三台起步,同地域同可用区,2核4G 打底,安全组端口别漏
- 关 swap、同步时间、调内核参数,三台一个都不能少
- 用 containerd 不用 Docker,
SystemdCgroup记得改 true - 镜像走阿里云仓库,kubelet 版本记得 hold 住
- 装完必须上网络插件,Calico 或 Flannel 二选一
照着走一遍,一个下午基本能跑起来。剩下的,就是在上面慢慢折腾你的业务了。



这一切,似未曾拥有