pod健康检查(liveness probe存活探针&&readiness probe 可读性探针)

Kubernetes集群当中,咱们能够经过配置liveness probe(存活探针)和readiness probe(可读性探针)来影响容器的生存周期。参考文档:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/git

kubelet 经过使用 liveness probe 来肯定你的应用程序是否正在运行,通俗点将就是是否还活着。通常来讲,若是你的程序一旦崩溃了, Kubernetes 就会马上知道这个程序已经终止了,而后就会重启这个程序。而咱们的 liveness probe 的目的就是来捕获到当前应用程序尚未终止,尚未崩溃,若是出现了这些状况,那么就重启处于该状态下的容器,使应用程序在存在 bug 的状况下依然可以继续运行下去。
kubelet使用活跃度探头知道何时从新启动的容器。例如,liveness probe能够捕获死锁,应用程序正在运行,但没法取得进展。在这种状态下从新启动容器能够继续存活。
kubelet 使用 readiness probe 来肯定容器是否已经就绪能够接收流量过来了。这个探针通俗点讲就是说是否准备好了,如今能够开始工做了。只有当 Pod 中的容器都处于就绪状态的时候 kubelet 才会认定该 Pod 处于就绪状态,由于一个 Pod 下面可能会有多个容器。固然 Pod 若是处于非就绪状态,那么咱们就会将他从咱们的工做队列(实际上就是咱们后面须要重点学习的 Service)中移除出来,这样咱们的流量就不会被路由到这个 Pod 里面来了。
使用readiness probe来了解容器什么时候准备开始接受流量。当全部容器准备就绪时,Pod被认为已准备就绪。此信号的一个用途是控制哪些Pod用做服务的后端。当Pod未就绪时,它将从服务负载平衡器中删除。例如当一个应用服务有大文件加载时,这种状况下不容许接受用户访问,readiness probe就不会对这类型的程序启动服务。

许多运行很长时间的应用程序最终会转换到损坏状态,除非从新启动,不然没法恢复。Kubernetes提供活体探测器来检测和纠正这种状况。github

经过busybox来练习一下liveness probeshell

liveness-exec.yaml  liveness-http.yaml  pod-example.yaml  poststart-hook.yaml  prestop-hook.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: 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

在配置文件中,您能够看到Pod具备单个Container。该periodSeconds字段指定kubelet应每5秒执行一次活跃度探测。该initialDelaySeconds字段告诉kubelet它应该在执行第一次探测以前等待5秒。要执行探测,kubelet将cat /tmp/healthy在Container中执行命令。若是命令成功,则返回0,而且kubelet认为Container是活动且健康的。若是该命令返回非零值,则kubelet会终止Container并从新启动它。后端

当Container启动时,它会执行如下命令:api

/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"

在Container的生命的前30秒,有一个/tmp/healthy文件。所以,在前30秒内,该命令cat /tmp/healthy返回成功代码。30秒后,cat /tmp/healthy返回失败代码。服务器

建立Pod:app

kubectl apply -f liveness-exec.yaml

在30秒内,查看Pod事件:tcp

kubectl describe pod liveness-exec

有消息指示活动探测失败,而且容器已被杀死并从新建立。post

另外一种活动探测器使用HTTP GET请求学习

apiVersion: v1
kind: Pod
metadata:
  name: liveness-http
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: cnych/liveness
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 3
      periodSeconds: 3

在配置文件中,您能够看到Pod具备单个Container。该periodSeconds字段指定kubelet应每3秒执行一次活跃度探测。该initialDelaySeconds字段告诉kubelet它应该在执行第一次探测以前等待3秒。为了执行探测,kubelet向在Container中运行的服务器发送HTTP GET请求并侦听端口8080.若是服务器/healthz路径的处理程序返回成功代码,则kubelet认为Container是活动且健康的。若是处理程序返回失败代码,则kubelet会终止Container并从新启动它。

任何大于或等于200且小于400的代码表示成功。任何其余代码表示失败。

您能够在server.go中查看服务器的源代码 。

对于Container /healthz处于活动状态的前10秒,处理程序返回状态200.以后,处理程序返回状态500。

http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
    duration := time.Now().Sub(started)
    if duration.Seconds() > 10 {
        w.WriteHeader(500)
        w.Write([]byte(fmt.Sprintf("error: %v", duration.Seconds())))
    } else {
        w.WriteHeader(200)
        w.Write([]byte("ok"))
    }
})

