使用阿里云容器服务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

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

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

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

  ~ curl -H "Host: mini-echo.io" http://47.106.45.47
old

进行蓝绿发布

  • 创建新的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

可以看到,唯一的变化就是,所有的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

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

流量完全切换到新服务

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

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

完成蓝绿发布

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

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

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3月前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
80 10
|
2月前
|
存储 运维 Kubernetes
容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。
|
2月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
3月前
|
Kubernetes 持续交付 开发工具
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
|
3月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
3月前
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
|
3月前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
容器 Kubernetes Perl
阿里云Kubernetes平台构建和管理实践(上)
阿里云智能容器平台解决方案架构师徐征讲解阿里云Kubernetes平台构建和管理实践,徐征主要从事帮助企业在面向云原生的应用转型的过程中提供解决方案和相应的工作。
11007 0
|
容器 Perl 监控
阿里云Kubernetes平台构建和管理实践(下)
阿里云智能容器平台解决方案架构师徐征讲解阿里云Kubernetes平台构建和管理实践,徐征主要从事帮助企业在面向云原生的应用转型的过程中提供解决方案和相应的工作。
3336 0
|
2月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
221 33

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版
  • 推荐镜像

    更多