全栈工程师开发手册 (作者:栾鹏)
架构系列文章


本文将向您展示如何配置容器的存活和可读性探针。

kubelet 使用 liveness probe(存活探针)来确定何时重启容器。例如,当应用程序处于运行状态但无法做进一步操作,liveness 探针将捕获到 deadlock,重启处于该状态下的容器,使应用程序在存在 bug 的情况下依然能够继续运行下去。

Kubelet 使用 readiness probe(就绪探针)来确定容器是否已经就绪可以接受流量。只有当 Pod 中的容器都处于就绪状态时 kubelet 才会认定该 Pod处于就绪状态。该信号的作用是控制哪些 Pod应该作为service的后端。如果 Pod 处于非就绪状态,那么它们将会被从 service 的 load balancer中移除。

定义 liveness 命令

许多长时间运行的应用程序最终会转换到 broken 状态,除非重新启动,否则无法恢复。Kubernetes 提供了 liveness probe 来检测和补救这种情况。

在本次练习将基于 gcr.io/google_containers/busybox镜像创建运行一个容器的 Pod。以下是 Pod 的配置文件exec-liveness.yaml

apiVersion: v1
kind: Pod
metadata:labels:test: livenessname: liveness-exec
spec:containers:- name: livenessimage: k8s.gcr.io/busyboxargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600livenessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 5periodSeconds: 5

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

定义 liveness HTTP请求

我们还可以使用 HTTP GET 请求作为 liveness probe。下面是一个基于gcr.io/google_containers/liveness镜像运行了一个容器的 Pod 的例子http-liveness.yaml:

apiVersion: v1
kind: Pod
metadata:labels:test: livenessname: liveness-http
spec:containers:- name: livenessimage: k8s.gcr.io/livenessargs:- /serverlivenessProbe:httpGet:path: /healthzport: 8080httpHeaders:- name: X-Custom-Headervalue: AwesomeinitialDelaySeconds: 3periodSeconds: 3

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

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

定义 TCP liveness probe

第三种 liveness probe 使用 TCP Socket。 使用此配置,kubelet 将尝试在指定端口上打开容器的套接字。 如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。

apiVersion: v1
kind: Pod
metadata:name: goproxylabels:app: goproxy
spec:containers:- name: goproxyimage: k8s.gcr.io/goproxy:0.1ports:- containerPort: 8080readinessProbe:tcpSocket:port: 8080initialDelaySeconds: 5periodSeconds: 10livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 15periodSeconds: 20

如您所见,TCP 检查的配置与 HTTP 检查非常相似。 此示例同时使用了 readiness 和 liveness probe。 容器启动后5秒钟,kubelet 将发送第一个 readiness probe。 这将尝试连接到端口8080上的 goproxy 容器。如果探测成功,则该 pod 将被标记为就绪。Kubelet 将每隔10秒钟执行一次该检查。

除了 readiness probe之外,该配置还包括 liveness probe。 容器启动15秒后,kubelet 将运行第一个 liveness probe。 就像readiness probe一样,这将尝试连接到 goproxy 容器上的8080端口。如果 liveness probe 失败,容器将重新启动。

使用命名的端口

可以使用命名的 ContainerPort 作为 HTTP 或 TCP liveness检查:

ports:
- name: liveness-portcontainerPort: 8080hostPort: 8080livenessProbe:httpGet:path: /healthzport: liveness-port

定义readiness probe

有时,应用程序暂时无法对外部流量提供服务。 例如,应用程序可能需要在启动期间加载大量数据或配置文件。 在这种情况下,您不想杀死应用程序,也不想发送请求。 Kubernetes提供了readiness probe来检测和减轻这些情况。 Pod中的容器可以报告自己还没有准备,不能处理Kubernetes服务发送过来的流量。

Readiness probe的配置跟liveness probe很像。唯一的不同是使用 readinessProbe 而不是livenessProbe。

readinessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 5periodSeconds: 5

Readiness probe 的 HTTP 和 TCP 的探测器配置跟 liveness probe 一样。

Readiness 和 livenss probe 可以并行用于同一容器。 使用两者可以确保流量无法到达未准备好的容器,并且容器在失败时重新启动。

Configure Probes配置探针

配置 Probe

Probe 中有很多精确和详细的配置,通过它们您能准确的控制 liveness 和 readiness 检查:

  • initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒。
  • periodSeconds:执行探测的频率。默认是10秒,最小1秒。
  • timeoutSeconds:探测超时时间。默认1秒,最小1秒。
  • successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1。对于 liveness 必须是 1。最小值是 1。
  • failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3。最小值是 1。

HTTP probe 中可以给 httpGet设置其他配置项:

  • host:连接的主机名,默认连接到 pod 的 IP。您可能想在 http header 中设置 “Host” 而不是使用 IP。
  • scheme:连接使用的 schema,默认HTTP。
  • path: 访问的HTTP server 的 path。
  • httpHeaders:自定义请求的 header。HTTP运行重复的 header。
  • port:访问的容器的端口名字或者端口号。端口号必须介于 1 和 65525 之间。

