kubernetes的三种探针

startupprobe: k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动,如果配置了startuprobe,就会先禁用其他的探测,直到它成功为止,成功后将不再进行探测。

ReadinessProbe: 一般用于探测容器内的程序是否健康,它的返回值如果为success,那么就代表这个容器已经完成启动,并且程序已经是可以接受流量的状态.

LivenessProbe:用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行相应的处理,如果没有配置该探针,默认就是success!

pod探针的检测方式

startupProbe   启动检查
livenessProbe 存活检查
readinessProbe 就绪检查 # startupProbe 启动检查
----------------------------------
startupProbe: #健康检查方式:[readinessProbe,livenessProbe,StartupProbe]
failureThreshold: 3 #检测失败3次表示未就绪
httpGet: #请求方式
path: /ready #请求路径
port: 8182 #请求端口
scheme: HTTP #请求协议
periodSeconds: 10 #检测间隔
successThreshold: 1 #检查成功为2次表示就绪
timeoutSeconds: 1 #检测失败1次表示未就绪
---------------------------------- # livenessProbe 存活检查 #案例1:
----------------------------------
livenessProbe: #健康检查方式:[readinessProbe,livenessProbe,StartupProbe]
failureThreshold: 5 #检测失败5次表示未就绪
httpGet: #请求方式
path: /health #请求路径
port: 8080 #请求端口
scheme: HTTP #请求协议
initialDelaySeconds: 60 #初始化时间
periodSeconds: 10 #检测间隔
successThreshold: 1 #检查成功为2次表示就绪
timeoutSeconds: 5 #检测失败1次表示未就绪 livenessProbe: #健康检查方式:[readinessProbe,livenessProbe,StartupProbe]
failureThreshold: 5 #检测失败5次表示未就绪
httpGet: #请求方式
path: /health #请求路径
port: 8080 #请求端口
initialDelaySeconds: 60 #初始化时间
periodSeconds: 10 #检测间隔
successThreshold: 1 #检查成功为2次表示就绪
timeoutSeconds: 5 #检测失败1次表示未就绪 ---------------------------------- 案例2:
----------------------------------
livenessProbe:
httpGet:
path: /healthz
port: liveness-port
failureThreshold: 1
periodSeconds: 60
terminationGracePeriodSeconds: 60 #宽限时间,不能用于设置就绪态探针,它将被 API 服务器拒绝。
---------------------------------- # readinessProbe 就绪检查
----------------------------------
案例1[get方式]:
readinessProbe: #健康检查方式:[readinessProbe,livenessProbe,StartupProbe]
failureThreshold: 3 #检测失败3次表示未就绪
httpGet: #请求方式
path: /ready #请求路径
port: 8181 #请求端口
scheme: HTTP #请求协议
periodSeconds: 10 #检测间隔
successThreshold: 1 #检查成功为2次表示就绪
timeoutSeconds: 1 #检测失败1次表示未就绪 案例2 [检查文件内容]:
readinessProbe: #检查方式
exec: #使用命令检查
command: #指令
- cat #指令
- /etc/hosts #指令
initialDelaySeconds: 5 #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒,最小值是 0。
timeoutSeconds: 2 #检测失败1次表示未就绪
successThreshold: 3 #检查成功为2次表示就绪
failureThreshold: 2 #检测失败重试次数
periodSeconds: 5 #检测间隔
---------------------------------- initialDelaySeconds:容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒,最小值是 0。
periodSeconds:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。
successThreshold:探测器在失败后,被视为成功的最小连续成功数。默认值是 1 存活和启动探测的这个值必须是1 最小值是 1
failureThreshold:当探测失败时,Kubernetes 的重试次数。 存活探测情况下的放弃就意味着重新启动容器。 就绪探测情况下的放弃 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1。 #注意:
配置了 startupProbe 之后,livenessProbe和readinessProbe参数将会被暂时禁用,直到程序被检测到启动完成了livenessProbe,readinessProbe才会被启用
在程序启动较慢的时候可以配置startupProbe参数。

启动案例

StartupProbe案例[检测容器内进程是否完成启动]

参考文档: https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

