通过Ingress进行灰度发布

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。

通过Ingress进行灰度发布


1. 创建实验资源

开始实验之前,您需要先创建云服务器ECS和ACK集群资源。

说明:在实验资源创建过程中,ECS会安装命令行工具kubectl并连接ACK集群,方便您在后续实验中通过ECS中的Kubernetes命令行工具kubectl来管理ACK集群以及应用。

  1. 在实验室页面,单击创建资源
  2. (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、用户信息等)。

说明:资源创建过程需要7~10分钟。

2. 部署Deployment V1应用

本步骤指导你如何部署Deployment V1应用,并使用Ingress实现Deployment V1应用的外部访问。

  1. 执行如下命令,创建名为app-v1.yaml的YAML文件。
vi app-v1.yaml
  1. i键进入编辑模式,将如下代码复制到文件中。
apiVersion: v1
kind: Service
metadata:
  name: my-app-v1
  labels:
    app: my-app
spec:
  ports:
  - name: http
    port: 80
    targetPort: http
  selector:
    app: my-app
    version: v1.0.0
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-v1
  labels:
    app: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
      version: v1.0.0
  template:
    metadata:
      labels:
        app: my-app
        version: v1.0.0
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9101"
    spec:
      containers:
      - name: my-app
        image: registry.cn-hangzhou.aliyuncs.com/containerdemo/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
  1. ECS键退出编辑模式,输入:wq,然后回车保存并退出文件。
  2. 执行如下命令,部署Deployement V1应用。
kubectl apply -f app-v1.yaml
  1. 执行如下命令,创建名为ingress-v1.yaml的Ingress YAML文件。
vi ingress-v1.yaml
  1. i键进入编辑模式,将如下代码复制到文件中,并将hots参数中的集群id修改为k8s集群id。

说明:您可在云产品资源列表中查看k8s集群id。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  rules:
  - host: my-app.集群id.cn-shanghai.alicontainer.com
    http:
      paths:
      - backend:
          service:
            name: my-app-v1
            port:
              number: 80
        path: /
        pathType: Prefix
  1. ECS键退出编辑模式,输入:wq,然后回车保存并退出文件。
  2. 执行如下命令,部署Ingress资源。
kubectl apply -f ingress-v1.yaml
  1. 执行如下命令,进行测试。

说明:您可在云产品资源列表中查看k8s集群id。

curl my-app.集群id.cn-shanghai.alicontainer.com

返回结果如下,表示您已成功访问到Deployment V1应用。

3. 部署Deployment V2应用

本步骤指导你如何部署Deployment V2应用。

  1. 执行如下命令,创建名为app-v2.yaml的YAML文件。
vi app-v2.yaml
  1. i键进入编辑模式,将如下代码复制到文件中。
apiVersion: v1
kind: Service
metadata:
  name: my-app-v2
  labels:
    app: my-app
spec:
  ports:
  - name: http
    port: 80
    targetPort: http
  selector:
    app: my-app
    version: v2.0.0
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-v2
  labels:
    app: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
      version: v2.0.0
  template:
    metadata:
      labels:
        app: my-app
        version: v2.0.0
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9101"
    spec:
      containers:
      - name: my-app
        image: registry.cn-hangzhou.aliyuncs.com/containerdemo/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. ECS键退出编辑模式,输入:wq,然后回车保存并退出文件。
  2. 执行如下命令,部署Deployement V2应用。
kubectl apply -f app-v2.yaml

4. 按照权重策略灰度到Deployment V2应用

本步骤指导你如何按照权重策略灰度到Deployment V2应用。

  1. 执行如下命令,创建名为ingress-v2-canary-weigth.yaml的YAML文件。
vi ingress-v2-canary-weigth.yaml
  1. i键进入编辑模式,将如下代码复制到文件中,并将hots参数中的集群id修改为k8s集群id。

说明:您可在云产品资源列表中查看k8s集群id。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-canary
  labels:
    app: my-app
  annotations:
    # Enable canary and send 10% of traffic to version 2
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
  rules:
  - host: my-app.集群id.cn-shanghai.alicontainer.com
    http:
      paths:
      - backend:
          service:
            name: my-app-v2
            port:
              number: 80
        path: /
        pathType: Prefix
  1. ECS键退出编辑模式,输入:wq,然后回车保存并退出文件。
  2. 执行如下命令,部署Ingress资源。
kubectl apply -f ingress-v2-canary-weigth.yaml
  1. 执行如下命令,并将命令中的集群id修改为k8s集群id,进行测试。

说明:您可在云产品资源列表中查看k8s集群id。

