[Kubernetes]容器健康检查和恢复机制
在Kubernetes中,可以为Pod里的容器定义一个健康检查探针(Probe),这样Kubernetes会根据这个Probe的返回值决定这个容器的状态,而不是直接以容器是否允许(来自Docker返回的信息)作为依据。
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: test-liveness-exec
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep ; rm -rf /tmp/healthy; sleep
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds:
periodSeconds:
这个Pod的容器在启动之后做的第一件事是在/tmp目录下创建一个healthy文件,以此作为自己已经正常运行的标识,而30s过后它会把这个文件删除掉。同时还定义了一个livenessProbe,类型是exec,它会在容器启动后执行指定的命令:“cat /tmp/healthy”,如果这个文件存在,这条命令返回值就是0,Pod就会认为这个容器不仅已经启动,而且是健康的,这个健康检查在启动5s后开始执行,每5s执行一次。
$ kubectl create -f test-liveness-exec.yaml
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
test-liveness-exec / Running 10s ####30s后
$ kubectl describe pod test-liveness-exec
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
2s 2s {kubelet worker0} spec.containers{liveness} Warning Unhealthy Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
$ kubectl get pod test-liveness-exec
NAME READY STATUS RESTARTS AGE
liveness-exec / Running 1m
可以看到,健康检查报告容器不健康,但是Pod保存了running状态,这是为什么呢?
认真看可以发现。RESTARTS字段已经变成1了,即这个异常的容器已经被Kubernetes重启了,在这个过程中,Pod保存Running状态不变。Kubernetes没有Docker的Stop语义,所以虽然是重启,实际却是重新创建了容器,这个功能就是Kubernetes里的Pod恢复机制(restartPolicy),它是Pod的Spec部分的一个标准字段(pod.spec.restartPolicy),默认值为Always,作为用户可以设置Pod的恢复策略
- Always:任何情况下,只要容器不在运行状态,就自动重启容器(合理设置,如果只计算1+1=2,计算完成后退出,强制重启毫无意义)
- OnFailure:只在容器异常时才自动重启容器
- Never:从来不重启容器(如要关心容器退出后的日志、文件和目录,就需要设置为NEVER,否则可能丢失)
Pod的恢复过程,永远都是发送在当前节点上,而不会跑到别的节点上去,即如果这个宿主机宕机了,这个pod也不会主动迁移到其他节点上去。如果想让Pod出现在其他可用节点上,就必须用Deployment这样的控制器来管理Pod。
Kubernetes中restartPolicy和Pod里容器的状态以及Pod状态的对应关系的基本设计原理有两个:
- 只要Pod的restartPolicy指定的策略允许重启异常的容器(如Always),那么这个Pod就会保持running状态,并进行容器重启,否则Pod会进入Failed状态。
- 对于包含多个容器的Pod,只有它里面所有的容器都进入异常状态后,Pod才会进入Failed状态,在此之前,Pod都是running状态,此时Pod的REDY字段会显示正常容器的个数。
所以假如一个Pod里只有一个容器,然后这个容器异常退出了,那么只有当restartPolicy=Never时,这个Pod才会进入Failed状态,而其他情况下,由于kubernetes都可以重启这个容器,所以Pod状态保持running不变。如果这个Pod有多个容器,仅有一个容器异常退出,它始终保持Running状态,哪怕即使restartPolicy=Never,也只有当容器也异常退出之后,这个Pod才会进入Failed状态。
除了在容器中执行命令外,livenessProbe也可以定义为发起HTTP或者TCP请求的方式,定义格式如下:
...
livenessProbe:
httpGet:
path: /healthz
port:
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds:
periodSeconds:
...
livenessProbe:
tcpSocket:
port:
initialDelaySeconds:
periodSeconds:
[Kubernetes]容器健康检查和恢复机制的更多相关文章
- nginx 健康检查和负载均衡机制分析
nginx 是优秀的反向代理服务器,这里主要讲它的健康检查和负载均衡机制,以及这种机制带来的问题.所谓健康检查,就是当后端出现问题(具体什么叫出现问题,依赖 于具体实现,各个实现定义不一样),不再往这 ...
- 分析NGINX 健康检查和负载均衡机制
nginx 是优秀的反向代理服务器,这里主要讲它的健康检查和负载均衡机制,以及这种机制带来的问题.所谓健康检查,就是当后端出现问题(具体什么叫出现问题,依赖于具体实现,各个实现定义不一样),不再往这个 ...
- 【kubernetes入门到精通】Kubernetes的健康监测机制以及常见ExitCode问题分析「探索篇」
kubernetes进行Killed我们服务的问题背景 无论是在微服务体系还是云原生体系的开发迭代过程中,通常都会以Kubernetes进行容器化部署,但是这也往往带来了很多意外的场景和情况.例如,虽 ...
- Kubernetes容器集群管理环境 - 完整部署(上篇)
Kubernetes(通常称为"K8S")是Google开源的容器集群管理系统.其设计目标是在主机集群之间提供一个能够自动化部署.可拓展.应用容器可运营的平台.Kubernetes ...
- K8S节点异常怎么办?TKE"节点健康检查和自愈"来帮忙
节点健康检测 意义 在K8S集群运行的过程中,节点常常会因为运行时组件的问题.内核死锁.资源不足等各种各样的原因不可用.Kubelet默认对节点的PIDPressure.MemoryPressure. ...
- Pod 健康检查和服务可用性检查
Kubernetes 对 Pod 的健康状态可以通过两类探针来检查:LivenessProbe 和 ReadinessProbe,kubelet 定期执行这两类探针来针对容器的健康状况. Livene ...
- kubernetes容器编排系统介绍
版权声明:本文由turboxu原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/152 来源:腾云阁 https://www. ...
- 一文带你看透kubernetes 容器编排系统
本文由云+社区发表 作者:turboxu Kubernetes作为容器编排生态圈中重要一员,是Google大规模容器管理系统borg的开源版本实现,吸收借鉴了google过去十年间在生产环境上所学到的 ...
- Kubernetes容器上下文环境
目录贴:Kubernetes学习系列 下面我们将主要介绍运行在Kubernetes集群中的容器所能够感知到的上下文环境,以及容器是如何获知这些信息的. 首先,Kubernetes提供了一个能够让容器感 ...
随机推荐
- ES-Mac OS环境搭建(2)
下载 进入官网,选择downloads进入下载页. 选择elasticsaerch下载. 新的页面中,下拉选择历史版本. 下拉选择elasticsearch和版本,然后点击下载. 选择MACOS/LI ...
- this的三个要点
1.this的指向是什么? 指向对象 2.this可以书写在哪里? 可以写在全局,也可以写在函数里 三种写在函数里的方式: 2.1 this可变 function f() { this.name = ...
- 第5章 引用类型---JS红宝书书摘系列笔记
在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,描述的是一类对象所具有的属性和方法.而对象是某个特定引用类型的实例. 一.Object类型 可以通过Object构造函数创 ...
- Fragment(一)--Fragment用法常见问题
fragment notes fragment相关内容包括 基本定义与使用 回退栈内部实现 fragment通信(与activity 与fragment) DialogFragment VP + Fr ...
- FPGA的嵌入式RAM
FPGA中的嵌入式RAM分为两种:专用的BRAM和分布是RAM(用LUT实现的).这两种RAM又可以配置成单端口和双端口的RAM和ROM.双端口RAM又可以根据读写地址是否在同一块分为Double P ...
- Servlet The Filter
The Filter Filter不会产生Request或者是Response, 但是会在两者访问资源时, 对其作出改变.其可以作用于静态资源和动态资源. LifeCycle Filter会和Serv ...
- DRBD+NFS+Keepalived高可用环境
1.前提条件 准备两台配置相同的服务器 2.安装DRBD [root@server139 ~]# yum -y update kernel kernel-devel [root@server139 ~ ...
- Gradle环境下导出Swagger为PDF
更多精彩博文,欢迎访问我的个人博客 说明 我个人是一直使用Swagger作为接口文档的说明的.但是由于在一些情况下,接口文档说明需要以文件的形式交付出去,如果再重新写一份文档难免有些麻烦.于是在网上看 ...
- 92.背包问题(lintcode)
注意j-A[i-1]必须大于等于0,只大于0会报错 class Solution { public: /** * @param m: An integer m denotes the size of ...
- 计算机图形学(Conputer Graphics):非均匀有理B样条
计算机图形学(Conputer Graphics):非均匀有理B样条 非均匀有理B样条(Non-Uniform Rational B-Spline)英文缩写,NURBS. 它是贝塞尔曲线的一个推广,而 ...