概述

通过 Kubernetes 的滚动更新策略实现金丝雀发布,逐步将应用从 v1.0 版本升级到 v2.0 版本。

环境准备

1. 创建 Service 资源

# 创建集群内部访问的 Service 资源
# 名称为 deployment-demo,端口映射:Service 80 → Pod 80
kubectl create service clusterip deployment-demo --tcp=80:80

2. 验证 Service 配置

# 获取 Kubernetes 中名为deployment-demo的 Deployment 资源的详细配置信息,并以 YAML 格式输出
kubectl get deployment deployment-demo -o yaml

部署初始版本

创建 Deployment 配置文件

创建 6.deployment.yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deployment-demo
  name: deployment-demo
spec:
  replicas: 10
  selector:
    matchLabels:
      app: deployment-demo
  template:
    metadata:
      labels:
        app: deployment-demo
    spec:
      containers:
      - image: wangyanglinux/myapp:v1.0  # 实际为 nginx 服务
        name: deployment-demo-container

部署应用

# 运行 deployment.yaml 文件
# 创建一个包含 10 个 Pod 副本的 Deployment
kubectl apply -f 6.deployment.yaml

配置滚动更新策略

设置更新参数

# 修改滚动更新策略
kubectl patch deployment deployment-demo -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'

参数说明:

  • maxSurge: 1 - 集群中 Pod 的最大数量可以超出期望副本数(replicas)的上限为 1

  • maxUnavailable: 0 - 升级过程中,集群中不可用 Pod 的最大数量为 0(即不允许任何 Pod 不可用)

  • 金丝雀发布实施

    步骤 1:监控服务状态

    在第一个终端窗口执行:

  • # 死循环监视 deployment-demo 这个 Service 的 IP
    # 10.4.243.153 为 Service 的 IP 地址
    while true;do curl 10.4.243.153;done

  • 步骤 2:执行金丝雀发布

    在第二个终端窗口执行:

  • kubectl patch deployment deployment-demo --patch '{
      "spec": {
        "strategy": {
          "rollingUpdate": {
            "maxSurge": 1,
            "maxUnavailable": 0
          }
        },
        "template": {
          "spec": {
            "containers": [{
              "name": "deployment-demo-container",
              "image": "wangyanglinux/myapp:v2.0"
            }]
          }
        }
      }
    }' && kubectl rollout pause deployment/deployment-demo
     

  • 观察发布效果

    动态查看金丝雀发布

    在第三个终端窗口中,可以动态观察 Pod 的状态变化。

  • 发布效果

    通过此方法可以实现:

  • 逐步将流量从 v1.0 版本切换到 v2.0 版本

  • 此时v2.0 版本相当于金丝雀(少量更新)

  • 确保在更新过程中服务始终可用

  • 如果新版本有问题,可以快速回滚(kubectl rollout undo deployment/deployment-demo)

  • 实现零停机部署

  • 后续操作

    根据测试结果决定是否继续发布或回滚:

  • # 如果测试通过,继续完成发布
    kubectl rollout resume deploy/deployment-demo

    # 如果测试失败,回滚到上一版本
    kubectl rollout undo deployment/deployment-demo

  • 这种金丝雀发布策略确保了应用更新的安全性和可靠性,是生产环境中推荐的部署方式。

更多推荐