香港服务器k3s从零到生产:轻量Kubernetes完整部署与应用编排实战
Kubernetes 功能强大但安装复杂——标准 K8s 集群光是控制平面就需要 etcd + API Server + Scheduler + Controller Manager 四个组件。k3s 是 Rancher 出品的轻量 K8s 发行版,单二进制文件约 70MB,内存占用约 512MB,安装只需一行命令,完全兼容标准 K8s API,是香港中小规模服务器集群的最佳选择。
一、k3s vs K8s vs Docker Swarm
| 维度 | k3s | 标准 K8s | Docker Swarm |
|---|---|---|---|
| 安装难度 | 极低(1条命令) | 高 | 极低 |
| 内存占用(Control Plane) | ~512MB | ~2GB+ | 极低 |
| K8s API 兼容 | ✅ 100% | ✅ | ❌ |
| Helm 支持 | ✅ | ✅ | ❌ |
| 生态系统 | 完整 K8s 生态 | 完整 | 有限 |
| 自动扩缩容(HPA) | ✅ | ✅ | ❌ |
| 适合场景 | 中小规模生产,边缘计算 | 大规模生产 | 已有 Docker 经验的简单集群 |
二、安装 k3s(Server 节点)
<code"># 在第一台香港服务器(Master)上安装 k3s curl -sfL https://get.k3s.io | sh -s - \ --write-kubeconfig-mode 644 \ --disable traefik \ # 使用更新版本的 Traefik(后面单独安装) --disable servicelb \ # 使用 MetalLB 或 NodePort --node-ip 10.0.0.1 \ # 服务器内网 IP --advertise-address 10.0.0.1 \ --tls-san 10.0.0.1 \ # 可以从这个 IP 访问 API Server --tls-san k3s.yourdomain.com # 可以从这个域名访问 # 验证安装 kubectl get nodes kubectl get pods -A # 获取 Node Token(Agent 节点加入集群用) cat /var/lib/rancher/k3s/server/node-token
<code"># 在 Agent 节点(Worker)上加入集群 # 在每台 Worker 服务器上执行: curl -sfL https://get.k3s.io | K3S_URL=https://10.0.0.1:6443 \ K3S_TOKEN=your_node_token \ sh -s - \ --node-ip 10.0.0.2 # 在 Master 上查看集群状态 kubectl get nodes -o wide # NAME STATUS ROLES AGE # k3s-master Ready control-plane,master 5m # k3s-worker1 Ready <none> 3m # k3s-worker2 Ready <none> 2m
三、安装 Helm(包管理器)
<code"># 安装 Helm 3 curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash helm version # 添加常用 Chart 仓库 helm repo add traefik https://helm.traefik.io/traefik helm repo add cert-manager https://charts.jetstack.io helm repo add longhorn https://charts.longhorn.io helm repo update
四、安装 Traefik Ingress Controller
<code"># 安装 Traefik(使用 Helm)
helm install traefik traefik/traefik \
--namespace traefik \
--create-namespace \
--set service.type=LoadBalancer \
--set ports.web.redirectTo.port=websecure \ # HTTP 重定向到 HTTPS
--set logs.general.level=INFO
# 创建 Traefik Dashboard Ingress(内部访问)
cat << 'EOF' | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: traefik-dashboard
namespace: traefik
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.middlewares: traefik-basic-auth@kubernetescrd
spec:
rules:
- host: traefik.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: traefik
port:
number: 9000
EOF五、安装 cert-manager(自动 SSL)
<code"># 安装 cert-manager
helm install cert-manager cert-manager/cert-manager \
--namespace cert-manager \
--create-namespace \
--set installCRDs=true
# 创建 ClusterIssuer(Let's Encrypt 证书颁发者)
cat << 'EOF' | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@yourdomain.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: traefik
EOF六、部署实际应用
<code"># 部署 FastAPI 应用(完整示例)
cat << 'EOF' | kubectl apply -f -
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapi
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapi
template:
metadata:
labels:
app: myapi
spec:
containers:
- name: myapi
image: registry.yourdomain.com/myapp/backend:v1.0.0
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: myapp-secrets
key: database-url
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: myapi
spec:
selector:
app: myapi
ports:
- port: 80
targetPort: 8000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapi
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
tls:
- hosts:
- api.yourdomain.com
secretName: myapi-tls
rules:
- host: api.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapi
port:
number: 80
EOF七、持久化存储(Longhorn)
<code"># 安装 Longhorn(分布式块存储,跨节点持久化)
apt install -y open-iscsi nfs-common # 每台节点都需要
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace
# Longhorn 自动将跨节点存储的 PVC 挂载到 Pod
# StorageClass 示例
cat << 'EOF' | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myapp-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 10Gi
EOF八、常用运维命令
<code"># 查看 Pod 状态 kubectl get pods -A kubectl describe pod myapi-xxxxx # 查看日志 kubectl logs -f myapi-xxxxx kubectl logs -f myapi-xxxxx --previous # 上次崩溃的日志 # 扩缩容 kubectl scale deployment myapi --replicas=5 # 滚动更新(零停机) kubectl set image deployment/myapi myapi=registry.yourdomain.com/myapp/backend:v2.0.0 kubectl rollout status deployment/myapi kubectl rollout undo deployment/myapi # 回滚 # 查看资源使用 kubectl top nodes kubectl top pods
九、总结
k3s 让 Kubernetes 进入了中小团队可以真实落地的范畴——2分钟安装、512MB 内存起步、完整 K8s API 兼容。香港服务器集群上运行 k3s,通过 Traefik + cert-manager 实现自动 HTTPS,通过 Longhorn 实现跨节点持久化存储,一套完整的生产级容器编排平台就此落成,为后续的微服务架构和 AI 应用部署打下基础。