apiVersion: v1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据
name: nginx01 # 必选,符合RFC 1035规范的Pod名称
labels: # 可选,标签选择器,一般用于过滤和区分Pod
app: nginx
role: frontend # 可以写多个
annotations: # 可选,注释列表,可以写多个
app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: nginx01 # 必选,符合RFC 1035规范的容器名称
image: nginx:latest # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
command: # 可选,容器启动执行的命令
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置列表
- name: TZ # 变量名
value: Asia/Shanghai # 变量的值
- name: LANG
value: en_US.utf8
startupProbe: # 可选,检测容器内进程是否完成启动。注意三种检查方式同时只能使用一种。
httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
path: /api/successStart # 检查路径
port: 80
restartPolicy: Always # 可选,默认为Always
root@k8s-master01[23:26:10]:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-startupprobe 0/1 Running 1 79s 创建后会无法启动,原因是无法检测到这个地址,通过日志可以看到:
2021/06/25 23:26:02 [error] 7#7: *3 open() "/usr/share/nginx/html/api/successStart" failed (2: No such file or directory), client: 192.168.3.84, server: localhost, request: "GET /api/successStart HTTP/1.1", host: "172.17.125.25:80"

ReadinessProbe案例 [可以提供服务的状态]

参考文档: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

apiVersion: v1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据
name: nginx-read # 必选,符合RFC 1035规范的Pod名称
labels: # 可选,标签选择器,一般用于过滤和区分Pod
app: nginx
role: frontend # 可以写多个
annotations: # 可选,注释列表,可以写多个
app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: nginx-read # 必选,符合RFC 1035规范的容器名称
image: nginx:latest # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
command: # 可选,容器启动执行的命令
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置列表
- name: TZ # 变量名
value: Asia/Shanghai # 变量的值
- name: LANG
value: en_US.utf8
readinessProbe:
httpGet:
path: /
port: 80
restartPolicy: Always # 可选,默认为Always
kubectl apply -f  readinessProbe-pod.yaml

LivenessProbe检测容器中的应用是否正常运行

参考文档:https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

apiVersion: v1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据
name: nginx-live # 必选,符合RFC 1035规范的Pod名称
labels: # 可选,标签选择器,一般用于过滤和区分Pod
app: nginx
role: frontend # 可以写多个
annotations: # 可选,注释列表,可以写多个
app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: nginx-live # 必选,符合RFC 1035规范的容器名称
image: nginx:latest # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
command: # 可选,容器启动执行的命令
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置列表
- name: TZ # 变量名
value: Asia/Shanghai # 变量的值
- name: LANG
value: en_US.utf8
livenessProbe:
httpGet:
path: /
port: 80
kubectl apply -f  livenessProbe.yaml

#检查 nginx-live pod是否正常
root@k8s-master01[23:41:31]:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-live 1/1 Running 0 35s
nginx-read 1/1 Running 0 10m
nginx-startupprobe 0/1 Running 9 16m

混合配置

readinessProbe+livenessProbe案例

apiVersion: v1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据
name: nginx-read # 必选,符合RFC 1035规范的Pod名称
labels: # 可选,标签选择器,一般用于过滤和区分Pod
app: nginx
role: frontend # 可以写多个
annotations: # 可选,注释列表,可以写多个
app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: nginx-read # 必选,符合RFC 1035规范的容器名称
image: nginx:latest # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
command: # 可选,容器启动执行的命令
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置列表
- name: TZ # 变量名
value: Asia/Shanghai # 变量的值
- name: LANG
value: en_US.utf8
readinessProbe:
exec:
command:
- cat
- /etc/hosts
initialDelaySeconds: 5
timeoutSeconds: 2
successThreshold: 3
failureThreshold: 2
periodSeconds: 5 livenessProbe: #健康检查方式:[readinessProbe,livenessProbe,StartupProbe]
failureThreshold: 5 #检测失败5次表示未就绪
httpGet: #请求方式
path: /health #请求路径
port: 8080 #请求端口
scheme: HTTP ##请求协议
initialDelaySeconds: 60 #初始化时间
periodSeconds: 10 #检测间隔
successThreshold: 1 #检查成功为2次表示就绪
timeoutSeconds: 5 #检测失败1次表示未就绪

