通过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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
消息中间件 存储 网络协议
MQ(消息中间件)概述及 RabbitMQ 的基本介绍
MQ(消息中间件)概述及 RabbitMQ 的基本介绍
1527 0
|
运维 前端开发 应用服务中间件
jumpserver详解(六)——jumpserver luna组件安装
jumpserver详解(六)——jumpserver luna组件安装
282 1
|
Kubernetes 负载均衡 应用服务中间件
k8s学习-Ingress(安装、模板、创建、删除)
k8s学习-Ingress(安装、模板、创建、删除)
581 0
|
Kubernetes Perl 容器
在K8S中,replicaset 和deploy有何区别?
在K8S中,replicaset 和deploy有何区别?
|
11月前
|
安全 应用服务中间件 网络安全
免费ip地址https证书申请方法
IP SSL证书用于保障IP地址与浏览器间的数据传输安全,多数需付费购买。JoySSL现提供免费试用版,申请流程包括:访问官网、注册账号(需输入特定注册码230922)、选择证书类型、填写申请信息、验证IP控制权、等待审核、下载及部署证书。确保IP地址独立可控,信息准确,及时续期。
|
11月前
|
应用服务中间件 nginx
Nginx里的root和alias的区别是什么?
Nginx里的root和alias的区别是什么?
842 2
|
小程序 编译器 数据安全/隐私保护
小白保姆级教程:微信公众号开发,从0到1
【8月更文挑战第8天】小白保姆级教程:微信公众号开发,从0到1
3225 3
小白保姆级教程:微信公众号开发,从0到1
|
Kubernetes 监控 测试技术
k8s学习--基于Ingress-nginx实现灰度发布系统
k8s学习--基于Ingress-nginx实现灰度发布系统
468 2
k8s学习--基于Ingress-nginx实现灰度发布系统
|
存储 安全 Go
深入理解 Go 语言中的指针类型
【8月更文挑战第31天】
198 0
|
存储 监控 算法
go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控
go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控
403 0