对于 HTTP 探测器,kubelet 向指定的路径和端口发送 HTTP 请求以执行检查。 Kubelet 将 probe 发送到容器的 IP 地址,除非地址被httpGet中的可选host字段覆盖。 在大多数情况下,您不想设置主机字段。 有一种情况下您可以设置它。 假设容器在127.0.0.1上侦听,并且 Pod 的hostNetwork字段为 true。 然后,在httpGet下的host应该设置为127.0.0.1。 如果您的 pod 依赖于虚拟主机,这可能是更常见的情况,您不应该是用host,而是应该在httpHeaders中设置Host头。

pod配置Liveness和Readiness探针相关推荐

  1. Kubernetes Liveness and Readiness Probes

    在设计关键任务.高可用应用程序时,弹性是要考虑的最重要因素之一. 当应用程序可以快速从故障中恢复时,它便具有弹性. 云原生应用程序通常设计为使用微服务架构,其中每个组件都位于容器中.为了确保Kuber ...

  2. Liveness和Readiness两种Health Check手段在Kubernetes中的使用

    一.概述 强大的自愈能力是Kubernetes这一类容器编排管理引擎的一个重要特性.通常情况下,Kubernetes通过重启发生故障的容器来实现自愈.除此之外,我们还有其他方式来实现基于Kuberne ...

  3. K8S Learning(10)——Pod配置

    pod.spec.containers属性是pod配置中最为关键的一项配置. kubectl explain pod.spec.containers KIND: Pod VERSION: v1 RES ...

  4. 容器编排技术 -- Kubernetes 给 Pod 配置服务质量等级

    容器编排技术 -- Kubernetes 给 Pod 配置服务质量等级 1 Before you begin 2 QoS 等级 3 创建一个命名空间 4 创建一个 Pod 并分配 QoS 等级为 Gu ...

  5. K8SPod详解之pod配置

    K8SPod详解之pod配置 Pod定义 Pod配置 pod.spec.containers 基本配置 镜像拉取 启动命令 环境变量 端口设置 资源配额 每个pod中都可以包含一个或者多个容器,这些容 ...

  6. 【kubernetes详解05】-Pod详解之Pod配置

    本文内容说明:详细介绍Pod资源的各种配置(yaml)和原理 一.Pod介绍之结构和定义 1.Pod结构 如上图(Pod结构图),每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程 ...

  7. kubernetes之容器探针(liveness and readiness probe)

    1.为什么需要容器探针 只要将pod调度到某个节点,Kubelet将运行pod的容器,如果该pod的容器有一个或所有的都终止运行(容器的主进程崩溃),Kubelet将重新启动容器,那么即使应用程序本身 ...

  8. linux探针,存活探针(Liveness)、就绪探针(Readiness)、启动探针(Startup)、容器钩子

    一.探针 1.1.探针类型 LivenessProbe 用于判断容器是否存活(running状态),如果LivenessProbe探针探测到容器不健康,则kubelet杀掉该容器,并根据容器的重启策略 ...

  9. pod进阶(资源管理和探针)

    文章目录 一: Pod的资源限制 1.1 概念 1.1.1 什么是pod的计算资源显稚嫩 CPU和内存的Requests和Limits的特点 1.2 pod 之间,和容器之间的通信 1.3 官网中的示 ...

最新文章

  1. windows版本git的下载地址
  2. (看这一篇就够了)基本数据类型的赋值与引用类型赋值的区别
  3. 是时候学习生成对抗网络了,李宏毅老师GAN视频教程下载
  4. 什么是公有云、私有云、混合云?
  5. mysql 5.1 1067,mysql服务1067错误多种解决方案汇总
  6. 【codeup22562】最长回文子串(dp基础题)
  7. firefox最新版的firebug、firepath功能替代
  8. Android .apk逆向工程(安装篇):如何正确使用dex2jar
  9. uniapp 让支付触手可及,封装了微信支付、QQ支付、支付宝支付、京东支付、银联支付常用的支付方式以及各种常用的接口
  10. Axure RP 9
  11. LeaRun敏捷开发框架快速设计表单
  12. 干货分享:【IT-PMP学堂】PMP 文档与配置管理
  13. UEFI服务器PXE网络安装CentOS7.5
  14. sel4源码解析(三) - sel4系统调用处理流程
  15. 安装phpcs和php-cs-fixer
  16. 勾股数规律(任意三个数能够满足勾股定理需要满足的条件)
  17. java自由职业者_自由职业者的7个重要技巧
  18. 会心自选-淘宝店铺装修和转化率的关系
  19. 计算机局域网络具有哪些功能,局域网的功能有哪些
  20. 【学院新生研讨】关于手机使用情况的调研报告

热门文章

  1. python练手经典100例-Python练手项目实例汇总(附源码下载)
  2. python最适合做什么-python学完之后比较适合哪些职业工作呢?
  3. c语言中eles后面分号的作用,C语言 if else 语句详细讲解
  4. 【数据结构和算法笔记】KMP算法介绍
  5. Pixelmetrix :OTT Media Grinder (OTT TV 质量评价设备)
  6. php字符是汉字还是字符,php判断字符串中是否包含中文汉字和获得字符串中的汉字...
  7. Mysql连接报错:1130-host ... is not allowed to connect to this MySql server
  8. 搜索,贪心,DP,三者的区别和联系
  9. 【CCCC】L2-028 秀恩爱分得快 (25分),模拟题
  10. 2018 “百度之星”程序设计大赛 - 初赛(A)P1002度度熊学队列(双端队列模拟,STL)