深入玩转K8S之智能化的业务弹性伸缩和滚动更新操作

在上篇我们讲到了较为傻瓜初级的弹性伸缩和滚动更新,那么接下来我们来看看较为高级的智能的滚动更新。本节的知识点呢是K8S的liveness和readiness探测,也就是说利用健康检查来做更为智能化的弹性扩容和滚动更新。

那为什么说是比较智能化呢,因为在实际生产环境中会遇到这样那样的问题,比如:容器里面应用挂了或者说新启动的容器里面应用还没有就绪等等,所以说就需要进行探测来检验容器是否满足需求。

那么一般的检测分为几种,比如:进程检测、业务检测。

进程检测呢很好理解,也就是说通过检测容器进程来验证容器内应用是否存活。Kubelet会定期通过Docker Daemon获取所有Docker进程的运行情况,如果发现某个Docker容器未正常运行,则重新启动该容器进程。目前,进程级的健康检查都是默认启用的。

业务检测呢也好理解,有些人会问,有了进程检测不就挺好的么,为什么要进行业务检测? 因为在很多实际场景下,仅仅使用进程级健康检查还远远不够。有时,从Docker的角度来看,容器进程依旧在运行;但是如果从应用程序的角度来看,假设应用代码处于死锁状态的话,那每次调度到这个容器的时候永远都无法正常响应用户的业务。比如对于使用java web服务的应用来说,并不是简单地说tomcat启动成功就可以对外提供服务的,还需要等待spring容器初始化,数据库连接连接上等等。

为了解决以上问题,Kubernetes引人了一个在容器内执行的活性探针(liveness probe)的概念,以支持用户自己实现应用业务级的健康检查。这些检查项由Kubelet代为执行,以确保用户的应用程序正确运转,至于什么样的状态才算“正确”,则由用户自己定义。Kubernetes支持3种类型的应用健康检查动作,分别为HTTP Get、Container Exec和TCP Socket。个人感觉exec的方式还是最通用的,因为不是每个服务都有http服务,但每个服务都可以在自己内部定义健康检查的job,定期执行,然后将检查结果保存到一个特定的文件中,外部探针就不断的查看这个健康文件就OK了。

介绍完活性探针(liveness probe)之后我们来看看就绪探针(readiness probe),就绪探针是来确定容器是否已经就绪可以接受访问,只有当Pod中的容器都处于就绪状态时kubelet才会认定该Pod处于就绪状态,至于什么样的状态才算 ”就绪”,还是由用户自己定义。该状态的作用就是控制哪些Pod可以作为service的后端,如果Pod处于非就绪状态,那么它们将会被从service的load balancer中移除。

介绍到此处是不是觉得我们的弹性伸缩和滚动更新如果加上刚才介绍的 ”两针神器”就会变得更加智能化了。那下面我们来看看这两个探针如何在应用到弹性伸缩和滚动更新上。

开始之前可以先看看进程探测,我们基于busybox镜像创建一个Pod,下面是yml文件。

该配置文件给Pod配置了一个容器。periodSeconds 规定kubelet要每隔5秒执行一次liveness probe。 initialDelaySeconds 告诉kubelet在第一次执行probe之前要的等待5秒钟。探针检测命令是在容器中执行 cat /tmp/healthy 命令。如果命令执行成功,将返回0,kubelet就会认为该容器是活着的并且很健康。如果返回非0值,kubelet就会杀掉这个容器并重启它。

可以看到,日志显示/tmp/healthy不存在,探测失败所以容器重启

OK,那下面来进行业务探测的场景,比如:弹性伸缩,因为在实际场景中我们由于业务的需求可能需要临时扩容新建N个容器,那么这个时候就需要业务探测来检查哪个容器就没就绪,如果就绪的话就把它作为service的后端,下面的yml文件

OK,可以看到我的测试失败了,因为nginx里面没有/healthz,所以探测反馈404,证明我的业务现在还没就绪所以就没把它加入到service后端。

该配置文件定义了一个容器,readinessProbe 指定kubelete需要每隔5秒执行一次readiness Probe。initialDelaySeconds 指定kubelet在该执行第一次探测之前需要等待10秒钟。该探针将向容器中的server的80端口发送一个HTTP GET请求。如果server的/healthz路径的handler返回一个成功的返回码,kubelet就会认定该容器是活着的并且很健康。如果返回失败的返回码,kubelet将杀掉该容器并重启它。

注意:任何大于200小于400的返回码都会认定是成功的返回码。其他返回码都会被认为是失败的返回码。

OK,下面来看看滚动更新,因为在实际场景中程序应用肯定避免不了进行更新,我们在上一篇文章中讲述了简单的傻瓜式滚动更新,下面我们来看看较为智能化高级的滚动更新,也就是加上了业务探测,依旧是v1、v2的例子,下面是yml文件。

这里模拟的是一个失败的滚动更新,在我们的设定中,新副本始终都无法通过Readiness探测,可以看到我在上面新建pod的时候在容器里面新建了一个目录,但是过一会就删除了,所以说V2我在进行滚动升级的时候失败了。不过幸运的是健康检查帮我们屏蔽了有问题的副本,同时也保留了原有的副本,业务并没有因为更新失败而受到影响。

OK,那既然更新失败了,那就根据上篇文章所学的,我们执行下回滚,利用kubectl rollout undo

最后注意下,滚动更新是可以在yml文件里面通过参数maxSurge和maxUnavailable来控制副本替换的数量,本文参考了Kubernetes官网和每天5分钟玩转K8S。

