探针有两种:readness(就需检测)、liveness(生命检测)
检测有三种模式:exec、tcpSocket、httpGet

readness:

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

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

示例:检测redis端口是否已经启动(exec)

apiVersion: v1
kind: Pod
metadata: 
    name: readness-httpget-pod
    namespace: default
spec: 
    containers: 
      - name: readness-httpget-container
        image: registry.cn-hangzhou.aliyuncs.com/kxq/redis
        imagePullPolicy: IfNotPresent
        readinessProbe:
          tcpSocket:
            port: 6379
          initialDelaySeconds: 1
          periodSeconds: 3

创建pod:
kubectl create -f readness.yaml

[root@apiserver ~]# kubectl apply -f readness.yaml 
pod/readness-httpget-pod created

查看pod:

[root@apiserver ~]# kubectl get pods
NAME                   READY   STATUS    RESTARTS   AGE
readness-httpget-pod   1/1     Running   0          3s

liveness:

作用:用于判断容器是否需要重启。

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

例如,pod中包含一个busybox,开始我们创建一个文件夹:/tmp/live 60s后再删除此文件夹,再睡眠3600s.此过程liveness检测/tmp/live文件,如果不存在就pod重启。

apiVersion: v1
kind: Pod
metadata: 
  name: livebess-exec-pod
  namespace: default
spec:
  containers:
   - name: liveness-exec-container
     image: busybox
     imagePullPolicy: IfNotPresent
     command: ["/bin/sh", "-c" ,"tough /tmp/live; sleep 60;rm -rf /tmp/live;sleep 3600"] 
     livenessProbe:
        exec:
          command: ["test","-e","/tmp/live"]
        initialDelaySeconds: 1
        periodSeconds: 3

查看pod:

[root@apiserver ~]# kubectl get pod -w
NAME                READY   STATUS    RESTARTS   AGE
livebess-exec-pod   1/1     Running   0          12s
....
livebess-exec-pod   1/1     Running   3          2m5s
livebess-exec-pod   1/1     Running   4          2m37s
livebess-exec-pod   0/1     CrashLoopBackOff   4          3m15s
livebess-exec-pod   1/1     Running            5          4m9s

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

通用参数解释:

  • 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。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