如何解决如何为两个依赖部署执行滚动更新,其中一个部署有更长的宽限期?
我有一个包含以下组件的 Kubernetes 集群(nginx-ingress)。
当我部署新版本的 Tomcat 时,旧版本会停留一段时间(出于应用程序原因)可能大约 10 分钟,然后它们就会死亡。在短时间内,一些用户会连接到旧的 Pod,一些用户会连接到新的 Pod。连接到 tomcat V2 的用户需要获取新的静态资产,这意味着他们需要连接到 Apache v2。问题是,即使我将两个版本的 apache 保留相同的时间,我将如何确保使用新版本 tomcat 的用户连接到新版本的 apache 和使用旧版本的用户tomcat 连接到旧版本的apache?我希望 apache pod 是无状态的。
解决方法
我认为您应该尝试蓝绿部署模型。
蓝/绿部署是一种用于发布软件代码的变更管理策略。蓝/绿部署,也可以称为 A/B 部署,需要两个完全相同的配置方式的相同硬件环境。当一个环境处于活动状态并为最终用户提供服务时,另一个环境保持空闲。
容器技术提供了一个独立的环境来运行所需的服务,这使得创建蓝/绿部署所需的相同环境变得非常容易。松散耦合的服务 - ReplicaSets 和 Kubernetes 中基于标签/选择器的服务路由可以轻松地在不同的后端环境之间切换。使用这些技术,Kubernetes 中的蓝/绿部署可以如下完成:
- 在部署之前,基础设施准备如下:
- 准备蓝色部署和绿色部署,TOMCAT_VERSION=7 和 TARGET_ROLE 分别设置为蓝色或绿色。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deployment-${TARGET_ROLE}
spec:
replicas: 2
template:
metadata:
labels:
app: tomcat
role: ${TARGET_ROLE}
spec:
containers:
- name: tomcat-container
image: tomcat:${TOMCAT_VERSION}
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /
port: 8080
准备公共服务端点,它最初路由到后端环境之一,例如 TARGET_ROLE=blue。
kind: Service
apiVersion: v1
metadata:
name: tomcat-service
labels:
app: tomcat
role: ${TARGET_ROLE}
env: prod
spec:
type: LoadBalancer
selector:
app: tomcat
role: ${TARGET_ROLE}
ports:
- port: 80
targetPort: 8080
可选地,准备一个测试端点,以便我们可以访问后端环境进行测试。它们类似于公共服务端点,但仅供开发/运营团队内部访问。
kind: Service
apiVersion: v1
metadata:
name: tomcat-test-${TARGET_ROLE}
labels:
app: tomcat
role: test-${TARGET_ROLE}
spec:
type: LoadBalancer
selector:
app: tomcat
role: ${TARGET_ROLE}
ports:
- port: 80
targetPort: 8080
- 在非活动环境(例如绿色环境)中更新应用程序。在部署配置中设置 TARGET_ROLE=green 和 TOMCAT_VERSION=8 以更新绿色环境。
- 通过 tomcat-test-green 测试端点测试部署,以确保绿色环境已准备好为客户端流量提供服务。
- 通过使用 TARGET_ROLE=green 更新服务配置,将前端服务路由切换到绿色环境。
- 在公共端点上运行额外的测试以确保其正常工作。
- 现在蓝色环境空闲,我们可以:
- 将其保留在旧应用程序中,以便我们在新应用程序出现问题时回滚
- 更新它以使其成为活动环境的热备份
- 减少其副本数量以节省占用的资源
与 Rolling Update 相比,blue/green up* 公共服务要么路由到旧应用程序,要么路由到新应用程序,但不会同时路由。
- 新 Pod 准备就绪所需的时间不会影响公共服务质量,因为只有在所有新 Pod 都经过测试准备就绪后,流量才会路由到新 Pod。
- 我们可以在新环境服务于任何公共交通之前对其进行全面测试。请记住,这是在生产中,测试不应污染实时应用程序数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。