startupprobe+readinessProbe+ 混合案例

apiVersion: v1                # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据
name: read-startup # 必选,符合RFC 1035规范的Pod名称
labels: # 可选,标签选择器,一般用于过滤和区分Pod
app: nginx
role: frontend # 可以写多个
annotations: # 可选,注释列表,可以写多个
app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: read-startup # 必选,符合RFC 1035规范的容器名称
image: nginx:latest # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
command: # 可选,容器启动执行的命令
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置列表
- name: TZ # 变量名
value: Asia/Shanghai # 变量的值
- name: LANG
value: en_US.utf8
readinessProbe:
exec:
command:
- cat
- /etc/hosts
initialDelaySeconds: 5
timeoutSeconds: 2
successThreshold: 3
failureThreshold: 2
periodSeconds: 5 startupProbe:
httpGet:
path: /
port: 80
failureThreshold: 30
periodSeconds: 10

startupprobe+readinessProbe+ livenessProbe混合案例

apiVersion: v1                # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据
name: read-startup # 必选,符合RFC 1035规范的Pod名称
labels: # 可选,标签选择器,一般用于过滤和区分Pod
app: nginx
role: frontend # 可以写多个
annotations: # 可选,注释列表,可以写多个
app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: read-startup # 必选,符合RFC 1035规范的容器名称
image: nginx:latest # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
command: # 可选,容器启动执行的命令
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置列表
- name: TZ # 变量名
value: Asia/Shanghai # 变量的值
- name: LANG
value: en_US.utf8
readinessProbe:
exec:
command:
- cat
- /etc/hosts
initialDelaySeconds: 5
timeoutSeconds: 2
successThreshold: 3
failureThreshold: 2
periodSeconds: 5 startupProbe:
httpGet:
path: /
port: 80
failureThreshold: 30
periodSeconds: 10 livenessProbe:
httpGet:
path: /healthz
port: 80
failureThreshold: 1
periodSeconds: 10

检测时间计算

准确的时间计算:每次检查的间隔是10秒,最长超时时间是5秒,也就是单次检查应该是10 + 5 = 15秒(periodSeconds + timeoutSeconds),并不是10 * 5
所以最长的重启时间为(10 + 5)* 5
(periodSeconds + timeoutSeconds) * failureThreshold 此时又分为了两种情况:
1. 首次启动时:最长重启时间需要加上initialDelaySeconds,因为需要等待initialDelaySeconds秒后才会执行健康检查。最长重启时间:(periodSeconds + timeoutSeconds) * failureThreshold + initialDelaySeconds
2. 程序启动完成后:
此时不需要计入initialDelaySeconds,最长重启时间:(periodSeconds + timeoutSeconds) * failureThreshold

kubernetes的三种探针startupprobe,ReadinessProbe,LivenessProbe记录的更多相关文章

  1. Kubernetes的三种探针

    k8s支持存活livenessProbe和就绪readinessProbe两种探针 两种探针都支持以下三种方式 1.exec 通过执行shell命令的方式,判断退出状态码是否是0 示例 exec: c ...

  2. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress(转发)

    原文 http://cloud.51cto.com/art/201804/570386.htm Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress 最近 ...

  3. 一个简单的例子理解Kubernetes的三种IP地址类型

    很多Kubernetes的初学者对Kubernetes里面三种不同的IP地址和工作机制理解得不是很清楚. 本文我们通过一个最简单的例子来学习. 用如下命令行创建一个基于nginx的deployment ...

  4. Kubernetes service 三种类型/NodePort端口固定

    Kubernetes service 三种类型 • ClusterIP:默认,分配一个集群内部可以访问的虚拟IP(VIP)• NodePort:在每个Node上分配一个端口作为外部访问入口• Load ...

  5. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress

    NodePort,LoadBalancer和Ingress之间的区别.它们都是将集群外部流量导入到集群内的方式,只是实现方式不同. ClusterIP ClusterIP服务是Kubernetes的默 ...

  6. 在本地运行Kubernetes的3种主流方式

    作者简介 Chris Tozzi,曾担任记者和Linux管理员.对开源技术.敏捷基础架构以及网络问题兴趣浓厚.目前担任高级内容编辑,并且是Fixate IO的DevOps分析师. 原文链接: http ...

  7. 不吹不黑,今天我们来聊一聊 Kubernetes 落地的三种方式

    作者 | 王国梁  Kubernetes 社区成员与项目维护者原文标题<Kubernetes 应用之道:让 Kubernetes落地的"三板斧">,首发于知乎专栏:进击 ...

  8. Kubernetes 对象管理的三种方式

    Kubernetes 中文文档 1. Kubernetes 对象管理的三种方式对比 Kubernetes 中的对象管理方式,根据对象配置信息的位置不同可以分为两大类: 命令式:对象的参数通过命令指定 ...

  9. Kubernetes系列三:二进制安装Kubernetes环境

    安装环境: # 三个节点信息 192.168.31.11 主机名:env11 角色:部署Master节点/Node节点/ETCD节点 192.168.31.12 主机名:env12 角色:部署Node ...

  10. Kubernetes 存活、就绪探针

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

