健康检查回调hook

Posted givenchy_yzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了健康检查回调hook相关的知识,希望对你有一定的参考价值。

健康检查

怎样保证pod中的容器正常启动?
1、检查pod中容器是否能够正常启动
pod中所有容器的status=Running时,Pod的状态才会是Running状态。
当存活性探针检测失败的时候,kebulet会删除容器,重新启动一个新的容器。继续检查。

2、怎样保证pod中容器能够正常对外提供服务?
只有容器启动了并且能够正常对外提供服务了,才能放到负载均衡上供给用户访问

提到健康检查就不得不提探针了,他们是做检查的主要劳动力

容器探针

一般情况下存活性检测使用exec,就绪性检测使用tcpSocket,httpGet
如欲了解如何设置存活态、就绪态和启动探针的进一步细节,可以参阅 配置存活态、就绪态和启动探针
针对运行中的容器,kubelet 可以选择是否执行以下三种探针,以及如何针对探测结果作出反应:

livenessProbe:指示容器是否存活。如果存活态探测失败,则 kubelet 会杀死容器, 并且将容器重启。如果容器不提供存活探针, 则默认状态为 Success。

readinessProbe:指示容器是否准备好对外提供服务。如果就绪态探测成功,将容器加入负载均衡,如果就绪态探测失败,将容器踢出负载均衡 初始延迟之前的就绪态的状态值默认为 Failure。 如果容器不提供就绪态探针,则默认状态为 Success。

startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器,而容器依其重启策略进行重启。 如果容器没有提供启动探测,则默认状态为 Success。

容器探针参数:

写在配置文件中,放在探针下面即可自定义探针
initialDelaySeconds:检查开始执行的时间,以容器启动完成为起点计算
periodSeconds:检查执行的周期,默认为10秒,最小为1秒
timeoutSeconds:检查超时的时间,默认为1秒,最小为1秒
successThreshold:从上次检查失败后重新认定检查成功的检查次数阈值(必须是连续成功),默认为1
failureThreshold:从上次检查成功后认定检查失败的检查次数阈值(必须是连续失败),默认为1

示例:

  livenessProbe:
    exec:
      command:
        - "/bin/sh"
        - "-c"
        - "cat /root/test/manage.py"
    initialDelaySeconds: 0
    periodSeconds: 3
    timeoutSeconds: 1
    successThreshold: 3
    failureThreshold: 3

Probe 是由 kubelet 对容器执行的定期诊断。 要执行诊断,kubelet 调用由容器实现的 Handler (处理程序)。有三种类型的处理程序:

ExecAction: 在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。

TCPSocketAction: 对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。

HTTPGetAction: 对容器的 IP 地址上指定端口和路径执行 HTTP Get 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。

每次探测都将获得以下三种结果之一:

Success(成功):容器通过了诊断。
Failure(失败):容器未通过诊断。
Unknown(未知):诊断失败,因此不会采取任何行动。

存活性探针

何时该使用存活态探针?

FEATURE STATE: Kubernetes v1.0 [stable]
如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃,则不一定需要存活态探针; kubelet 将根据 Pod 的restartPolicy 自动执行修复操作。
如果你希望容器在探测失败时被杀死并重新启动,那么请指定一个存活态探针, 并指定restartPolicy 为 "Always"(一直重启) 或 "OnFailure"(故障重启)。

关于存活性探测小实验
#exec方式

vim liveness.yaml
kind: Service
apiVersion: v1
metadata:
  name: name-mysql
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
  selector:
    app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: name-mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: alvinos/django:v1
          livenessProbe:
            exec:
              command:
                - "/bin/sh"
                - "-c"
                - "cat /root/test/manage.py"

kubectl apply -f liveness.yaml
kubectl describe pod name-mysql
找到liveness这一行,有以下参数

delay=0s 	:容器启动多久开始探测
timeout=1s 	:容器探测超时时间
period=10s 	:探测的频率
success=1  	:探测成功多少次为成功
failure=3	:探测失败多少次为失败

#httpGet检查

