一、问题

当我们将某应用的新版本发布到 K8s 的时候,经常会出现这样一个场景:

Pod 已经运行起来了(READY=1/1,STATUS=Running),但是 Pod 中的应用(例如:springboot)还在处于启动中的阶段。此时,如果有客户端的请求被转发到了该 Pod 上,那最终的结果将会是客户端收到一个类似“连接被拒绝”的返回。

二、原因分析

默认情况下(在我们未在 Pod 中未设置 ReadinessProbe 相关信息的时候),Kubelet 会认为 Pod 的 ReadinessProbe 探针永远返回 Success,即 Pod 一直都处于可以对外提供服务的状态,该 Pod 会立刻成为一个服务端点接收客户端的请求。由于此时内部的服务正处于启动中,所以就很有可能会出现本文开头出现的那个问题。

三、解决方案

在原因分析当中其实已经提到了解决方案,就是利用 K8s 提供的 ReadinessProbe(就绪探针)。通过该探针是否返回 SUCCESS, Kubelet 可以知道当前 Pod 是否已经准备好接收请求了。只有已经准备好了的 Pod 才会被安排对外接客(接收请求)。

试想下,我们对「服务A」加上了 ReadinessProbe,且「服务A」有三个 Pod 副本(A1,A2,A3)正在对外提供服务。这个时候,我们重新发布一下「服务A」,若新建的副本 A4 还未准备就绪,则之前的A1,A2,A3 还将继续对外提供服务。当 A4 已经准备就绪,此时 Ta 才会替换掉 A1,A2,A3 其中一个副本。这样,就避免了出现 A4 还没准备好,就开始接客的尴尬时刻了。

四、新问题(迷惑)

到现在为止是不是一切看起来都很美好?ReadinessProbe 很完美的解决了开始提到的那个问题。

可是,但是,但可是 … 现实还是狠狠的抽了我一个嘴巴。

先看下我们系统结构的一张简单示意图:

  • annoroad-xxx-front:前端应用
  • annoraod-xxx-server:对应前端的服务(BFF),有 3 个 Pod 副本,annoraod-xxx-server-1、annoraod-xxx-server-2、annoraod-xxx-server-3
  • springcloud-gateway:网关,有 3 个 Pod 副本,springcloud-gateway-1、springcloud-gateway-2、springcloud-gateway-3
  • 微服务A:提供实际的业务服务,有 3 个 Pod 副本,微服务A-1、微服务A-2、微服务A-3

请求的路径如下:

  1. 用户通过浏览器访问前端应用 annoroad-xxx-front
  2. 前端应用(annoroad-xxx-front)通过 SVC 路由到一个前端服务(annoroad-xxx-server-1)
  3. 前端服务(annoroad-xxx-server-1)通过 SVC 路由到一个 gateway(springcloud-gateway-3)
  4. 最后由该 gateway(springcloud-gateway-3) 路由到一个微服务A(微服务A-1)

我们分别在 annoroad-xxx-server、springcloud-gateway、微服务A、微服务B …. 上加上了ReadinessProbe(就绪探针),这样 服务准备就绪后再对外提供服务 的目标就能实现了吗?

让我来直接公布试验后的最终结果:

  1. annoroad-xxx-server、springcloud-gateway 可以达到预期的效果
  2. 微服务A、微服务B …… 不行!!!

之所以造成这个结果的原因是:

首先,annoroad-xxx-server、springcloud-gateway 的路由走的是 K8s 的 SVC,SVC 中的 Endpoint 描述了有关联的 Pod ,如果 Pod 的 Ready 状态变为 False,则 K8s 会自动将其从 Service 的 Endpoint 列表中删除,后续如果 Pod 的 Ready 状态又恢复了,那会将该 Pod 重新加到 Service 的 Endpoint 列表当中。所以, annoroad-xxx-server、springcloud-gateway 可以达到预期的效果。

我们再来说下从 gateway 到微服务。从 gateway 路由到 微服务A、微服务B …… 走的是 gateway 的 ribbon 路由,拉取的是 eureka 上的节点列表,也就是说只要节点已经注册到 eureka 上了,从 gateway就能路由到这个节点上了,即使这个节点在 K8s 中的还处于未就绪的状态。

为了更好的加以证明,我做了一个简单的实验,将某微服务的 ReadinessProbe 的 initialDelaySeconds 设置的时间长一点儿(模拟一直处于未就绪的状态)。然后,观察处于未就绪状态的该服务,启动完成后是否被注册到 eureka 上了,结果如下图:

从上图,我们可以看到 annoroad-alpha 的一个副本已经注册到 eureka 上了。但是在 K8s 容器内,该副本的 Ready 状态为0/1(未就绪)。此时,通过 gateway 访问该微服务(annoroad-alpha),是能够成功访问(完全绕过了 K8s 的就绪状态)。

四、最后

如果想再多了解些 ReadinessProbe(就绪探针)的相关概念,可以移步到我写的另外一篇文章《Pod健康检查和服务可用性检查》

