思考:在以容器方式部署一组有依赖关系的服务时,如何保证某一个服务启动前,其上一个服务已经处于就绪状态?否则该服务可能因为依赖关系而导致启动失败,容器退出。

针对此类问题,kubernetes提供了探针的方式对容器进行健康检查。

探针的分类

k8s提供的探针分别为livenessProbereadinessProbe,各node节点的kubelet根据探针的内容定期对容器执行探测,以达到对容器状态的判断。

探针功能说明

livenessProbe & readinessProbe

livenessProbe:用于判断容器是否存活(STATUS是否为Running状态)。若存活探测失败,则kubelet会kill掉该容器,并根据容器所设置的重启策略进行下一步操作,

默认情况下,若未设置livenessProbe,则kubelet认为livenessProbe探针返回值为success。

readinessProbe:用于判断容器服务是否可用(STATUS是否为Ready状态),达到Ready状态的容器可以进行接收请求。若就绪探测失败,则端点控制器(endpoints)将从与pod匹配的所有service中删除该pod的ip地址。

设置了该探针后,初始延迟之前探针的状态为Failure;
如果未设置该探针,则默认状态为Success。

端点控制器:
端点控制器

可配置的实现方式

livenessProbereadinessProbe均可配置以下三种方式,满足常用的探测需求:

  • ExecAction:在容器内部执行指定命令,若该命令退出时的状态码为0,则表示容器正常。
  • TCPSocketAction:对容器的IP和端口进行TCP检查,若能够建立TCP连接,则表示容器正常。
  • HTTPGetAction:对容器的IP、端口、访问路径执行HTTP Get方法,若HTTP返回的状态码>=200 and <400 则表示容器正常。

每种方式下均可配置以下探针执行时的参数:

参数类型说明
failureThreshold<integer>当上一次探测结果为成功时,需要连续探测多少次失败,才视为探测结果失败。默认为3次,最少为1次
initialDelaySeconds<integer>容器启动多少秒后,启动第一次探测
periodSeconds<integer>执行探测的频率,默认为10s,最少为1s
successThreshold<integer>当上一次探测结果为失败时,需要连续探测多少次成功,才视为探测结果成功。默认为1,且为了容器的正常启动必须设置为1
timeoutSeconds<integer>探测超时的秒数,默认为1s,最小为1s

探测结果

探测结果分为3种:

  • 成功:容器通过探测
  • 失败:容器未通过探测
  • 未知:不会采取任何行动,容器会挂死,等待探测完成。

探针的使用

readinessProbe和livenessProbe(不限),这里仅介绍探针在yaml文件中的书写方式。

exec方式

$ cat > liveness.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: liveness
  labels:
    name: liveness
spec:
  containers:
  - name: liveness
    image: busybox
    imagePullPolicy: IfNotPresent
    args:
    - /bin/sh
    - -c
    - echo ok > /tmp/health; sleep 10; rm -fr /tmp/health; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/health
      failureThreshold: 3
      initialDelaySeconds: 15
      timeoutSeconds: 1
      periodSeconds: 3
EOF

当livenessProbe探测失败时,重新启动容器。
在这里插入图片描述

tcpSocket

$ cat > redis.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  restartPolicy: OnFailure
  containers:
  - name: redis
    image: redis
    imagePullPolicy: IfNotPresent
    ports:
    - name: redis
      containerPort: 3306
    livenessProbe:
      tcpSocket:
        port: 3307
      initialDelaySeconds: 5
      timeoutSeconds: 1
EOF

在这里插入图片描述

httpGet

$ cat > nginx.yaml < EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: harbor.gdgbpx.com/bestmem/nginx:1.18.0
    livenessProbe:
      httpGet:
        port: 80
        path: /index1.html
EOF

在这里插入图片描述
事例yaml文件主要采用了livenessProbe探针,readinessProbe写法类似,主要是探测失败时,会从端点控制器中剔除相关pod并重启。

还可以通过readinessGates自定义探针,进行探测,具体可通过kubectl explain pod.spec.readinessGates查看。

Logo

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

更多推荐