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

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

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
29天前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
29天前
|
存储 Kubernetes Docker
容器服务ACK常见问题之阿里云控制台进不去了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
29天前
|
存储 运维 Kubernetes
容器服务ACK常见问题之容器服务ACK 淘宝源过期了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
2月前
|
人工智能 运维 Kubernetes
阿里云容器服务ACK AI助手正式上线带来的便利性
作为开发者想必大家都知道,云原生容器技术的优势,尤其是近两年的随着容器技术的迅猛发展,Kubernetes(K8s)已成为广泛应用于容器编排和管理的领先解决方案,但是K8s的运维复杂度一直是挑战之一。为了应对这一问题,就在最近,阿里云容器服务团队正式发布了ACK AI助手,这是一款旨在通过大模型增强智能诊断的产品,旨在帮助企业和开发者降低Kubernetes(K8s)的运维复杂度。那么本文就来详细讲讲关于这款产品,让我们结合实际案例分享一下K8s的运维经验,探讨ACK AI助手能否有效降低K8s的运维复杂度,并展望ACK AI助手正式版上线后的新功能。
264 2
阿里云容器服务ACK AI助手正式上线带来的便利性
|
7天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
17 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
18天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
14 0
|
20天前
|
人工智能 监控 Serverless
如何基于ACK Serverless快速部署AI推理服务
通过上述步骤,可以在ACK Serverless上快速部署AI推理服务,实现高可用、弹性扩展的服务架构。
19 1
|
21天前
|
Kubernetes 网络协议 Docker
K8S核心插件-coredns服务
K8S核心插件-coredns服务
15 0
|
29天前
|
存储 Kubernetes 监控
容器服务ACK常见问题之容器服务ACK启动时readiness告警如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
29天前
|
存储 Kubernetes 监控
容器服务ACK常见问题之容器服务ACK worker节点选择不同地域失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。

相关产品

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