K8s 之 ReadinessProbe(就绪探针)使用的迷惑相关推荐

  1. K8s之就绪探针和存活探针

    前言:集群中自带两种探针方式,先演示下各种探针的使用方法和功能表现 就绪探针(判断是否就绪,状态栏READY) 测试pod apiVersion: v1 kind: Pod metadata:name ...

  2. K8s Liveness/Readiness/Startup 探针机制

    官方参考文档 目录 前言 一.默认健康检测 1.1 restartPolicy 1.2 测试案例 二.Liveness 三.Readiness 四.Startup 前言 玩过 Docker Swarm ...

  3. pod健康检查之容器的存活探针、就绪探针、启动探针

    前言 环境:centos7.9 docker-ce-20.10.9 kubernetes-version v1.22.6 为什么需要存活探针和就绪探针 在前面我们介绍过,可以通过配置restartPo ...

  4. Kubernetes--k8s---存活探针和就绪探针的最佳实践

    我们在上一篇文章中学习了 Kubernetes–k8s-滚动更新–零停机不停服发布服务 里面涉及到 使用 存活探针和 就绪探针. 但是 这两个探针 具体怎么设置,是不是用同一个 api作为检查点,还是 ...

  5. Kubernetes 存活探针和就绪探针的最佳实践

    Kubernetes存活探针和就绪探针的最佳实践 [编者的话]Kubernetes提供了两种探针来检查容器的状态,Liveliness和Readiness,根据官方文档,Liveliness探针是为了 ...

  6. Kubernetes存活探针和就绪探针的最佳实践

    在Kubernetes中,Pod是Kubernetes创建及管理的最小的可部署的计算单元,一个Pod由一个或者多个容器(Docker,rocket等等)组成,这些容器共享内存,网络以及运行容器的方式. ...

  7. SpringBoot中就绪探针和存活探针

    文章目录 1.介绍 2.Kubernetes探针 3.就绪探针和存活探针在Actuator 3.1.就绪和活跃状态转换 4. 管理应用程序可用性 4.1. 更新可用性状态 4.2.监听变化 1.介绍 ...

  8. kubernetes学习笔记-就绪探针20220405

    1.介绍就绪探针 就绪探测器会定期调用,并确定特定的pod是否接收客户端请求.当容器的准备就绪探测返回成功时,表示容器已经准备好接收请求 就绪探针类型3种: 1)Exec探针,执行进程的地方,容器的状 ...

  9. @kubernetes(k8s)pod服务探针(健康检查)及回调钩子HOOK详解

    文章目录 服务探针与回调hook(健康检查) 一.存活性探针(LivenessProbe) 1.存活型检查基本用法 2.存活性探针三种使用方式 [ExecAction] [TCPSocketActio ...

最新文章

  1. 下一次火星任务,中国要放飞自己的无人机
  2. 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
  3. Linux wget命令用法详解
  4. 我的世界minecraft-Python3.9编程(3)-创建一根柱子
  5. [react] 在构造函数中调用super(props)的目的是什么?
  6. Kafka 详细配置参数说明
  7. 安装mysql 5.1 详细步骤
  8. Android 增量更新实例(Smart App Updates)
  9. 六爻预测,前沿科学?伪科学?
  10. 解读HTTP/2与HTTP/3 的新特性(推荐)
  11. 知乎python小项目_python项目知乎
  12. SentiLR:Linguistic Knowledge Enhanced Language Representation for Sentiment Analysis 论文阅读笔记
  13. php 高洛峰 正则,PHP 自定义 Smarty 模板引擎类 高洛峰 细说PHP
  14. KCNScrew Pack for mac(Mac序列号查询软件)
  15. Universal-Image-Loader 图片来源于drawable改动 Scheme.DRAWABLE.wrap(R.drawable.img)报错
  16. 破解宝塔所有插件只需一句代码
  17. 像素鸟 app 的设计与实现
  18. 可以储存照片的字段类型是_如果将学生的“照片”存储在表中,则数据应采用的字段类型为...
  19. 魔兽世界8.0哪个服务器稳定,魔兽世界8.0怀旧服是哪个版本 8.0怀旧服详细介绍...
  20. 海思Hi3559AV100 SDK完整编译流程

热门文章

  1. 基于MATLAB卡尔曼滤波器实现动态人物的跟踪检测
  2. ADB有线连接车机连不上的解决方案2
  3. face_recognition小实战:显示未知图片中已知人物的脸
  4. 字符串(一) | 剑指 Offer 58 - II. 左旋转字符串、541. 反转字符串 II、剑指 Offer 05. 替换空格、151. 反转字符串中的单词
  5. bilibili缓存视频的位置
  6. JS如何在高德地图多边形覆盖物填充平行折线的算法
  7. 搭建L2TP-***
  8. 企业微信公众号运营引流的三大法宝
  9. 基于分位数随机森林预测模型QRF建立多特征输入单个因变量输出的拟合预测模型
  10. codeblocks的官网下载与安装