Liveness:nginx
做用:用于判断容器是否须要重启。探测均是由kubelet执行。数据库
场景:pod中有多个container,长时间的运行后,某个container异常了但仍是running状态(例如,程序死锁)致使总体服务不可用,可是pod状态仍是running状态,须要重启一下container。后端
例如,pod中包含一个nginx container,一个business container,nginx负责接收客户请求,business负责具体业务处理,当business container宕掉以后,pod运行状态仍是正常,但服务已经不可用。此时应该重启pod,因此liveness应该加两个,分别给每一个container都加上。api
实现:缓存
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:bash
做用:用于判断pod是否已经能够被访问,若是请求失败,会从service的后端服务列表中移除。app
场景:服务须要依赖大量的缓存数据,可是数据并无load完成,此时服务是不可用的;服务依赖另外一个进程的启动完成,在彻底启动完成以前,服务不可用;服务依赖数据库等组件,依赖没有所有启动完成,服务不可用。tcp
实现:和Liveness同样ide
readinessProbe:rest
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。