kind: Service
apiVersion: v1
metadata:
  name: name-mysql
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
  selector:
    app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: name-mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: alvinos/django:v1
          livenessProbe:
            httpGet:
              port: 80
              path: /index

kubectl apply -f liveness.yaml
kubectl describe pod name-mysql

#TcpSocket 相当于 ping,检测端口是否正常

---
kind: Service
apiVersion: v1
metadata:
  name: name-mysql
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
  selector:
    app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: name-mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: alvinos/django:v1
          livenessProbe:
            tcpSocket: 
              port: 80 

kubectl apply -f liveness.yaml
kubectl describe pod name-mysql

就绪性探针

何时该使用就绪态探针?

FEATURE STATE: Kubernetes v1.0 [stable]
如果要仅在探测成功时才开始向 Pod 发送请求流量,请指定就绪态探针。 在这种情况下,就绪态探针可能与存活态探针相同,但是规约中的就绪态探针的存在意味着 Pod 将在启动阶段不接收任何数据,并且只有在探针探测成功后才开始接收数据。
如果你的容器需要加载大规模的数据、配置文件或者在启动期间执行迁移操作,可以添加一个 就绪态探针。
如果你希望容器能够自行进入维护状态,也可以指定一个就绪态探针,检查某个特定于 就绪态的因此不同于存活态探测的端点。

说明:
请注意,如果你只是想在 Pod 被删除时能够排空请求,则不一定需要使用就绪态探针; 在删除 Pod 时,Pod 会自动将自身置于未就绪状态,无论就绪态探针是否存在。 等待 Pod 中的容器停止期间,Pod 会一直处于未就绪状态。

启动探针

何时该使用启动探针?

FEATURE STATE: Kubernetes v1.18 [beta]
对于所包含的容器需要较长时间才能启动就绪的 Pod 而言,启动探针是有用的。 你不再需要配置一个较长的存活态探测时间间隔,只需要设置另一个独立的配置选定, 对启动期间的容器执行探测,从而允许使用远远超出存活态时间间隔所允许的时长。

如果你的容器启动时间通常超出 initialDelaySeconds + failureThreshold × periodSeconds 总值,你应该设置一个启动探测,对存活态探针所使用的同一端点执行检查。 periodSeconds 的默认值是 10 秒。你应该将其 failureThreshold 设置得足够高, 以便容器有充足的时间完成启动,并且避免更改存活态探针所使用的默认值。 这一设置有助于减少死锁状况的发生

回调hook

Kubernetes 为我们的容器提供了生命周期钩子的,就是我们说的Pod Hook,Pod Hook 是由 kubelet 发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中。我们可以同时为 Pod 中的所有容器都配置 hook。Kubernetes 为我们提供了两种钩子函数:

PostStart(启动回调钩子):这个钩子在容器创建后立即执行。主要用于资源部署、环境准备等。不过需要注意的是如果钩子花费太长时间以至于不能运行或者挂起, 容器将不能达到running状态。

PreStop(结束回调钩子):这个钩子在容器终止之前立即被调用。它是阻塞的,意味着它是同步的, 所以它必须在删除容器的调用发出之前完成。主要用于优雅关闭应用程序、通知其他系统等。如果钩子在执行期间挂起, Pod阶段将停留在running状态并且永不会达到failed状态。

如果PostStart或者PreStop钩子失败, 它会杀死容器。所以我们应该让钩子函数尽可能的轻量。当然有些情况下,长时间运行命令是合理的, 比如在停止容器之前预先保存状态。

apiVersion: v1
kind: Pod
metadata:
  name: hook-demo1
spec:
  containers:
    - name: hook-demo1
      image: nginx
      lifecycle:
        postStart:
          exec:
            command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]

以上是关于健康检查回调hook的主要内容,如果未能解决你的问题,请参考以下文章

React Hook 下setState的回调

错误:无法在回调中调用 React Hook “useLogout”。阿波罗

Facebook状态回调不适用于片段

Hooks 回调 - 反应

FAQ运动健康服务REST API接口使用过程中常见问题和解决方法总结

将 GraphQL 片段与 Apollo Hooks 一起使用时出错