K8S发布策略-金丝雀部署(Canary Deployment)

之前讲了k8s的发布策略:滚动更新蓝绿部署,今天来说下k8s的发布策略: 金丝雀部署

  金丝雀部署又称为灰度发布、灰度更新 。就是将部分新版本发在旧的容器池里边,然后进行流量观察,比如10%的流量切到新服务上,90%的流量还在旧服务上。如果你想用更精细粒度的话精使用Istio。如下图:

image-20220224122504565
image-20220224122637086

金丝雀发布的优点:
1金丝雀发布允许引流一小部分流量到服务新版本,待验证通过后,逐步调大流量,直至切流完毕,

2 期间可伴随着新版本的扩容,旧版本的缩容操作,达到资源利用率最大化。

蓝绿部署的缺点:
1、流量无差别地导向新版本,可能会影响重要用户的体验;

2、发布周期长。

我们这次还是采用svc的方式进行部署的选择,但是这次我们在选择的时候我们只使用label,不使用版本号。新建 fffmo.com-app-v1-canary.yaml, 里边有10个pod支撑这个服务。

apiVersion: v1
kind: Service
metadata:
  name: fffmo.com-app
  labels:
    app: fffmo.com-app
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: http
  selector:
    app: fffmo.com-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fffmo.com-app-v1
  labels:
    app: fffmo.com-app
spec:
  replicas: 10
  selector:
    matchLabels:
      app: fffmo.com-app
      version: v1.0.0
  template:
    metadata:
      labels:
        app: fffmo.com-app
        version: v1.0.0
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9101"
    spec:
      containers:
      - name: fffmo.com-app
        image: containersol/k8s-deployment-strategies
        ports:
        - name: http
          containerPort: 8080
        - name: probe
          containerPort: 8086
        env:
        - name: VERSION
          value: v1.0.0
        livenessProbe:
          httpGet:
            path: /live
            port: probe
          initialDelaySeconds: 5
          periodSeconds: 5
        readinessProbe:
          httpGet:
            path: /ready
            port: probe
          periodSeconds: 5

  接下来,我们创建v2版本 fffmo.com-app-v2-canary.yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fffmo.com-app-v2
  labels:
    app: fffmo.com-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fffmo.com-app
      version: v2.0.0
  template:
    metadata:
      labels:
        app: fffmo.com-app
        version: v2.0.0
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9101"
    spec:
      containers:
      - name: fffmo.com-app
        image: containersol/k8s-deployment-strategies
        ports:
        - name: http
          containerPort: 8080
        - name: probe
          containerPort: 8086
        env:
        - name: VERSION
          value: v2.0.0
        livenessProbe:
          httpGet:
            path: /live
            port: probe
          initialDelaySeconds: 5
          periodSeconds: 5
        readinessProbe:
          httpGet:
            path: /ready
            port: probe
          periodSeconds: 5

  我们说一下要执行的步骤:

  1. 启动V1的服务版本:10个复本。

  2. 启动V2的服务版本:1个复本。

  3. 观察V2流量正常的情况的话,那么启动V2的10个复本。

  4. 删除V1的10个复本,流量全部到V2上。

  启动V1服务,查看服务是否正确,然后观察一下服务。

kubectl apply -f fffmo.com-app-v1-canary.yaml
kubectl get svc -l app=fffmo.com-app
curl http://127.0.0.1:30760
watch kubectl get pod

  新打开容器,执行命令,启动V2服务。 上边的watch将观察到新增了1个pod, 此时共有11个pod, 2.0.0的版本已经上来了。

kubectl apply -f fffmo.com-app-v2-canary.yaml
hile sleep 0.1; do curl http://127.0.0.1:30760; done
Host: fffmo.com-app-v1-7b4874cd75-bhxbp, Version: v1.0.0
Host: fffmo.com-app-v1-7b4874cd75-wmcqc, Version: v1.0.0
Host: fffmo.com-app-v1-7b4874cd75-tsh2s, Version: v1.0.0
Host: fffmo.com-app-v1-7b4874cd75-ml58j, Version: v1.0.0
Host: fffmo.com-app-v1-7b4874cd75-spsdv, Version: v1.0.0
Host: fffmo.com-app-v2-f885c8d45-mc2fx, Version: v2.0.0

  此时我们观察版本2的服务是否正确,如果正确,那么我们将版本2扩展到10个副本。

kubectl scale --replicas=10 deploy fffmo.com-app-v2

  这个时候版本1和版本2一样了。我们再将版本1的pod给清除掉

kubectl delete deploy fffmo.com-app-v1

  如果没有问题可以清理所有服务

kubectl delete all -l app=fffmo.com-app

  k8s的发布策略:金丝雀部署总结:

  1. 因为有部分版本在线上运行,我们能够对其日志进行观察和追踪、定位问题。

  2. 如果有问题也能快速将新版本清理掉

  3. 如果没有问题,相比于蓝绿的话,发布较慢。

  4. 对代码信心不足的情况可以采用此方法,影响范围较小。

赞(1) 打赏
特别声明:除特殊标注,本站文章均为原创,遵循CC BY-NC 3.0,转载请注明出处。三伏磨 » K8S发布策略-金丝雀部署(Canary Deployment)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