想在 VPS 上学习 Kubernetes、跑个人项目或给小团队搭一套轻量集群,K3s 通常比从零安装标准 Kubernetes 更省事。它把 containerd、Flannel、CoreDNS、Traefik、ServiceLB 和本地存储等组件整合起来,单个 Server 节点安装后就是一套可运行工作负载的 Kubernetes 集群。
但“轻量”不等于“无需运维”。单节点不是高可用,local-path 也不会自动把数据复制到其他机器。本文从 VPS 选择开始,完整走一遍安装、应用发布、域名 HTTPS、持久化、备份、扩容和排错。
| 方案 | 适合场景 | 主要代价 |
|---|---|---|
| Docker Compose | 单机部署几个服务、追求简单 | 缺少 Kubernetes 调度与生态 |
| 单节点 K3s | 学习 K8s、小型应用、CI 测试环境 | 节点宕机即整体中断 |
| 多节点 K3s | 需要扩容、滚动发布或节点冗余 | 网络、存储、备份更复杂 |
| 标准 Kubernetes | 大规模团队和完整云原生平台 | 安装与维护成本最高 |
如果只是运行博客、数据库和几个容器,VPS Docker Compose 生产配置指南通常更直接。需要使用 Helm、Ingress、Operator、滚动更新或学习 Kubernetes API 时,再选择 K3s。
K3s 官方最低建议是 1 核 CPU、512MB 内存,推荐至少 2 核、1GB 内存,并建议使用 SSD。不过这个数字只够集群自身和极轻工作负载,实际购买可按下面起步:
| 用途 | 建议配置 |
|---|---|
| 学习和临时测试 | 2 核 2GB、30GB SSD |
| 个人网站和轻量 API | 2–4 核 4GB、60GB NVMe |
| 数据库、监控、多应用 | 4 核 8GB+、100GB NVMe |
不确定配置时先看 VPS 配置怎么选。本文以 Ubuntu 24.04、拥有公网 IPv4 的 KVM VPS 为例。安装前确认:
- 域名 A 记录已指向 VPS;
- TCP 80、443 对公网开放;
- 单节点无需对公网开放 6443,远程管理优先走 VPN 或限制源 IP;
- 多节点时只允许节点私网访问 TCP 6443、UDP 8472 和 TCP 10250;
- UDP 8472 是 Flannel VXLAN 端口,绝不能向整个互联网开放。
先更新系统并检查 80/443 是否被占用:
sudo apt update
sudo apt upgrade -y
sudo ss -lntup | grep -E ':(80|443|6443)\b' || true
若已有 Nginx、Caddy 或 Docker 容器占用 80/443,默认 Traefik 会无法绑定端口。先按 VPS 端口被占用排查指南确认进程,不要直接杀掉未知服务。
使用官方安装脚本:
curl -sfL https://get.k3s.io | sh -
安装器会创建并启用 k3s 服务,同时安装 kubectl、crictl、ctr、停止脚本和卸载脚本。检查状态:
sudo systemctl status k3s --no-pager
sudo k3s kubectl get nodes -o wide
sudo k3s kubectl get pods -A
节点应为 Ready,kube-system 中的 CoreDNS、Traefik、metrics-server、local-path-provisioner 等 Pod 应逐步进入 Running 或 Completed。
管理员 kubeconfig 位于 /etc/rancher/k3s/k3s.yaml,默认权限为 600。最安全的做法是继续使用:
sudo k3s kubectl get nodes
如需在个人账号下运行 kubectl,可复制 kubeconfig 并收紧权限:
mkdir -p "$HOME/.kube"
sudo cp /etc/rancher/k3s/k3s.yaml "$HOME/.kube/config"
sudo chown "$(id -u):$(id -g)" "$HOME/.kube/config"
chmod 600 "$HOME/.kube/config"
kubectl get nodes
不要把 kubeconfig 发到聊天工具或提交到 Git,它包含集群管理员凭据。
创建 whoami.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
spec:
replicas: 2
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami:latest
ports:
- containerPort: 80
resources:
requests:
cpu: 20m
memory: 32Mi
limits:
cpu: 200m
memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
selector:
app: whoami
ports:
- port: 80
targetPort: 80
应用并检查:
kubectl apply -f whoami.yaml
kubectl rollout status deployment/whoami
kubectl get pods,svc
生产环境不要长期使用浮动的 latest 镜像,应固定经过验证的版本或 digest。
K3s 默认部署 Traefik,并由 ServiceLB 使用主机的 80/443 端口。先创建 HTTP Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami
spec:
ingressClassName: traefik
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: whoami
port:
number: 80
kubectl apply -f ingress.yaml
kubectl get ingress
curl -I http://app.example.com
Traefik 负责接入 HTTPS,但证书仍需由你提供。若已有证书,可创建 TLS Secret:
kubectl create secret tls app-example-tls \
--cert=fullchain.pem \
--key=privkey.pem
然后在 Ingress 的 spec 中加入:
tls:
- hosts:
- app.example.com
secretName: app-example-tls
需要自动签发和续期时,可安装 cert-manager,再创建 ACME Issuer/ClusterIssuer。不要手工修改 /var/lib/rancher/k3s/server/manifests/traefik.yaml,K3s 启动时会恢复默认内容;Traefik 自定义应使用额外的 HelmChartConfig。
如果你更熟悉独立反代,也可安装时禁用 Traefik,再参考 Caddy 自动 HTTPS 指南,但必须在首次安装配置中明确 --disable=traefik,避免端口冲突。
K3s 自带 Local Path Provisioner,可直接创建 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-path
resources:
requests:
storage: 5Gi
kubectl apply -f pvc.yaml
kubectl get pvc,pv
local-path 使用 Pod 所在节点的本地磁盘。Pod 重建后数据通常仍在,但节点永久损坏时,数据不会自动出现在另一节点。因此:
- 单节点可用于轻量应用,但必须做异机备份;
- 多节点数据库不要把 local-path 当成共享或复制存储;
- 需要跨节点持久化时,评估 Longhorn、云盘 CSI 或外部托管数据库;
- 扩容前确认 PVC 的访问模式、拓扑和恢复流程。
默认单 Server 节点使用 SQLite。官方要求备份:
/var/lib/rancher/k3s/server/db/;/var/lib/rancher/k3s/server/token;- 应用清单、Helm values、Secret 的安全副本;
- local-path、数据库和用户上传文件等业务数据。
为了获得一致副本,可在维护窗口停止 K3s 后复制数据库和 token:
sudo systemctl stop k3s
sudo tar -C /var/lib/rancher/k3s/server \
-czf /root/k3s-control-plane-$(date +%F).tar.gz db token
sudo systemctl start k3s
sudo k3s kubectl get nodes
控制面备份不等于业务数据备份;PVC 内容必须另行备份到另一台机器或对象存储。完整策略可参考 VPS 备份恢复演练指南。
只有使用嵌入式 etcd 时,才使用 k3s etcd-snapshot 流程;默认 SQLite 单节点不要照搬 etcd 快照命令。无论哪种 datastore,恢复都需要原 server token,否则加密数据可能无法使用。
在 Server 上读取加入 Token:
sudo cat /var/lib/rancher/k3s/server/node-token
在新 VPS 上运行:
curl -sfL https://get.k3s.io | \
K3S_URL=https://SERVER_PRIVATE_IP:6443 \
K3S_TOKEN='替换为真实Token' sh -
每台机器必须使用唯一 hostname。随后在 Server 检查:
sudo k3s kubectl get nodes -o wide
增加 Agent 只增加计算容量,并不会让控制平面高可用。真正的 HA 需要多 Server 节点配合嵌入式 etcd 或外部数据库,也需要重新设计负载入口与持久化。
升级前先备份,并记录原安装参数。官方支持用相同配置重新运行安装脚本升级;若忘记原有环境变量或参数,可能丢失配置。稳定业务还应遵循 Kubernetes 版本偏差策略,不要跨过中间小版本。
常用排查命令:
kubectl get nodes
kubectl get pods -A -o wide
kubectl describe pod POD_NAME
kubectl logs POD_NAME --previous
sudo journalctl -u k3s -n 200 --no-pager
kubectl top nodes
kubectl top pods -A
Pending:看 CPU/内存请求、PVC、污点和调度事件;CrashLoopBackOff:看当前日志、--previous日志、环境变量和健康检查;- Ingress 访问失败:检查 DNS、80/443、安全组、Traefik Pod 和 Ingress backend;
- 节点
NotReady:检查k3s/k3s-agent日志、6443 连通性、时间同步和 Flannel 防火墙; - 指标为空:确认 metrics-server 正常,并允许节点间 TCP 10250。
长期运行可结合 Prometheus + Grafana 监控方案观察节点、Pod、磁盘和证书到期时间。
Server 节点的卸载命令是:
sudo /usr/local/bin/k3s-uninstall.sh
它会停止 K3s,并删除本地集群 datastore、Local Storage PV 数据、节点配置及相关脚本。执行前必须确认控制面和业务数据均已在异机验证可恢复;这不是普通的“停止服务”命令。
可以用于学习和极轻工作负载,但要限制 Pod 资源并观察内存。要同时运行数据库、监控和多个应用,建议从 4GB 或 8GB 起步。
不算。它只有一个控制平面和一个故障域,VPS 宕机时整个集群不可用。
不会。默认 Traefik 提供 80/443 入口,但证书需通过 TLS Secret、cert-manager 或其他证书流程配置。
不会。Agent 增加计算容量,local-path 仍是节点本地存储。数据库和上传文件需要独立的跨节点存储或备份方案。
先为真实工作负载设置 requests/limits,再完成异机备份和恢复演练,最后才考虑多节点。公网端口应遵循最小开放原则;若改防火墙,先阅读 UFW 防火墙自救清单,避免把自己锁在服务器外。
