自己搭建k8s服务器,最低需要3台配置为4核8G的机器(控制面2核4G起),完整步骤包括系统初始化、容器运行时安装、kubeadm集群初始化、CNI网络插件部署、工作节点加入,全程约1-2小时可完成。
自建k8s需要什么配置:按用途划分的硬件底线
先讲清楚硬件,因为很多人第一步就栽在这里,自建k8s集群的配置要求完全取决于你想跑什么,不是网上那些所谓“最低配置”能一概而论的。
测试环境:3台2核4G起步
如果你是学k8s、跑几个demo pod,3台2核4G的云服务器或虚拟机就够了,控制面组件(kube-apiserver、etcd、controller-manager)加起来会占用1.5GB左右内存,2核CPU在空闲时压力不大,但一旦跑起业务pod,4G内存会明显吃紧。
生产环境:控制面与节点分离
生产环境建议控制面节点4核8G,工作节点8核16G,至少3台工作节点,这个配置能撑起中等规模的微服务集群,比如每天几百万请求量的业务,如果跑大数据或AI训练,工作节点直接上16核32G以上,存储用NVMe固态。
关于k8s集群配置的具体要求,业内专家指出:“控制面节点的瓶颈常在etcd的磁盘IO和内存,而非CPU,所以SSD是必选项。”
存储与网络:容易被忽略的刚性开销
- 系统盘:每台节点至少50GB,控制面建议100GB
- 容器镜像存储:工作节点预留100GB以上,因为镜像会越来越多
- etcd盘:控制面节点的etcd目录建议单独挂载SSD,IO延迟直接影响集群稳定性
- 内网带宽:集群节点间通信频繁,千兆内网是底线,万兆更稳妥
k8s集群搭建步骤:从裸机到可用集群全流程
硬件备齐后,按下面步骤走,每一步都是实操验证过的。
第一步:操作系统与基础环境准备
用Ubuntu 22.04 LTS或CentOS 7.9都行,推荐Ubuntu,包管理更顺手,这步主要做三件事:
- 关闭swap:kubelet默认要求关闭swap,执行
并注释掉
swapoff -a
/etc/fstab里的swap行 - 加载内核模块:
overlay和br_netfilter是容器网络必需的 - 配置sysctl参数:设置
net.bridge.bridge-nf-call-iptables=1和net.ipv4.ip_forward=1
第二步:容器运行时安装
k8s从1.24版本起不再直接支持Docker,需要安装CRI兼容的运行时,常见的自建k8s方案是containerd。
# 以Ubuntu为例 apt-get install -y containerd mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml
注意修改config.toml,把SystemdCgroup改为true,否则pod内cgroup会不稳定。
第三步:kubeadm、kubelet、kubectl安装
这三个工具的版本必须一致,比如都用1.28.x,用简米云或中科大镜像源可以加速下载,国内服务器直接走官方源大概率超时。
apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl # 锁定版本防止误升级
第四步:控制面初始化
在控制面节点执行:
kubeadm init --apiserver-advertise-address=内网IP --pod-network-cidr=10.244.0.0/16 --image-repository=registry.aliyuncs.com/google_containers
第二个参数--pod-network-cidr是给CNI插件用的,Flannel默认用244.0.0/16,Calico用168.0.0/16,别填错。
初始化完成后会输出kubeadm join命令,复制保存好,工作节点加入集群要用。
第五步:部署CNI网络插件
网络插件不装,节点状态永远是NotReady,选Flannel还是Calico,取决于网络策略需求:
| 对比维度 | Flannel | Calico |
|---|---|---|
| 网络策略支持 | 不支持 | 支持 |
| 性能开销 | 低(VXLAN) | 中(BGP) |
| 部署复杂度 | 低 | 中 |
| 适用场景 | 小规模、测试 | 生产环境、需策略管控 |
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
第六步:工作节点加入集群
在工作节点执行上文的kubeadm join命令,注意带上--token和--discovery-token-ca-cert-hash参数,token有效期默认24小时,过期用kubeadm token create --print-join-command重新生成。
加入后用kubectl get nodes确认所有节点状态为Ready,整个集群就搭建完成了。
托管k8s和自建k8s怎么选:成本与维护的长期账
很多人搭建前会纠结是自建还是用云厂商的托管版(如简米云ACK、酷番云TKE、AWS EKS),这问题得算总账。
自建k8s的总持有成本
以3台4核8G的云服务器为例,国内主流云厂商包年价格大约是每台2000-3000元/年,三台就是6000-9000元/年,一台控制面+两台工作节点,跑轻量业务够用,人力成本另算,你需要有人负责升级、备份、排查故障。
托管k8s的成本优势
托管版省去控制面维护,但节点费用照样出,还会收取托管费用,以简米云ACK为例,托管版Pro集群的管控费用是数百元/月,节点费用另算,相比之下,规模越大托管的性价比越高,小规模自建更划算。
场景化选型建议
- 个人学习、公司内部测试:自建,成本低且能理解原理
- 生产业务且预算充足:托管版,省下的运维时间更值钱
- 已有物理机或内网环境:自建,托管版无法覆盖
- 追求数据主权和网络隔离:自建,数据不出内网
自建k8s踩坑避坑指南:配置之外的隐性门槛
硬件和步骤只是显性成本,真正劝退初学者的是这些细节。
版本兼容性问题
kubeadm、kubelet、kubectl版本不一致会导致初始化失败;CNI插件和k8s版本不匹配会让节点一直NotReady;containerd版本太老无法识别新镜像格式,规避方法很简单:k8s版本统一,安装前查官方兼容矩阵。

网络方案选择冲突
有些教程先装Flannel再装Calico,两个CNI插件同时存在冲突,网络直接瘫痪,还有的教程让修改NodePort端口范围,跟云厂商安全组冲突导致流量不通,自建环境就是自己的网络,遵循默认规则最省事。
资源预留和Pod驱逐
节点内存使用率过高时,kubelet会驱逐pod,这需要你在系统层面预留资源:
- 控制面预留:600MB内存给kubelet本身
- 系统预留:200MB给系统进程
- 驱逐阈值:kubelet默认
memory.available<100Mi开始驱逐
内存不足时,你会发现pod反复重启又无法定位原因大概率是驱逐阈值设置不合理。
常见问题:搭建k8s集群的实时解答
Q:我只有两台机器能搭k8s集群吗?
A:可以,一台做控制面,一台做工作节点,但高可用性几乎为零,控制面挂了整个集群就废了,生产环境至少3台,控制面最好也做高可用(3副本)。
Q:自建k8s用Windows系统可以吗?
A:技术上kubelet支持Windows节点,但控制面(kube-apiserver、etcd)必须是Linux,实际场景中,绝大多数人全部用Linux,Windows做工作节点在特定业务(如.NET应用)才用得上,配置复杂,不建议新手尝试。
Q:kubeadm初始化的token过期了怎么办?
A:在工作节点上重新生成新token,执行kubeadm token create --print-join-command,然后拿新命令重新join即可,如果节点之前已加入过,需要先kubeadm reset清理,再执行join。
搭好一套自建k8s集群的成就感是很真实的,尤其当你在上面跑通第一个应用时,从3台4核8G的配置入门,按上述步骤一步一步来,k8s集群搭建并没有传说的那么难前提是你理解了每个组件在干什么,而不是盲目复制命令。