while sleep 0.1;do curl my-app.集群id.cn-shanghai.alicontainer.com; done
  1. 返回结果如下,表示已成功按照权重策略灰度到Deployment V2应用。按CTRL+C键退出。

5. 按照Header策略灰度到Deployment V2应用

本步骤指导你如何按照Header策略灰度到Deployment V2应用。

  1. 执行如下命令,创建名为ingress-v2-canary-header.yaml的YAML文件。
vi ingress-v2-canary-header.yaml
  1. i键进入编辑模式,将如下代码复制到文件中,并将hots参数中的集群id修改为k8s集群id。

说明:您可在云产品资源列表中查看k8s集群id。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-canary
  labels:
    app: my-app
  annotations:
    # Enable canary and send traffic with headder x-app-canary to version 2
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-app-canary"
    nginx.ingress.kubernetes.io/canary-by-header-value: "true"
spec:
  rules:
  - host: my-app.集群id.cn-shanghai.alicontainer.com
    http:
      paths:
      - backend:
          service:
            name: my-app-v2
            port:
              number: 80
        path: /
        pathType: Prefix
  1. ECS键退出编辑模式,输入:wq,然后回车保存并退出文件。
  2. 执行如下命令,部署Ingress资源。
kubectl apply -f ingress-v2-canary-header.yaml
  1. 执行如下命令,并将命令中的集群id修改为k8s集群id,进行测试。

说明:您可在云产品资源列表中查看k8s集群id。

curl my-app.集群id.cn-shanghai.alicontainer.com

返回结果如下,访问到Deployment V1应用。

  1. 执行如下命令,并将命令中的集群id修改为k8s集群id,设置新的header。

说明:您可在云产品资源列表中查看k8s集群id。

curl my-app.集群id.cn-shanghai.alicontainer.com -H "x-app-canary: true"

返回结果如下,访问到Deployment V2应用,表示已成功按照Header策略灰度到Deployment V2应用。

实验地址:https://developer.aliyun.com/adc/scenario/878989bf8cb4456597f38dc259e20c65

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
监控 安全 Perl
Istio 升级新方式:金丝雀升级
Istio 1.6 推出了渐进式的升级方式:金丝雀升级,为相对头疼的 Istio 升级问题提供了一种解决方案。
954 0
|
2月前
|
Kubernetes 测试技术 微服务
结合阿里云ASM泳道与Kruise Rollout进行全链路灰度发布
本文将介绍如何结合阿里云ASM泳道与Kruise Rollout进行低成本,自动化的全链路灰度发布。
|
6月前
|
Kubernetes 监控 测试技术
在K8S中,如何实现金丝雀发布(灰度发布)?蓝绿发布?
在K8S中,如何实现金丝雀发布(灰度发布)?蓝绿发布?
|
Kubernetes Cloud Native Java
灰度发布、蓝绿部署、金丝雀都是啥?
在滚动部署中,应用的新版本逐步替换旧版本。实际的部署发生在一段时间内。在此期间,新旧版本会共存,而不会影响功能和用户体验。这个过程可以更轻易的回滚和旧组件不兼容的任何新组件。
灰度发布、蓝绿部署、金丝雀都是啥?
|
Kubernetes 测试技术 UED
灰度(金丝雀)发布、蓝绿部署、滚动发布
灰度(金丝雀)发布、蓝绿部署、滚动发布
1500 0
|
Prometheus Kubernetes 负载均衡
Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
|
负载均衡 Kubernetes 前端开发
基于 Traefik 的加权灰度发布
众所周知,Traefik 是云原生生态中的一个爆款的反向代理和负载均衡器。我们无论如何定义、赞美它都不为过。毫无疑问,基于传统的反向代理组件而言,真正使 Traefik 与 Nginx,Haproxy 最为关键的不同之处在于其“开箱即用”的功能,即它的自适应和动态可配置性。不仅如此,相比较而言,Traefik 最为核心的部分可能是它做自动服务发现、灰度发布等能力。
439 0
|
运维 Kubernetes 负载均衡
kubernetes 灰度发布
kubernetes 灰度发布
541 1
|
Kubernetes 负载均衡 监控
Kubernetes 实现灰度和蓝绿发布
Kubernetes 实现灰度和蓝绿发布
1215 1
|
9月前
|
Kubernetes API Nacos
基于Ingress-APISIX网关实现全链路灰度
本文介绍了通过将 APISIX 提供的灵活的路由能力以及 MSE 提供的全链路灰度能力结合,可以在不需要修改任何业务代码的情况下,轻松实现全链路灰度能力。
基于Ingress-APISIX网关实现全链路灰度