如何蓝绿部署?

解读

在国内互联网/云原生面试中,“蓝绿部署”常被用来考察候选人对零停机发布、回滚策略、流量切换的理解。Rust 岗位虽然偏重系统层,但云原生与微服务场景同样大量采用 Rust(如 TikTok 的 Rust 网关、蚂蚁的 Rust 区块链节点)。面试官期望你:

  1. Rust 视角说明如何构建可蓝绿部署的制品(静态链接、单二进制、无状态)。
  2. 给出国内主流基础设施(阿里云 ACK、腾讯云 TKE、华为云 CCE、Nginx/Ingress + K8s)下的落地步骤
  3. 强调编译期保证(无 GC、内存安全)对蓝绿快速切换的价值:二进制启停快、内存占用可预测、无悬垂指针导致的热升级失败。

知识点

  • 蓝绿部署定义:同时维护两套完全对等的生产环境(蓝=旧,绿=新),通过一次性流量切换完成发布,失败时秒级回滚
  • Rust 制品特征cargo build --release 生成单文件静态二进制(musl 目标),<10 ms 冷启动镜像 <10 MB,天然适合** sidecar 或 DaemonSet 快速替换**。
  • 国内云原生流量切换手段
    • K8s Service Label 瞬时切换(selector version=blue→green
    • Ingress-Nginx Canary annotationnginx.ingress.kubernetes.io/canary-weight: 100
    • 阿里 SLB 权重调零/调百
  • Rust 健康检查:内置 /health 接口,使用 tokio::signal 监听 SIGTERMgraceful shutdown 在**<3 s** 完成,满足国内 SLA 99.95% 要求。
  • 数据兼容性:Rust 服务若依赖MySQL/TiDB,需向前兼容 schema(新增列可空、枚举新增值放最后),否则回滚时新数据无法被旧代码读取。

答案

步骤 1:构建绿色版本

# 国内 CI 常用 GitLab-Runner 或阿里云效
cargo build --release --target x86_64-unknown-linux-musl
docker build -t registry.cn-hangzhou.aliyuncs.com/abc/api:1.2.0-green .
docker push registry.cn-hangzhou.aliyuncs.com/abc/api:1.2.0-green

关键点:使用 musl 目标生成完全静态链接二进制,无系统 libc 差异,在蓝绿两套节点上行为一致。

步骤 2:部署绿色环境

# green-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-green
spec:
  replicas: 3
  selector:
    matchLabels: { app: api, version: green }
  template:
    metadata:
      labels: { app: api, version: green }
    spec:
      containers:
      - name: api
        image: registry.cn-hangzhou.aliyuncs.com/abc/api:1.2.0-green
        readinessProbe:
          httpGet: { path: /health, port: 8080 }
          initialDelaySeconds: 2    # Rust 冷启动 <1 s,可设短
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh","-c","sleep 3"]  # 保证 graceful

步骤 3:验证

kubectl apply -f green-deploy.yaml
# 等待 Pod Ready 3/3
kubectl get pods -l version=green

步骤 4:流量切换(零停机)

# 方式 A:K8s Service 标签切换(最通用)
kubectl patch svc api -p '{"spec":{"selector":{"version":"green"}}}'

# 方式 B:Ingress-Nginx 权重(国内云厂商默认 Ingress)
kubectl annotate ingress api nginx.ingress.kubernetes.io/canary-weight=100
kubectl annotate ingress api nginx.ingress.kubernetes.io/canary-by-header=""

步骤 5:观察

  • Prometheus 监控:Rust 暴露的 api_http_requests_total 在 30 s 内无 5xx
  • 日志:Loki/SLS 无 ERROR 日志
  • 回滚预案:若失败,一条命令回滚
kubectl patch svc api -p '{"spec":{"selector":{"version":"blue"}}}'

整个过程 RTO <30 s,RPO=0

拓展思考

  1. Rust 无状态服务如何与有状态 TiDB 一起做蓝绿+灰度
    答:在事务层使用兼容模式(新代码只加列不加非空约束),并借助 TiDB 的闪回功能FLASHBACK TABLE TO TIMESTAMP)在回滚时快速恢复误写数据

  2. 边缘计算场景(KubeEdge、OpenYurt)节点带宽低,10 MB 静态 Rust 二进制100 MB JVM 镜像节省80% 拉取时间,蓝绿切换可在弱网环境 30 s 内完成

  3. WebAssembly 蓝绿:Rust 编译为 wasm32-wasi,在Service Mesh 数据面(如 WasmPlugin)做蓝绿热替换,利用 Proxy-Wasm ABI 实现毫秒级切换,无需重建 Pod,适合金融高频交易网关

  4. 国内合规:等保 2.0 要求发布可审计,Rust 的可重现编译cargo auditable + reproducible-build)可生成SBOM 清单,与阿里云 ActionTrail 对接,满足发布追溯要求。