使用阿里云容器服务Kubernetes实现蓝绿发布功能

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 背景 在发布应用时,经常需要先上线一个新版本,用较小的流量去测试一下该新版本的可用性。但是Kubernets的ingress resource 并没有实现流量控制与切分的功能,导致针对同一个域名下的路径,只能有一个service来进行服务。

背景

在发布应用时,经常需要先上线一个新版本,用较小的流量去测试一下该新版本的可用性。但是Kubernetes的ingress resource 并没有实现流量控制与切分的功能,导致针对同一个域名下的路径,只能有一个service来进行服务。这样对于灰度发布十分不利,下面我们就来介绍一下阿里云容器服务的蓝绿发布功能,轻松实现流量切分。

前置条件

既然需要进行蓝绿发布,那么应该已经有一个老服务在正常的对外提供服务中。我们这里以nginx 为例,假定已经有一个nginx deployment 通过NodePort对外暴露端口,并且有一个ingress正在对外提供服务。我们使用的模板如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: old-nginx
  name: old-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: old-nginx
  template:
    metadata:
      labels:
        run: old-nginx
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/xianlu/old-nginx
        imagePullPolicy: Always
        name: old-nginx
        ports:
        - containerPort: 80
          protocol: TCP
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  labels:
    run: old-nginx
  name: old-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: old-nginx
  sessionAffinity: None
  type: NodePort
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echo
spec:
  backend:
    serviceName: default-http-backend
    servicePort: 80
  rules:
  - host: mini-echo.io
    http:
      paths:
      - path: /
        backend:
          serviceName: old-nginx
          servicePort: 80
AI 代码解读

可以看到已经创建好的ingrsss地址

[root@iZwz91e2au5xvyw5jdpqp7Z manifests]# kubectl get ing
NAME      HOSTS          ADDRESS        PORTS     AGE
echo      mini-echo.io   47.106.45.47   80        3m
AI 代码解读

我们在本机通过curl访问可以看到如下效果

  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
old
AI 代码解读

进行蓝绿发布

  • 创建新的deployment与service
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: new-nginx
  name: new-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: new-nginx
  template:
    metadata:
      labels:
        run: new-nginx
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginx
        imagePullPolicy: Always
        name: new-nginx
        ports:
        - containerPort: 80
          protocol: TCP
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  labels:
    run: new-nginx
  name: new-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: new-nginx
  sessionAffinity: None
  type: NodePort
AI 代码解读

可以看到,唯一的变化就是,所有的old-nginx 都变成了new-nginx。

  • 修改ingress
    1523171488184

主要增加两个地方:

  1. 增加annotations ,标签ingress.aliyun.weight/new-nginx: "50"代表,/后面为新服务的服务名,也就是新的service name。后面的50代表百分比,以%为单位,50代表新服务占领百分之50的流量。此标签的完整含义为,将流量的百分之50打到新的服务的pod里面。
  2. 第二处为指定对应的新的serviceName。这里是和上面老服务并列,即在相同的Path 下,挂两个不同的service ,分别对应于两个新老应用。
  • 效果
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
old
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
old
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
old
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
AI 代码解读

可以看到,执行六次请求,分别得到三次新服务,三次老服务的返回,这表明权重设置生效了。

流量完全切换到新服务

123
只需要将新服务的百分比写到100就可以,再看一下效果。

  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
AI 代码解读

可以看到,流量都打到了新服务。

完成蓝绿发布

1623172019750
只需要将设置权重的annotation 删除即可,然后将下面对应的serviceName也删除,这样就恢复了原本ingress的原貌,同时将原来的老服务改成了新的服务。下面再来看一下效果:

  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
new
AI 代码解读

可以看到,新的服务已经上线,这就完成了整个蓝绿发布的完整生命周期。

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
打赏
0
0
1
0
78342
分享
相关文章
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
32 10
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
课时5:阿里云容器服务:最原生的集成Docker和云服务
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
阿里云向全球客户推出创新容器计算服务ACS,可降低算力成本高达55%
阿里云向全球客户推出创新容器计算服务ACS,可降低算力成本高达55%
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
35 19

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版