副标题1:为什么越来越多人选择VPS搭建K8s集群?——低成本、高灵活的轻量实践
在云服务厂商竞争白热化的2025年,Kubernetes(简称K8s)作为容器编排领域的事实标准,早已成为开发者和企业必备的技术栈。但很多人不知道,搭建K8s集群不一定非要选择动辄上千元/月的云服务器——对于个人开发者、小型团队甚至初创公司而言,用VPS(虚拟专用服务器)搭建K8s集群,既能满足基础业务需求,又能把成本压到最低。
2025年的VPS市场已非常成熟,不少老牌服务商推出了“学生机”“轻量应用服务器”套餐,配置2核4G内存、50GB SSD存储的VPS,年付仅需数百元,部分新平台甚至提供首月免费试用。相比云服务器,VPS的优势在于“按需付费”和“环境隔离性”:每个VPS就是一台独立服务器,能灵活调整配置,适合测试环境快速迭代;而云服务器的多租户共享架构,反而可能因资源竞争影响性能稳定性。
不过需要注意,VPS搭建K8s的前提是“稳定性”和“网络连通性”。推荐选择支持“独立IP”“带宽保障”的服务商,避免共享IP导致的端口冲突,同时优先选择国内或离目标用户近的地域,减少网络延迟。
副标题2:2025年VPS环境准备全流程:系统配置、网络开放与基础依赖安装
搭建K8s集群的第一步是“搭好舞台”——确保VPS环境满足K8s的最低要求,且配置正确。以2025年的技术栈为例,单节点(主节点)推荐配置:2核CPU、4GB内存、40GB SSD存储、1Mbps以上带宽;工作节点可根据应用负载调整,建议至少1核2G。系统方面,Ubuntu 22.04 LTS是K8s官方推荐的稳定版本,兼容性最佳,本文所有操作均基于此系统展开。
环境准备的核心是“系统初始化”。通过SSH登录VPS,执行以下命令更新系统并安装依赖:sudo apt update && sudo apt upgrade -y
sudo apt install -y openssh-server curl wget
接着需要开放K8s所需的端口。K8s集群通信涉及多个组件,需在VPS防火墙(如ufw)中开放:sudo ufw allow 22/tcp # SSH远程登录
sudo ufw allow 6443/tcp # K8s API Server
sudo ufw allow 2379:2380/tcp # etcd集群通信
sudo ufw allow 10250:10252/tcp # kubelet端口
sudo ufw allow 10255/tcp # 控制平面健康检查
sudo ufw allow 30000:32767/tcp # NodePort服务端口
sudo ufw enable # 启动防火墙
必须禁用Swap——K8s要求禁用Swap以保证内存资源分配的稳定性。执行sudo swapoff -a
临时禁用,若需永久生效,需编辑/etc/fstab文件,注释掉swap行并保存。完成后,可通过free -h
确认Swap已关闭。
副标题3:2025年K8s集群初始化与节点添加:从主节点到工作节点的完整步骤
环境准备好后,下一步是安装K8s依赖工具。2025年K8s稳定版已更新至v1.29,推荐使用kubeadm快速部署,省去手动配置复杂组件的麻烦。安装步骤如下:在所有节点(主节点和工作节点)执行:sudo apt install -y apt-transport-https ca-certificates curl
# 添加K8s官方GPG密钥
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# 添加K8s软件源
cat > /etc/apt/sources.list.d/kubernetes.list << EOF
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
# 安装kubeadm、kubelet、kubectl(指定版本避免自动更新)
sudo apt update && sudo apt install -y kubelet=1.29.0-00 kubeadm=1.29.0-00 kubectl=1.29.0-00
# 锁定版本防止自动升级
sudo apt-mark hold kubelet kubeadm kubectl
初始化主节点是搭建集群的关键一步。执行kubeadm init
命令,指定K8s镜像仓库和网络插件:sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \ # Calico网络插件的默认CIDR
--kubernetes-version=1.29.0 \
--image-repository registry.aliyuncs.com/google_containers # 使用国内镜像源加速拉取
--service-cidr=10.96.0.0/12 # 服务网络CIDR
初始化成功后,终端会输出添加工作节点的命令,:kubeadm join 1.2.3.4:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
这个命令需要保存好,后续添加工作节点时直接执行即可。
主节点初始化后,还需安装网络插件才能正常通信。执行kubectl apply -f https://docs.projectcalico.org/v3.26/manifests/calico.yaml
(Calico最新版可能更新,建议确认官网最新链接)。安装完成后,等待约2分钟,执行kubectl get pods -n kube-system
,看到calico-node-xxx等Pod状态为Running,说明网络插件部署成功。
添加工作节点,在工作节点上执行主节点输出的join命令,稍等片刻,回到主节点执行kubectl get nodes
,若所有节点状态为Ready,说明K8s集群搭建完成。
副标题4:部署第一个K8s应用:用kubectl创建Nginx服务并暴露访问
集群搭建完成后,部署一个简单的Nginx服务,验证集群功能。创建Nginx Deployment:kubectl create deployment nginx --image=nginx:alpine
执行kubectl get pods
,可以看到nginx-xxxx的Pod正在运行。接着,需要将服务暴露到外部访问,这里使用NodePort类型的Service,命令如下:kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
通过kubectl get svc
查看Service信息,会显示类似:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10m
nginx NodePort 10.104.15.2 <none> 80:30080/TCP 2m
其中“30080”就是NodePort端口,此时可在浏览器中输入VPS的公网IP+端口,http://123.45.67.89:30080,看到Nginx的欢迎页面,说明服务部署成功。
如果需要更规范的访问,可添加Ingress控制器(如Ingress-NGINX),通过域名直接访问。但对于测试阶段,NodePort方式简单直观,适合快速验证效果。
问题1:VPS搭建K8s时遇到kubeadm init卡在“waiting for the kubelet to boot up the control plane”怎么办?
答:检查主节点的kubelet服务状态:systemctl status kubelet
,若显示“inactive”,启动服务后再次尝试;若显示“active”,通过日志排查原因:journalctl -u kubelet -f
。常见问题是etcd数据目录损坏或镜像拉取失败。解决方法:
1. 执行sudo kubeadm reset
重置集群状态,删除etcd数据目录(sudo rm -rf /var/lib/etcd
),重新初始化;
2. 若为镜像拉取失败,修改kubeadm配置文件:kubeadm config print init-defaults > kubeadm-config.yaml
,编辑文件将imageRepository改为国内镜像源(如registry.aliyuncs.com/google_containers),再执行kubeadm init --config kubeadm-config.yaml
。
问题2:如何提升VPS搭建的K8s集群安全性?需要注意哪些细节?
答:需从网络、访问控制、数据安全三方面入手:
1. 网络安全:仅开放必要端口(如
22、6443),使用网络策略(Network Policy)限制Pod间通信,禁止非授权Pod访问API Server;
2. 访问控制:禁用root SSH登录,强制使用SSH密钥;K8s中创建最小权限的Service Account,为Pod配置安全上下文(如非root用户运行、禁用特权容器);
3.数据安全:定期备份etcd数据(etcdctl snapshot save
),限制etcd数据目录权限(chmod 700 /var/lib/etcd
),启用API Server的TLS加密(--tls-cert-file和--tls-private-key-file),避免使用过期证书(通过kubeadm certs check-expiration
检查证书有效期,及时更新)。