K8s应用程序生命周期管理——健康检查


前言

官网:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes

一、重启策略

  • Always:当容器终止退出后,总是重启容器,默认策略。
  • OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
  • Never:当容器终止退出,从不重启容器。

二、健康检查

健康检查在K8s中以探针的形式来实现,包括3个探针,存活(Liveness)、就绪(Readiness)和启动(Startup)探针。

  • livenessProbe(存活检查):如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。
  • readinessProbe(就绪检查):如果检查失败,Kubernetes会把Pod从service endpoints中剔除。
  • startup(启动探针):等待failureThreshold * periodSeconds时间,存活探测任务就会接管对容器的探测,对容器死锁作出快速响应。 如果启动探测一直没有成功,容器会在 300 秒后被杀死,并且根据 restartPolicy 来执行进一步处置。

存活探针livenessProbe实例

[root@k8s-master yaml]# cat liveness.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 -f /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 10
      periodSeconds: 5

在这里插入图片描述在这里插入图片描述

就绪检查与存活检查配置方式一致。唯一区别就是要使用 readinessProbe 字段,而不是 livenessProbe 字段。

三、健康监控方式

支持以下三种检查方法:

  • httpGet:发送HTTP请求,返回200-400范围状态码为成功。
  • tcpSocket:发起TCP Socket建立成功。
  • exec:执行Shell命令返回状态码是0为成功。

探针配置:

  • initialDelaySeconds:容器启动后要等待多少秒后才启动启动、存活和就绪探针, 默认是 0 秒,最小值是 0。类似启动探针的failureThreshold * periodSeconds
  • periodSeconds:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
  • timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。
  • successThreshold:探针在失败后,被视为成功的最小连续成功数。默认值是 1。 存活和启动探测的这个值必须是 1。最小值是 1。
  • failureThreshold:当探测失败时,Kubernetes 的重试次数。 对存活探测而言,放弃就意味着重新启动容器。 对就绪探测而言,放弃意味着 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1。
[root@k8s-master yaml]# cat healthcheck.yaml 
apiVersion: apps/v1 
kind: Deployment 
metadata:
  labels:
    app: web
  name: web
spec: 
  replicas: 1 
  selector:
    matchLabels:
     app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      restartPolicy: Always
      containers:
      - image: java-demo 
        imagePullPolicy: IfNotPresent
        name: java-demo 
        livenessProbe:
          tcpSocket:
            port: 8080 
          initialDelaySeconds: 30 #  kubelet 在执行第一次探测前应该等待 30 秒
          periodSeconds: 20 # kubelet 应该每 20 秒执行一次存活探测
          timeoutSeconds: 2 # 探测超时后等待 2 秒钟继续探测
          failureThreshold: 2 # 当探测失败时,Kubernetes 的重试次数。 对存活探测而言,放弃就意味着重新启动容器。 对就绪探测而言,放弃意味着 Pod 会被打上未就绪的标签。
        readinessProbe:
          tcpSocket:
            port: 8080 
          initialDelaySeconds: 30
          periodSeconds: 20
Logo

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

更多推荐