在之前的应用部署系列文章里,我们已经介绍过什么是蓝绿部署。如需回顾,点击下方文章链接即可重温。本文我们将会介绍如何使用 Kubernetes 实现蓝绿部署。

应用部署初探:3个主要阶段、4种常见模式

应用部署初探:微服务的3大部署模式

应用部署初探:6个保障安全的最佳实践

前期准备:

  • Kubernetes 集群
  • kubectl
  • 要部署的应用程序的 Docker 镜像

如果你已经准备就绪,那么我们就开始部署啦!

Step 1:创建命名空间

首先,我们需要创建命名空间来部署我们的应用程序。输入以下命令即可:

kubectl create namespace blue-green

Step 2:创建部署

接下来,我们需要创建2个部署,一个是蓝环境,另一个是绿环境。除了标签之外,两个部署应该是相同的(标签主要是为了辨别哪个是蓝环境,哪个是绿环境)。以下是部署 manifest 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-blue
labels:
app: myapp
env: blue
spec:
replicas: 3
selector:
matchLabels:
app: myapp
env: blue
template:
metadata:
labels:
app: myapp
env: blue
spec:
containers:
- name: myapp
image: myapp:v1.0
ports:
- containerPort: 80

将 manifest 保存为 blue-deployment.yaml,并使用以下命令在蓝环境中创建部署:

kubectl apply -f blue-deployment.yaml -n blue-green

同理,通过在 manifest 文件中更改名称和标签来在绿环境中创建另一个部署,并将其保存为 green-deployment.yaml。接下来,使用以下命令将其部署在绿环境:

kubectl apply -f green-deployment.yaml -n blue-green

Step 3:创建服务

现在,我们需要创建服务将我们的应用程序暴露给外部世界。该服务应该使用 label selector 来将流量路由到蓝部署和绿部署中。以下是服务 manifest 示例:

apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- name: http
port: 80
targetPort: 80
type: LoadBalancer

将 manifest 保存为 service.yaml,并使用以下命令创建服务:

kubectl apply -f service.yaml -n blue-green

Step 4:验证部署

现在,我们来验证部署和服务是否能正常运行。首先,我们需要获得服务的外部IP地址:

kubectl get service myapp-service -n blue-green

该命令将输出服务的外部IP地址。使用这个IP地址可以在浏览器内访问应用。你应该可以看到应用在蓝环境中运行。

Step 5:执行蓝绿部署

既然蓝绿部署都在运行,我们就可以通过从蓝环境路由流量到绿环境来执行蓝绿部署。

Step 6:更新绿部署

首先,我们需要使用应用程序的新版本更新绿部署。在绿部署的 manifest 里用新版本的 Docker 镜像来更新镜像字段并将其保存为 green-deployment-v2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-green
labels:
app: myapp
env: green
spec:
replicas: 3
selector:
matchLabels:
app: myapp
env: green
template:
metadata:
labels:
app: myapp
env: green
spec:
containers:
- name: myapp
image: myapp:v2.0
ports:
- containerPort: 80

使用以下命令,应用更新好的绿部署:

kubectl apply -f green-deployment-v2.yaml -n blue-green

Step 7:更新服务

接下来,我们需要更新服务以将流量路由到绿部署。首先,在服务的manifest里更新 label selector,以选择绿部署:

apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
env: green
ports:
- name: http
port: 80
targetPort: 80
type: LoadBalancer

使用以下命令应用更新完毕的服务:

kubectl apply -f service.yaml -n blue-green

Step 8:验证部署

最后,我们需要验证部署是否成功。首先,使用 kubectl get service 命令获取服务的外部IP地址,并在浏览器中访问应用程序。你应该看到已经更新好的应用版本在绿环境中运行。

Step 9:回滚

如果在部署期间发生错误,我们可以轻松回滚到之前的应用版本:通过在服务的manifest里更新 label selector 来选择蓝环境并重新应用服务 manifest。

apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
env: blue
ports:
- name: http
port: 80
targetPort: 80
type: LoadBalancer

应用更新完毕的服务:

kubectl apply -f service.yaml -n blue-green

需要考虑的因素

当您在 Kubernetes 中进行蓝绿部署时,需要考虑一些其他因素:

  • 存储:如果你的应用程序需要持久化存储,你要确保蓝绿部署都使用相同的持久卷。否则,你可能会在部署过程中丢失数据。
  • DNS:如果你的应用程序属于自定义域名,那么当从蓝部署切换到绿部署时,你需要更新 DNS 记录以指向新的IP地址。
  • 测试:在将流量切换到绿部署之前,彻底地测试应用新版本以保证其正常工作是至关重要的。也可以使用金丝雀发布来将流量逐步切换的新版本并监控其性能。

总结

尽管蓝绿部署是一种高效的部署应用程序的方法,但它可能并不适用于每种情况。例如,如果你的应用需要进行大量的数据迁移或更改数据库格式,蓝绿部署可能不是最佳策略,因为它会导致蓝绿环境之间数据不一致。

此外,对于需要持久性存储的有状态的应用程序来说,蓝绿部署的实施可能具有挑战性,因为数据必须在蓝色和绿色环境之间同步进行。在这些情况下,你也许需要考虑其他部署策略,比如滚动更新或金丝雀部署。

在本文中,我们了解了如何使用 Kubernetes 进行蓝绿部署。蓝绿部署是一种备受欢迎的部署策略,因为它提供了零停机时间,并在出错时提供了快速、简单的回滚方式。

