如何蓝绿部署?
解读
在国内互联网/云原生面试中,“蓝绿部署”常被用来考察候选人对零停机发布、回滚策略、流量切换的理解。Rust 岗位虽然偏重系统层,但云原生与微服务场景同样大量采用 Rust(如 TikTok 的 Rust 网关、蚂蚁的 Rust 区块链节点)。面试官期望你:
- 用Rust 视角说明如何构建可蓝绿部署的制品(静态链接、单二进制、无状态)。
- 给出国内主流基础设施(阿里云 ACK、腾讯云 TKE、华为云 CCE、Nginx/Ingress + K8s)下的落地步骤。
- 强调编译期保证(无 GC、内存安全)对蓝绿快速切换的价值:二进制启停快、内存占用可预测、无悬垂指针导致的热升级失败。
知识点
- 蓝绿部署定义:同时维护两套完全对等的生产环境(蓝=旧,绿=新),通过一次性流量切换完成发布,失败时秒级回滚。
- Rust 制品特征:
cargo build --release生成单文件静态二进制(musl 目标),<10 ms 冷启动,镜像 <10 MB,天然适合** sidecar 或 DaemonSet 快速替换**。 - 国内云原生流量切换手段:
- K8s Service Label 瞬时切换(selector version=blue→green)
- Ingress-Nginx Canary annotation(
nginx.ingress.kubernetes.io/canary-weight: 100) - 阿里 SLB 权重调零/调百
- Rust 健康检查:内置
/health接口,使用tokio::signal监听 SIGTERM,graceful 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。
拓展思考
-
Rust 无状态服务如何与有状态 TiDB 一起做蓝绿+灰度?
答:在事务层使用兼容模式(新代码只加列不加非空约束),并借助 TiDB 的闪回功能(FLASHBACK TABLE TO TIMESTAMP)在回滚时快速恢复误写数据。 -
边缘计算场景(KubeEdge、OpenYurt)节点带宽低,10 MB 静态 Rust 二进制比 100 MB JVM 镜像节省80% 拉取时间,蓝绿切换可在弱网环境 30 s 内完成。
-
WebAssembly 蓝绿:Rust 编译为 wasm32-wasi,在Service Mesh 数据面(如 WasmPlugin)做蓝绿热替换,利用 Proxy-Wasm ABI 实现毫秒级切换,无需重建 Pod,适合金融高频交易网关。
-
国内合规:等保 2.0 要求发布可审计,Rust 的可重现编译(
cargo auditable+reproducible-build)可生成SBOM 清单,与阿里云 ActionTrail 对接,满足发布追溯要求。