香港服务器k3s从零到生产:轻量Kubernetes完整部署与应用编排实战

香港服务器k3s从零到生产:轻量Kubernetes完整部署与应用编排实战

Kubernetes 功能强大但安装复杂——标准 K8s 集群光是控制平面就需要 etcd + API Server + Scheduler + Controller Manager 四个组件。k3s 是 Rancher 出品的轻量 K8s 发行版,单二进制文件约 70MB,内存占用约 512MB,安装只需一行命令,完全兼容标准 K8s API,是香港中小规模服务器集群的最佳选择。


一、k3s vs K8s vs Docker Swarm

维度k3s标准 K8sDocker 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 应用部署打下基础。

Telegram