使用K8S进行蓝绿部署的简明实操指南的更多相关文章

  1. Kubernetes 中的渐进式交付:蓝绿部署和金丝雀部署

    渐进式交付是持续交付的下一步, 它将新版本部署到用户的一个子集,并在将其滚动到全部用户之前对其正确性和性能进行评估, 如果不匹配某些关键指标,则进行回滚. 这里有一些有趣的项目,使得渐进式交付在 Ku ...

  2. 蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别(转)

    出处:https://www.baidu.com/link?url=QjboallwNm_jxcL3fHG57wEakiBfAs_3-TChTGu1eBXstlHEsGBc-NDA7AKTqsiroB ...

  3. Contour 学习笔记(二):使用级联功能实现蓝绿部署和金丝雀发布

    上篇文章介绍了 Contour 分布式架构的工作原理,顺便简单介绍了下 IngressRoute 的使用方式.本文将探讨 IngressRoute 更高级的用法,其中级联功能是重点. 1. Ingre ...

  4. 蓝绿部署、A/B测试以及灰度发布(金丝雀发布)

    过去的10多年里,很多大公司都在使用蓝绿部署,安全.可靠是这种部署方式的特点.蓝绿部署虽然算不上”Sliver Bullet“,但确实很实用.在有关于“微服务”.“DevOps”.“Cloud-nat ...

  5. 蓝 / 绿部署(Blue/Green) 金丝雀发布(Canary Release) 功能标记(Feature Flagging)

    https://www.cnblogs.com/apanly/p/8784096.html 最终,我选择了 GraphQL 作为企业 API 网关 蓝 / 绿部署(Blue/Green) 金丝雀发布( ...

  6. 蓝绿部署、金丝雀发布(灰度发布)、A/B测试

    本文转载自蓝绿部署.金丝雀发布(灰度发布).A/B测试的准确定义 概述 蓝绿部署.A/B测试.金丝雀发布,以及灰度发布.流量切分等,经常被混为一谈,影响沟通效率. 根本原因是这些名词经常出现,人们耳熟 ...

  7. 蓝绿部署、滚动部署、金丝雀(Canary)发布、灰度发布、A/B测试

    最近看到Canary发布,一时没有反应过来是什么,一查才发现就是鼎鼎有名的金丝雀发布,发现经常一起出现的还有灰度发布.蓝绿部署.滚动部署.A/B测试,故一起学习一下这几个概念. 1. 蓝绿部署 目的: ...

  8. Linux Centos7.x下安装部署VNC的实操详述

    VNC (Virtual Network Console)是虚拟网络控制台的缩写.它 是一款优秀的远程控制工具软件,由著名的AT&T的欧洲研究实验室开发的.VNC 是在基于 UNIX和 Lin ...

  9. Linux Centos6.9下安装部署VNC的实操详述

    VNC (Virtual Network Console)是虚拟网络控制台的缩写.它 是一款优秀的远程控制工具软件,由著名的AT&T的欧洲研究实验室开发的.VNC 是在基于 UNIX和 Lin ...

  10. kettle安装部署基本操作及实操文档

    一.kettle是什么? Kettle,简称ETL(Extract-Transform-Load的缩写,即数据抽取.转换.装载的过程),是一款国外开源的ETL工具,纯Java编写,可以在Window. ...

随机推荐

  1. Javascript基础知识整理(引用类型-Array)

    Array Array是一组数据的有序列表,在ECMAScript中,数组的每一项可以是不一样的数据类型. 创建数组有两种方式 (1)使用构造函数 var colors = new Array(); ...

  2. Docker基本命令之 镜像管理

    镜像管理 docker常用基础命令: 查看docker版本信息:docker version 查看docker系统信息:docker info docker服务相关: 查看docker服务:syste ...

  3. python实现学生信息管理系统——界面版

    前言(写于2022年5月17日) 这篇博客是我两年前大二时写的,一直放在草稿箱里,还没写完,现在快毕业了,突然翻出来了.虽然博客没写完,但早就写好了代码,可运行的exe文件以及文档.现在上传到gite ...

  4. TypeError: Cannot read property ‘$options‘ of undefined vue

    vue弹框页面 <el-form :model="ruleForm" ref="ruleForm" label-width="100px&quo ...

  5. 解决nios eclipse报错: WARNING: Couldn't compute FAST_CWD pointer的方法

    几天照着书上的例子弄nios的开发流程,编译的时候遇见了这个问题 WARNING: Couldn't compute FAST_CWD pointer 在网上找了大半天解决方法,如下: 链接:http ...

  6. redis存储类型-数字和带双引号的数字

    这个是不一样的值,出现了转换异常

  7. PPT之图表

    1.从数据到信息 同样的数据,通过不同的图样式来呈现不同的突出重点.使用饼状图突出元素占比,使用排序的柱状图突出最大或者最小的元素,使用虚化与实体突出表达重点. 同样的数据,通过不同的关注点突出重点. ...

  8. scrcpy

    捕获配置 缩小尺寸 有时,以较低的清晰度镜像 Android 设备以提高性能很有用. 将宽度和高度限制为某个值(例如 1024): scrcpy --max-size 1024 scrcpy -m 1 ...

  9. 这几年专注于流程管理与RPA落地

    这些年专注于流程管理与RPA落地,乙方有些辛苦,但,也得到了客户的认可,开心. 做过多个流程管理咨询,发现信息化落地后孤岛很多,RPA 刚好可以作为各个系统的有效补充,把系统有机的结合在一起. 企业信 ...

  10. 重复引入reactor-netty

    java.lang.NoClassDefFoundError: reactor/util/retry/Retry at reactor.netty.http.client.HttpClientConn ...