不停机与停机更新_Istio的零停机滚动更新

不停机与停机更新

本系列文章的第一部分介绍了如何在Kubernetes集群中实现真正的零停机时间更新。 我们专门解决了将流量从旧实例切换到新实例时出现的请求失败。 本文将展示如何使用Istio群集实现相同的目标。

服务网格技术(例如Istio)通常与容器编排结合使用。 Istio以透明的方式为我们的应用程序提供了诸如弹性,遥测和高级流量管理之类的跨领域问题。

当我们使用Istio时,与内部Kubernetes相比,集群内部网络模型看起来有些不同。 如果您不了解Istio当前的网络API的设计方式,则可以观看以下说明视频 。

使用Istio尝试零停机

让我们从本文的第一部分开始。 如果我们以与以前类似的方式将应用程序重新部署到Istio群集,则会注意到更新期间的行为有所不同。 当我们重新运行旨在检测可用性差距的负载测试时,我们会注意到,尽管我们有preStop pod生命周期处理程序,但仍有一些失败的请求。

Fortio 1.1.0 running at 500 queries per second, 4->4 procs, for 20s
Starting at 500 qps with 50 thread(s) [gomax 4] for 20s : 200 calls each (total 10000)
09:11:39 W http_client.go:673> Parsed non ok code 503 (HTTP/1.1 503)
[...]
Code 200 : 9960 (99.6 %)
Code 503 : 40 (0.4 %)
Response Header Sizes : count 10000 avg 165.204 +/- 10.43 min 0 max 167 sum 1652048
Response Body/Total Sizes : count 10000 avg 176.12 +/- 3.817 min 171 max 227 sum 1761200
[...]

如输出所示,有些HTTP请求失败,并显示503 Service Unavailable状态代码。 无论我们如何调整preStop处理程序的等待时间,在流量较高时更新服务时,似乎都至少会preStop一些客户端请求。 同样,我们是否通过网关从网格内部还是从群集外部访问Istio服务似乎也没有什么区别。

了解发生了什么

要了解发生了什么,让我们仔细看看Istio边车容器如何连接到各个服务。

零停机时间更新

网格中的所有流量都通过连接到各个实例的Sidecar代理进行路由。 对于通过网关的入口流量也是如此。

在我们的场景中,这意味着边车可能无法连接到实例,即使它们已经准备好为交通服务。 代理以最终一致的方式配置; 配置从飞行员平面逐渐传播。

Envoy还会对实例执行主动的运行状况检查,它将检测异常值并最终阻止与它们的连接。 为Pod定义的基于HTTP的就绪探针也将包括在内,并由Envoy代理执行。 换句话说,即使容器仍会接受请求,代理容器也不会连接到准备就绪探测失败的容器。 我们可以通过网状配置添加到Sidecar代理中的重试配置只能缓解但不能解决此问题。

通过Istio实现零停机

有一些方法可以在将来向Kubernetes引入更多增强的健康检查概念。

