通过Ingress进行灰度发布

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 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 升级问题提供了一种解决方案。
897 0
|
11月前
|
Kubernetes 测试技术 微服务
Kruise Rollout 全链路灰度实践
OpenKruise 是一个基于 Kubernetes 的扩展套件,主要聚焦于云原生应用的自动化,比如部署、发布、运维以及可用性防护。本文介绍通过 OpenKruise 构建自动化运维的方式实现基于 Istio 的全链路灰度功能。
|
Kubernetes Cloud Native Java
灰度发布、蓝绿部署、金丝雀都是啥?
在滚动部署中,应用的新版本逐步替换旧版本。实际的部署发生在一段时间内。在此期间,新旧版本会共存,而不会影响功能和用户体验。这个过程可以更轻易的回滚和旧组件不兼容的任何新组件。
灰度发布、蓝绿部署、金丝雀都是啥?
|
Prometheus Kubernetes 负载均衡
Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
|
运维 Kubernetes 负载均衡
kubernetes 灰度发布
kubernetes 灰度发布
496 1
|
Kubernetes 负载均衡 监控
Kubernetes 实现灰度和蓝绿发布
Kubernetes 实现灰度和蓝绿发布
1173 1
|
设计模式 Kubernetes 测试技术
干货分享|使用 Istio 实现灰度发布
Kubernetes 作为基础平台,提供了强大的容器编排能力。但是在其上部署业务和服务治理上,仍然会面对一些复杂性和局限性。在服务治理上,已经有许多成熟的 ServiceMesh 框架用于扩充其能力,如 Istio、Linkerd、Dapr 等。本文将主要介绍如何使用 Istio 扩充 Kubernetes 灰度发布的能力。
干货分享|使用 Istio 实现灰度发布
|
Prometheus Kubernetes 监控
Linkerd 金丝雀部署与 A/B 测试
Linkerd 金丝雀部署与 A/B 测试
185 0
Linkerd 金丝雀部署与 A/B 测试
|
4月前
|
Kubernetes API Nacos
基于Ingress-APISIX网关实现全链路灰度
本文介绍了通过将 APISIX 提供的灵活的路由能力以及 MSE 提供的全链路灰度能力结合,可以在不需要修改任何业务代码的情况下,轻松实现全链路灰度能力。
基于Ingress-APISIX网关实现全链路灰度
|
域名解析 负载均衡 应用服务中间件
使用 Ingress 实现金丝雀发布
Service 是基于四层协议来实现的路由转发,常用于 NodePort 方式来对外提供服务,但是 当我们的业务模块较多时,使用 NodePort 的方式便不利于管理。 所以,我们可以使用 Ingress Controller 来通过匹配 URL 的方式实现 HTTP/HTTPS 代理。
574 0
使用 Ingress 实现金丝雀发布