服务器K8s教程:从零搭建单节点集群并部署第一个应用

这篇教程帮你在单台服务器上从零搭起一个可用的 Kubernetes(简称 K8s,容器编排系统)集群,并部署一个 Nginx 应用来确认环境正常。

适用场景:学习测试、开发联调、小规模内部服务。
生产环境建议至少三台节点并做高可用,单节点不具备故障冗余。
下面所有命令在 Ubuntu 22.04 上验证过,其他发行版需自行核对包管理命令。

环境准备与依赖安装

开始前先确认你的服务器满足这些条件:

  • 操作系统:Ubuntu 22.04,内核版本 5.4 以上(uname -r 查看)
  • 内存:至少 2GB,低于 2GB 时 kubelet 容易启动失败
  • CPU:2 核以上
  • 磁盘:20GB 以上可用空间
  • 网络:能访问外网,用于拉取镜像
  • 当前用户具备 sudo 权限

关闭 swap,K8s 默认要求禁用交换分区:

sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

第二行是永久关闭,避免重启后失效。
执行完用 free -h 确认 Swap 一行为 0。

配置内核转发和网桥模块:

sudo tee /etc/modules-load.d/k8s.conf <

接着安装容器运行时 containerd(负责管理容器生命周期),推荐用 Docker 官方源:

sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y containerd.io

生成默认配置并启用 systemd cgroup 驱动,否则 kubelet 与 containerd 的 cgroup 模式不一致会导致节点 NotReady:

sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd

用 sudo systemctl status containerd 确认状态为 active (running)。

安装 kubeadm、kubelet 与 kubectl

这三个组件分工不同:kubeadm 负责初始化集群,kubelet 是每个节点上的代理进程,kubectl 是你操作集群的命令行工具。

sudo apt install -y apt-transport-https
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

apt-mark hold 防止后续 apt upgrade 自动升级,避免版本错位导致集群异常。
用 kubeadm version 和 kubectl version --client 确认安装成功。

初始化集群并安装网络插件

在初始化之前,先拉取所需镜像(国内服务器可提前配置镜像加速,方法视网络环境而定):

sudo kubeadm config images pull

执行初始化,--pod-network-cidr 必须和后面网络插件的网段一致:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<你的服务器内网IP>

成功后会输出一段 kubeadm join 命令,务必保存,添加工作节点时要用。

配置 kubectl 的访问凭据:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装 Flannel 网络插件,让 Pod 之间能互相通信:

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

单节点集群需要去掉 master 的污点,允许 Pod 调度到本节点:

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

等待一两分钟,运行 kubectl get nodes,当 STATUS 显示 Ready 时集群就绪。
如果一直是 NotReady,先看 kubectl get pods -n kube-system,重点检查 flannel 和 coredns 两个 Pod 的状态。

部署应用并验证

创建一个 Nginx Deployment:

kubectl create deployment nginx-test --image=nginx:alpine --replicas=2

暴露为 NodePort 服务,方便从服务器外部访问:

kubectl expose deployment nginx-test --port=80 --type=NodePort
kubectl get svc nginx-test

kubectl get svc 输出的 PORT(S) 列会显示类似 80:31234/TCP,其中 31234 是随机分配的 NodePort。
用 curl http://<服务器IP>:31234 应返回 Nginx 欢迎页的 HTML。

查看 Pod 是否正常运行:

kubectl get pods -o wide

两个 Pod 都应为 Running 状态。
如果想进一步确认容器内服务,可以进入某个 Pod:

kubectl exec -it  -- sh

验证完成后清理测试资源,避免占用端口和资源:

kubectl delete service nginx-test
kubectl delete deployment nginx-test

常见问题与避坑要点

节点一直 NotReady:最常见原因是 containerd 的 SystemdCgroup 没改成 true,或者网络插件没装成功。
用 sudo journalctl -u kubelet -n 50 看具体报错。

拉取镜像超时:国内服务器访问 registry.k8s.io 可能很慢。
可以在 kubeadm 初始化时通过配置文件指定镜像仓库,或提前手动 pull 并打 tag。

重置集群重来:
如果初始化失败想重做,
执行 sudo kubeadm reset -f,
然后删除 $HOME/.kube 和 /etc/cni/net.d 下的残留配置,
再重新初始化。

端口冲突:kubeadm 默认占用 6443、10250 等端口,如果服务器上已有服务占用,初始化会报错。
用 ss -tlnp 检查端口占用情况。

几个容易被问到的问题:

单节点集群能用于生产吗?
不建议。单节点没有冗余,一旦服务器故障整个集群不可用。生产环境至少三个控制平面节点加多个工作节点,并做好 etcd 备份。

kubelet 和 kubectl 有什么区别?
kubelet 运行在每个节点上,负责启动和管理容器;kubectl 是你在本地或跳板机上敲命令的工具,通过 API Server 与集群通信。两者角色完全不同,不要混淆。

为什么必须关闭 swap?
Kubernetes 的调度和资源管理依赖对内存的精确控制,swap 会让内存统计失真,导致调度决策不准确,因此默认要求禁用。

NodePort 的端口范围是多少?
默认是 30000-32767,可以在 kube-apiserver 的启动参数中调整,但一般保持默认即可。

这套单节点流程适合先把 K8s 跑起来建立直观认识。
跑通之后,建议继续学习多节点加入、etcd 备份恢复、资源限制和 Ingress 配置,这些才是集群走向稳定运行的关键环节。

分享到:
上一篇
零基础服务器DevOps教程:从手动部署到自动化上线
下一篇
服务器Docker教程:从安装到运行第一个容器
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意