原文地址:http://blog.51cto.com/devingeng/2137289

时间: 2024-10-10 17:14:53

深入玩转K8S之智能化的业务弹性伸缩和滚动更新操作的相关文章

深入玩转K8S之如何访问业务应用(Traefik-ingress配置https篇)

上篇我们简单介绍了下traefik以及如何http访问, 但是在实际生产环境中不仅仅只是http的转发访问,还有https的转发访问, 前面一篇:traefik基础部署记录,介绍了最简单的http访问traefik,访问过程参考见下: client --- (via http) ---> traefik ---- (via http) ---->  services 现在要实践的是更安全也更复杂的https访问traefik,有两种访问过程,参考见下: 后端service是普通http的 即c

深入玩转K8S之利用Label控制Pod位置

首先介绍下什么是Label? Label是Kubernetes系列中一个核心概念.是一组绑定到K8s资源对象上的key/value对.同一个对象的labels属性的key必须唯一.label可以附加到各种资源对象上,如Node,Pod,Service,RC等. 通过给指定的资源对象捆绑一个或多个不用的label来实现多维度的资源分组管理功能,以便于灵活,方便地进行资源分配,调度,配置,部署等管理工作. 默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node.不过有些实际情况我们

如何滚动更新 Service?- 每天5分钟玩转 Docker 容器技术(102)

在前面的实验中,我们部署了多个副本的服务,本节将讨论如何滚动更新每一个副本. 滚动更新降低了应用更新的风险,如果某个副本更新失败,整个更新将暂停,其他副本则可以继续提供服务.同时,在更新的过程中,总是有副本在运行的,因此也保证了业务的连续性. 下面我们将部署三副本的服务,镜像使用 httpd:2.2.31,然后将其更新到 httpd:2.2.32. 创建服务: docker service create --name my_web --replicas=3 httpd:2.2.31 将 serv

云原生数据库如何打造业务弹性

摘要: 云计算带来了业务弹性上的极大优势,阿里云数据库高级产品专家时慢从应用架构的变迁,客户实战案例,业务分析等方面详细介绍POLARDB,及如何利用POLARDB设计互联网创新型应用的数据库架构. 云计算带来了业务弹性上的极大优势,阿里云数据库高级产品专家时慢从应用架构的变迁,客户实战案例,业务分析等方面详细介绍POLARDB,及如何利用POLARDB设计互联网创新型应用的数据库架构. 应用架构的变迁--为什么我们需要超级MySQL?POLARDB跟MySQL是100%兼容的,有超越MySQL

无业务不伸缩,云计算有ESS

无业务不伸缩,云计算有ESS 一名网工的情怀 从初出茅庐到资深网工也用了十年时间吧,在专业的运维公司呆过.在政府外包单位干过.再到生产型企业最后在化工行业.有过泪.有过痛,辗转多年见过形形式式的人和事一转眼又过去了数年,从去年开始暗下决心开始进行新知识的学习和储备学习了Cisco运营商,学习了OCP.直到有一天听说了阿里云大学才知道原来云计算还可以这么玩--这段时间在阿里云计算的班教.导师指导下终于完成了教学内容和考试,在此特别感谢云大学里的那些认真负责的教辅人员感谢他们半夜十一点还在为我们解惑

详细聊聊k8s deployment的滚动更新(二)

一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 ● 相关的参数介绍: ??livenessProbe:存活性探测.判断pod是否已经停止 ??readinessProbe:就绪性探测.判断pod是否能够提供正常服务 ??maxSurge:在滚动更新过程中最多可以存在的pod数 ??maxUnavailable:在滚动更新过程中最多不可用的pod数 二.环境准备 组件 版本 OS Ubuntu 18.04.1 LTS docker 18.06.0-ce 三.准备镜像.yam

k8s弹性伸缩概念以及测试用例

k8s弹性伸缩概念以及测试用例 本文原文出处:https://juejin.im/post/5c82367ff265da2d85330d4f 弹性伸缩式k8s中的一大亮点功能,当负载大的时候,你可以对应用进行扩容,提升pod的副本数来应对大量的流量,当负载小的时候可以对应用进行缩容,以避免资源浪费.也可以让应用自动的进行扩容和缩容,这一功能有用.例如当微博出现了一个话题时,这个时候人们都去访问,此时他的服务器将无法处理大量的流量访问,这个时候就需要扩容,而当这个话题不在新鲜时,人们的访问流量也就

linux运维、架构之路-K8s滚动更新及回滚

一.滚动更新        应用程序一次只更新一小部分副本,更新成功后,再更新更多的副本,最终完成所有副本的更新. 滚动更新的优点:零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 1.创建三个副本Httpd服务,初始镜像为httpd:2.2.31,然后滚动更新至httpd:2.2.32 ###cat httpd.yaml### apiVersion: apps/v1beta2 kind: Deployment metadata: name: httpd spec: replica

深入玩转K8S之最懂实际应用场景的调度神器DaemonSet

首先什么是DaemonSet? 有些时候可能有些节点运行多个同类业务的Pod,有些节点上又没有这类Pod运行:而后台支撑型服务的核心关注点在K8s集群中的节点(物理机或虚拟机),要保证每个节点上都有一个此类Pod运行.节点可能是所有集群节点也可能是通过nodeSelector选定的一些特定节点. 那这时候就需要到了DaemonSet,DaemonSet是保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志.监控或者其他系统管理应用. 简单来说就是DaemonSet就是让一个应用在所有