随机推荐

  1. Effective Python:简介

    作者:布雷特·斯拉特金 本书的大部分范例代码都遵循Python 3.7版本的语法规范,Python 3.7发布于2018年6月.另外,书里还会给出一些采用Python 3.8语法规范所写的范例,让大家 ...

  2. Spark SQL 抽样函数 ——TABLESAMPLE 的坑点

    最近需要实现一段 Spark SQL 逻辑,对数据集进行抽样指定的行数. 由于数据集较大,刚开始的逻辑是,取窗口函数随机排序后 row_number 的前 n 行.但运行速度较慢,所以想起了 TABL ...

  3. ECharts海量数据渲染解决卡顿的4种方式

    场景 周五进行需求评审的时候: 出现了一个图表,本身一个图表本没有什么稀奇的: 可是产品经理在图表的上的备注,让我觉得这个事情并不简单: 那个图表的时间跨度可以是月,年,而且时间间隔很短: 这让我意识 ...

  4. 如何做好技术 Team Leader?

    简介: 作为一个技术TL(Team Leader),除了自身技能,还会面临诸多团队管理上的困难和挑战.如何定义和明确团队的目标?怎样建立优秀的工程文化?让团队长期发挥战斗力和创新能力的核心是什么?本文 ...

  5. 深度解析|基于 eBPF 的 Kubernetes 一站式可观测性系统

    ​简介:阿里云 Kubernetes 可观测性是一套针对 Kubernetes 集群开发的一站式可观测性产品.基于 Kubernetes 集群下的指标.应用链路.日志和事件,阿里云 Kubernete ...

  6. 实时数仓入门训练营:实时计算 Flink 版 SQL 实践

    ​简介: <实时数仓入门训练营>由阿里云研究员王峰.阿里云资深技术专家金晓军.阿里云高级产品专家刘一鸣等实时计算 Flink 版和 Hologres 的多名技术/产品一线专家齐上阵,合力搭 ...

  7. [Trading] 人物: 陈向忠日内交易技术核心 - 趋势形态与成交量

    分时图判断趋势(开仓方向) 只要是低点不断抬高的,就是上涨趋势,高点是否提高是其次的. 只要是高点不断降低的那就是下降趋势,假如低点也在不断降低,那么这样的下降趋势就更加完美一些. 很多人就是看对了趋 ...

  8. [FAQ] docker-ce depends on containerd.io, docker-ce depends on docker-ce-cli

    安装 docker 缺少依赖会提示你安装,一般是以下两个: Package containerd.io is not installed Package docker-ce-cli is not in ...

  9. Raft 共识算法3-日志复制

    Raft 共识算法3-日志复制 Raft算法中译版地址:https://object.redisant.com/doc/raft中译版-2023年4月23日.pdf 英原论文地址:https://ra ...

  10. vue.js+canvas实现随机验证码

    登录注册啥的,不需要下载插件,上图: 代码: <template> <div class="about"> <p>当前验证码:{{codeStr ...