Liveness:

作用:用于判断容器是否需要重启。探测均是由kubelet执行。

场景:pod中有多个container,长时间的运行后,某个container异常了但还是running状态(例如,程序死锁)导致整体服务不可用,但是pod状态还是running状态,需要重启一下container。

例如,pod中包含一个nginx container,一个business container,nginx负责接收客户请求,business负责具体业务处理,当business container宕掉之后,pod运行状态还是正常,但服务已经不可用。此时应该重启pod,所以liveness应该加两个,分别给每个container都加上。

实现:

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
http request:
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/liveness
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3
TCP prob:
apiVersion: v1
kind: Pod
metadata:
  name: goproxy
  labels:
    app: goproxy
spec:
  containers:
  - name: goproxy
    image: k8s.gcr.io/goproxy:0.1
    ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20


Readiness:

作用:用于判断pod是否已经可以被访问,如果请求失败,会从service的后端服务列表中移除。


场景:服务需要依赖大量的缓存数据,但是数据并没有load完成,此时服务是不可用的;服务依赖另一个进程的启动完成,在完全启动完成之前,服务不可用;服务依赖数据库等组件,依赖没有全部启动完成,服务不可用。

实现:和Liveness一样

readinessProbe:

  exec:

    command:

    - cat

    - /tmp/healthy

  initialDelaySeconds: 5

  periodSeconds: 5

通用参数解释:

initialDelaySeconds: 在容器启动后,liveness 或 readiness 初始化之前的延迟时间。

periodSeconds: 请求探针的频率,默认10秒,最小1秒。

timeoutSeconds: 请求超时时长,默认1秒,最小1秒

successThreshold: 请求失败后,需要最小的连续成功次数,默认一次. liveness 只能是一次(readiness可以大于1),最小值是1.

failureThreshold: 当探针请求失败后,尝试重启的最大次数. Giving up in case of liveness probe means restarting the Pod. In case of readiness probe the Pod will be marked Unready. Defaults to 3. Minimum value is 1.

Http request 类型独有参数:

host: 要连接的主机名称, 默认是pod的ip. You probably want to set “Host” in httpHeaders instead.

scheme: 使用哪种协议(HTTP或HTTPS),默认HTTP

path: 访问的服务地址

httpHeaders: 指定请求头. HTTP allows repeated headers.

port: 访问容器的端口号,[1,65535]

缺陷:

readiness和liveness,都不支持多端口(TCP方式),多请求地址验证(http)的验证,如果镜像不规范,里面打有多个应用程序,则不能进行多个进程的监听,目前1.15版本是不支持的,不排除以后会fix。