在容器启动3秒后,kubelet开始执行运行情况检查。所以,前几回健康检查将成功。可是10秒后,运行情况检查将失败,而且kubelet将终止并从新启动Container。

要尝试HTTP活跃度检查,请建立一个Pod:

kubectl apply -f liveness-http.yaml

10秒后,查看Pod事件以验证活动探测失败而且Container已从新启动:

kubectl describe pod liveness-http

在v1.13以前的版本(包括v1.13)中,若是在运行pod的节点上设置了环境变量http_proxy(或HTTP_PROXY),则HTTP活动探针将使用该代理。在v1.13以后的版本中,本地HTTP代理环境变量设置不会影响HTTP活动探测。

定义TCP活动探测

第三种类型的活动探测器使用TCP套接字。使用此配置,kubelet将尝试在指定端口上打开容器的套接字。若是它能够创建链接,则容器被认为是健康的,若是它不能被认为是失败的话。

apiVersion: v1
kind: Pod
metadata:
  name: goproxy
  labels:
    app: goproxy
spec:
  containers:
  - name: goproxy
    image: cnych/goproxy
    ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20

咱们能够看到,TCP 检查的配置与 HTTP 检查很是类似,只是将httpGet替换成了tcpSocket。 并且咱们同时使用了readiness probeliveness probe两种探针。 容器启动后5秒后,kubelet将发送第一个readiness probe(可读性探针)。 该探针会去链接容器的8080端,若是链接成功,则该 Pod 将被标记为就绪状态。而后Kubelet将每隔10秒钟执行一次该检查。

除了readiness probe以外,该配置还包括liveness probe。 容器启动15秒后,kubelet将运行第一个 liveness probe。 就像readiness probe同样,这将尝试去链接到容器的8080端口。若是liveness probe失败,容器将从新启动。

有的时候,应用程序可能暂时没法对外提供服务,例如,应用程序可能须要在启动期间加载大量数据或配置文件。 在这种状况下,您不想杀死应用程序,也不想对外提供服务。 那么这个时候咱们就可使用readiness probe来检测和减轻这些状况。 Pod中的容器能够报告本身尚未准备,不能处理Kubernetes服务发送过来的流量。

从上面的YAML文件咱们能够看出readiness probe的配置跟liveness probe很像,基本上一致的。惟一的不一样是使用readinessProbe而不是livenessProbe。二者若是同时使用的话就能够确保流量不会到达还未准备好的容器,准备好事后,若是应用程序出现了错误,则会从新启动容器。

另外除了上面的initialDelaySecondsperiodSeconds属性外,探针还能够配置以下几个参数:

  • timeoutSeconds:探测超时的秒数。默认为1秒。最小值为1。
  • initialDelaySeconds:启动活动或准备就绪探测以前容器启动后的秒数。
  • periodSeconds:执行探测的频率(以秒为单位)。默认为10秒。最小值为1。
  • failureThreshold:当Pod启动而且探测失败时,Kubernetes会failureThreshold在放弃以前尝试一次。在活动探测的状况下放弃意味着从新启动Pod。若是准备好探测,Pod将被标记为未准备好。默认为3.最小值为1。
  • successThreshold:失败后探测成功的最小连续成功次数。默认为1.活跃度必须为1。最小值为1。

[HTTP探针] 具备能够设置的其余字段httpGet

  • host:要链接的主机名,默认为pod IP。您可能但愿在httpHeaders中设置“主机”。
  • scheme:用于链接主机的方案(HTTP或HTTPS)。默认为HTTP。
  • path:HTTP服务器上的访问路径。
  • httpHeaders:要在请求中设置的自定义标头。HTTP容许重复标头。
  • port:容器上要访问的端口的名称或编号。数字必须在1到65535的范围内。

对于HTTP探测,kubelet将HTTP请求发送到指定的路径和端口以执行检查。kubelet将探测器发送到pod的IP地址,除非地址被可选host字段覆盖httpGet。若是 scheme字段设置为HTTPS,则kubelet会发送跳过证书验证的HTTPS请求。在大多数状况下,您不但愿设置该host字段。这是您设置它的一个场景。假设Container侦听127.0.0.1而且Pod的hostNetwork字段为true。而后host,在httpGet,应设置为127.0.0.1。若是您的pod依赖虚拟主机,这多是更常见的状况,您不该该使用host,而是设置Host标头httpHeaders

对于探测器,kubelet在节点处而不是在pod中进行探测链接,这意味着您没法在host参数中使用服务名称,由于kubelet没法解析它。

相关文章
相关标签/搜索