用 K3s 在 VPS 上搭建轻量 Kubernetes 集群

概述

Kubernetes 功能强大,但原版太重了。内存要吃 2GB 起步,组件多、维护复杂,小 VPS 根本跑不动。

K3s 是 Rancher 团队做的轻量版 K8s,把所有核心组件打包成一个二进制文件,不到 100MB。单节点 512MB 内存就能跑,内置了 traefik 做 Ingress、sqlite 做后端存储(可选换 PostgreSQL)。对于个人开发、小规模部署来说,K3s 是最省资源的选择。

这篇教程带你从零在 VPS 上装好 K3s,跑一个 Nginx 服务验证集群正常工作。

准备工作

你需要以下条件:

  • 一台 Linux VPS(推荐 Ubuntu 22.04+ 或 Debian 12+)
  • 至少 512MB 内存、10GB 磁盘
  • root 权限或 sudo 权限
  • 一台能运行 kubectl 的本地电脑(Windows/Mac/Linux 都行)
  • 开放 K3s 默认端口 6443(TCP)

💡 提示:单节点 K3s 适合开发和小型项目。如果需要高可用,可以用多节点集群方案。

步骤

第一步:安装 K3s

在 VPS 上执行一键安装脚本:

curl -sfL https://get.k3s.io | sh -

安装完成后,K3s 会作为 systemd 服务自动启动:

# 查看服务状态
sudo systemctl status k3s

# 查看节点状态
sudo k3s kubectl get nodes

你应该能看到一个 Ready 状态的节点,名字是主机名。

第二步:配置 kubectl 到本地

把集群的 kubeconfig 复制到本地电脑:

# 在 VPS 上查看配置路径
sudo cat /etc/rancher/k3s/k3s.yaml

把输出内容保存为本地 ~/.kube/config,然后修改 server 字段,把 127.0.0.1 改为 VPS 的公网 IP:

clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTi...
    server: https://你的VPS_IP:6443  # 改这里
  name: default

然后在本地验证连接:

kubectl get nodes
kubectl cluster-info

能看到节点信息和 K3s 服务地址就说明配置成功了。

第三步:部署一个 Nginx 服务

写一个部署清单 nginx-deploy.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80

应用配置:

kubectl apply -f nginx-deploy.yaml

查看 Pod 状态:

kubectl get pods -l app=nginx
kubectl get svc nginx

等状态变成 Running 后,通过 ClusterIP 访问:

kubectl port-forward svc/nginx 8080:80 &
curl http://localhost:8080

能看到 Nginx 欢迎页面就说明集群部署成功了。

第四步:通过 Ingress 暴露服务

K3s 内置了 traefik,可以直接用 Ingress 暴露服务。创建 nginx-ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: nginx.yourdomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

应用并验证:

kubectl apply -f nginx-ingress.yaml
kubectl get ingress

然后在本地 hosts 文件加一条记录(VPS_IP nginx.yourdomain.com),浏览器访问 http://nginx.yourdomain.com 就能看到 Nginx 页面。

第五步:常用管理命令

# 查看所有资源
kubectl get all

# 查看 Pod 日志
kubectl logs -l app=nginx

# 进入 Pod 内部
kubectl exec -it <pod-name> -- sh

# 扩容到 5 个副本
kubectl scale deployment nginx --replicas=5

# 回滚到上一个版本
kubectl rollout undo deployment nginx

# 删除服务
kubectl delete -f nginx-deploy.yaml

验证

确认集群正常运行的检查清单:

# 1. 节点状态为 Ready
kubectl get nodes

# 2. 所有 Pod 都在 Running
kubectl get pods -A | grep -v Running

# 3. 系统组件正常
kubectl get pods -n kube-system

# 4. Ingress 配置生效
kubectl get ingress

如果所有检查都通过,K3s 集群就搭建完成了。

常见问题

Q:安装后 kubectl 命令找不到?

K3s 安装脚本会自动把 kubectl 软链接到 /usr/local/bin/kubectl。如果还是不行,手动创建:

ln -s /var/lib/rancher/k3s/data/current/bin/kubectl /usr/local/bin/kubectl

Q:内存不够,512MB 跑不起来?

K3s 本身占用约 150-200MB 内存。如果 512MB 还是紧张,可以禁用内置的 traefik 和 local-path-provisioner:

curl -sfL https://get.k3s.io | sh -s - --disable traefik --disable local-path-provisioner

然后用外部方案替代。

Q:如何备份集群数据?

K3s 默认用 etcd 存储数据,备份很简单:

sudo k3s etcd-snapshot save /tmp/k3s-backup.tar.gz

恢复:

sudo k3s etcd-snapshot restore /tmp/k3s-backup.tar.gz

Q:多节点集群怎么搭建?

主节点安装完成后,从节点用 token 加入:

# 在主节点获取 token
sudo cat /var/lib/rancher/k3s/server/node-token

# 在从节点执行(替换 TOKEN 和 MASTER_IP)
curl -sfL https://get.k3s.io | sh -s - server --token TOKEN --server https://MASTER_IP:6443

Q:如何清理 K3s?

/usr/local/bin/k3s-uninstall.sh

现在你的 VPS 上跑着一个完整的 Kubernetes 集群了。后续可以部署各种应用:Nginx、Redis、PostgreSQL、你自己的 Web 服务都行。要不要试试部署一个你自己的项目?

这篇文章对你有帮助吗?