但是,当前,在工作量和可靠性之间的合理平衡是使用Istio子集作为版本指示符,并独立于Kubernetes的滚动更新机制重新路由服务流量。 通过这种方法,我们使用服务子集来标识应用程序的版本(例如v1v2 ,并将虚拟服务配置为路由到一个特定版本。 由虚拟服务资源配置的Istio代理路由可以重新路由到具有真正零停机时间的不同子集版本。

零停机时间更新

为了使用这种方法,我们将创建单独的Kubernetes部署,为我们的应用程序的每个单独版本创建一个,并通过Istio执行实际的切换。

部署示例如下所示:

  • 最初:Kubernetes部署coffee-shop-v1带有标签app=coffee-shopversion=v1 ,目的地规则来定义子集v1 ,和虚拟服务,航线coffee-shop v1
  • 我们增强了目标规则,以包括版本v2的新子集
  • 我们创建一个version=v2的部署coffee-shop-v2 version=v2
  • 成功部署完成后,我们将虚拟服务重新路由到v2 。 切换将不会丢失请求。
  • 短暂的等待后,我们从目标规则中删除了子集v1 ,并部署了coffee-shop-v1

如果我们从第一部分开始重新运行相同的负载测试,则会注意到我们可以执行实际的零停机时间部署。

Fortio 1.1.0 running at 500 queries per second, 4->4 procs, for 20s
Starting at 500 qps with 50 thread(s) [gomax 4] for 20s : 200 calls each (total 10000)
[...]
Code 200 : 10000 (100.0 %)
Response Header Sizes : count 10000 avg 159.530 +/- 0.706 min 154 max 160 sum 1595305
Response Body/Total Sizes : count 10000 avg 167.853 +/- 2.51 min 161 max 171 sum 1678534
[...]

如果您不熟悉如何使用Istio的网络API来实现此过程,则可以观看说明视频 。

自动化是关键

当然,我们不想手动执行这些步骤。 这个想法是要定义一个在每个新软件版本上执行的自动化过程。 最终,此部署应作为持续交付管道的一部分进行,该管道将我们的软件部署到相应的环境中。

我们可以增强持续交付管道,以部署Canary版本,在该版本中,我们仅将用户流量的一小部分路由到。 这也将作为自动化方法同样包含在管道中:逐渐将用户流量路由到新部署的版本,然后在Canary版本证明自己可以正常工作时执行完全切换。

如果我们以模板语言定义部署和Istio路由定义,则将有帮助。 这样,我们可以可靠地定义和更改应用程序版本和映像版本,并始终如一地推出更改。 coffee-shop示例项目包括一个自动化脚本,该脚本使用Istio执行零停机时间部署,并基于使用kontemplate的YAML模板方法进行构建 。

结论

Kubernetes的生产就绪性是一个非常有价值的功能,它是开箱即用的。 但是,我们需要更多地考虑,以充分实现零停机行为。 测试您将在生产环境中运行的应用程序的停机时间并相应地调整探测和各种超时至关重要。

当然,了解Kubernetes和Istio如何分别管理与后端的连接也很有帮助。 如果我们在更新期间稍微调整行为,则可以消除最后的可用性差距。

零宕机时间以及正确的连接耗尽和保持活动连接处理能力使我们的应用程序可以随时部署,而不会中断用户。 一旦到达这一点,我们就可以不断改进我们的软件,并更快地交付功能和错误修复以投入生产。 因此,零停机时间部署是持续交付和持续改进文化正常运行的前提之一。

  • GitHub项目示例(Istio版本)
  • Kubernetes的零停机滚动更新(第一部分)
  • Istio Networking API说明视频
  • Kontemplate(Kubernetes模板工具)

翻译自: https://www.javacodegeeks.com/2018/10/zero-downtime-rolling-updates-istio.html

不停机与停机更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程调用 Spring Cloud Feign

一、 Feign简介 Feign [feɪn] 译文 伪装。Feign是一个声明式WebService客户端.使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解。不再需要拼接URL,参数等操作。项目主页:https://github.com/Ope…

Linux 命令之 pwconv -- 开启用户的投影密码

命令介绍 该命令根据文件 /etc/passwd 创建影子文件 /etc/shadow。 用来开启用户的投影密码。Linux系统里的用户和群组密码,本来分别存放在名称为 passwd 和 group 的文件中, 这两个文件位于 /etc 目录下。因系统运作所需,任何人都得以读取…

plsql如何执行单个语句_在单个try-with-resources语句中仔细指定多个资源

plsql如何执行单个语句Java 7最有用的新功能之一是引入了try-with-resources语句 [AKA 自动资源管理 ( ARM )]。 try-with-resources语句的吸引力在于它承诺 “确保在语句末尾关闭每个资源”。 在这种情况下,“资源”是实现AutoCloseable及其…

Spring Cloud Feign 负载均衡

一、Feign负载均衡介绍 Feign本身集成了Ribbon依赖和自动配置,因此不需要额外引入依赖,也不需要再注册RestTemplate对象 Feign内置的ribbon默认设置了请求超时时长,默认是1000,可以修改 ribbon内部有重试机制,一旦超…

Linux 命令之 pwunconv -- 关闭投影密码

文章目录命令介绍命令介绍 pwunconv 命令与 pwconv 功能相反,用来关闭用户的投影密码。它会将密码从 /etc/shadow 文件内,重新回存到 /etc/passwd 文件中。换句话说,pwunconv 命令将文件 /etc/shadow 中的数据同步到文件 /etc/passwd 中&…

apache ignite_Apache Ignite,Hazelcast,Cassandra和Tarantool之间的主要区别

apache igniteApache Ignite在世界范围内得到广泛使用,并且一直在增长。 诸如Barclays,Misys,Sberbank(欧洲第三大银行),ING,JacTravel之类的公司都使用Ignite来增强其架构的功能,这…

Spring Cloud Feign 熔断器支持

一、实现步骤 在配置文件application.yml中开启feign熔断器支持编写FallBack处理类,实现FeignClient客户端在FeignClient注解中,指定FallBack处理类。测试 1. 在配置文件application.yml中开启feign熔断器支持:默认关闭 # 开启Feign的熔断功…

system health_可重复使用的MicroProfile Health探针

system healthMicroProfile Health API是一种非常基本的API,它基于一个或多个Health Probe报告您的服务状态。 在某些服务器或群集控制器需要决定是否以及何时重新启动实例的情况下,这非常有用。 在应用程序中使用MicroProfile Health API就像实现一个&…

Linux 命令之 visudo -- 编辑/etc/sudoers文件

文章目录命令介绍常用选项参考示例编辑文件 /etc/sudoers检查 /etc/sudoers 文件的语法错误、所有者和模式命令介绍 使用 visudo 命令可以打开 /etc/sudoers 文件进行编辑。当然 vim 也可以编辑该文件,但是不建议这样做,因为使用命令 visudo 编辑文件 /…

Spring Cloud Feign 请求压缩 、Feign的日志级别配置

一、Spring Cloud Feign 请求压缩 #开启压缩compression:request:enabled: true # 开启请求压缩#最小触发压缩的大小min-request-size: 2048#触发压缩数据类型,(注意不能使用"" ,)mime-types: text/xml, application/xml, applicat…

Linux 命令之 sudoedit -- 以另外一个用户身份编辑文件

文章目录命令介绍常用选项参考示例以用户 root 身份来编辑指定的文件以其它用户身份编辑指定的文件命令介绍 查看使用帮助,感觉和命令 sudo 完全一样。 [mysqlhtlwk0001host ~]$ sudoedit -h sudoedit - 以其他用户身份编辑文件usage: sudoedit [-AknS] [-r role]…

文档在线签名_为什么需要为文档和合同切换到在线签名

文档在线签名嘿,怪胎, 今天,我们为您带来一些不同。 无论您是开发人员,经理还是设计师,这都会提高您的生产力和效率。 对于公司和个人而言,良好地管理文书工作是强大基础的最重要部分之一。 将工作流程从…

网关 Spring Cloud Gateway

一、 Gateway 简介 Spring Cloud Gateway 是Spring Cloud团队的一个全新项目,基于Spring 5.0、SpringBoot2.0、Project Reactor 等技术开发的网关。 旨在为微服务架构提供一种简单有效统一的API路由管理方式。 Spring Cloud Gateway 作为SpringCloud生态系统中的网…

Linux命令之su -- 用于切换当前用户身份到其他用户身份

文章目录命令介绍特别重要常用选项su 命令存在的安全隐患参考示例切换成指定的用户身份,但是环境变量不变切换成指定的用户身份,并且改成对应用户的环境变量切换成指定的用户,并告知新的 shell 不要去读取启动文件切换成指定的用户执行命令&a…

apache ignite_Apache Ignite变得简单:第一个Java应用程序

apache ignite在本文中,我们将更进一步,让您完成第一个Ignite应用程序的创建,以从分布式缓存中进行读写操作。 作为第一个示例,我们将尽可能简单地向您展示如何用Java编写用于处理Apache Ignite集群数据的应用程序。 可从GitHub存…

Linux 命令之 sudo -- 以其他用户身份来执行命令

文章目录命令介绍原理相关文件通配符和命令 su 的比较常用选项几个重要选项的解读-k 选项-s 选项-i 选项su、sudo su、sudo -i 的区别查看日志文件参考示例以用户 mysql 的身份执行命令 pwd以用户 root 的身份执行命令 pwd以 root 的权限执行上一条命令以 root 的权限编辑指定的…

openjdk和jdk_JDK 11:发行候选更新和OpenJDK JDK 11 LTS

openjdk和jdkJDK 11 计划于 2018年9月25日星期二发布,以实现全面可用性 。OpenJDK jdk-dev邮件列表上的Mark Reinhold消息于2018 年8月16日宣布“ JDK 11现在处于发布候选阶段 。” 但是,Reinhold在2018年8月17日同一封邮件列表中的消息中提供了更新的详…

Linux系统通过文件/etc/sudoers设置用户使用sudo的权限/用户使用sudo的授权配置

文章目录sudo 权限配置说明如何修改 sudo 会话有效期设置输入密码时显示星(*)号别名规则如何定义别名及使用别名配置权限为什么配置的命令要使用绝对路径参考示例授权用户 test 可以重启服务器授权群组可以使用 sudo 切换成任何用户身份,执行…

system.gc 性能_使用这些先进的GC技术提高应用程序性能

system.gc 性能应用程序性能是我们关注的重点,垃圾收集优化是取得小而有意义的进步的好地方 自动化垃圾收集(与JIT HotSpot编译器一起)是JVM中最先进,最有价值的组件之一,但是许多开发人员和工程师对垃圾收集&#…

Linux 命令之 who -- 打印当前登录用户/显示目前登入系统的用户信息。

文章目录命令介绍常用选项参考示例打印用户登录信息打印全面的信息打印系统登录进程显示登录系统的所有用户名称和总人数命令介绍 who 命令用来打印当前登录用户信息,包含了系统的启动时间 、 活动进程 、 使用者 ID、使用终端等信息,是系统管理员了解系…