背景: 使用k8s过程当中因为服务存在bug致使业务中断,因此须要增长健康检查,主要参考k8s的文档docker
在容器化场景下,对于容器的健康检查可能经过在制做docker镜像时的dockerfile中增长HEALTHCHECK指令(仅能有一条)的方式进行,HEALTHCHECK指令主要有两种形式:api
当容器指定了健康检查指令后,容器的状态将多出一种健康状态,健康状态初始化为starting,当健康检查指令执行经过后,状态转为healthy,若是容器健康检查失败了,将转为unhealthy 对于OPTIONS能够指定如下的参数bash
对于CMD命令,命令的返回值表示了容器的健康检查状态,一共有三种网络
HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1
(参考https://docs.docker.com/engine/reference/builder/)curl
k8s不支持经过docker的HEALTHCHECK来进行容器的健康检查(Docker Swarm能够-可是我没用过),可是k8s自身提供了两种相似于健康检查的能力socket
在pod的containers中定义livenessProbe或readnessProbetcp
apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-exec spec: containers: - name: liveness image: k8s.gcr.io/busybox args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5
经过在容器中执行命令(脚本)的方式来获取容器的状态,脚本或命令返回0时表示成功,不然表示失败(若是容器指定了用户,则会以对应用户去执行,因此注意使用脚本时须要相应的权限)ui
livenessProbe: exec: command: - /bin/bash - /home/test/healthcheck.sh initialDelaySeconds: 5 periodSeconds: 5
经过发送HTTP GET请求的方式获取容器状态,返回状态码>=200且<400时表示状态正常,不然表示失败,支持自定义HTTP Header(在1.13版本前若是容器内定义了http_proxy环境变量,则在发送请求时会使用proxy,1.13及之后版本中不会再受此影响)this
livenessProbe: httpGet: path: /healthcheck port: 1888 httpHeaders: - name: Custom-Header value: Test initialDelaySeconds: 3 periodSeconds: 3
http检查的一些字段url
port: 端口 path: uri httpHeaders: 请求头 host: 主机名,默认值时pod自身的ip地址(没用过,也许多网络平面场景下须要使用) scheme: HTTP/HTTPS 默认HTTP
经过tcp socket创建链接的方式去判断容器状态,若是可以建连成功,则判断状态正常,不然异常
livenessProbe: tcpSocket: port: 1888 initialDelaySeconds: 15 periodSeconds: 20
除了健康检查方式外,还有一些参数用于控制健康检查的的行为
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/