健康检查与生命周期

健康检查作为服务存存活的依据,kubelet将根据健康检查结果判定何时重启容器,决定了pod的生命周期。

类型

  • liveness probe(存活探针)
  • readiness probe(就绪探针)

定义

在源码中liveness probe和readiness probe结构体完全一致

通用参数:

  • initialDelaySeconds 启动后的初始化时间
  • TimeoutSeconds 超时时间
  • PeriodSeconds 检查频率
  • SuccessThreshold 几次判断为成功
  • FailureThreshold 几次判断为失败

健康检查方式

  • Exec 参数:

    - Command
    
      livenessProbe:
        exec:
          command:
          - cat
          - /tmp/healthy
        initialDelaySeconds: 5
        periodSeconds: 5
    
  • HTTPGet 参数:

    - Path
    - Port
    - Host
    - Scheme
    - HTTPHeaders
    
      livenessProbe:
        httpGet:
          path: /healthz
          port: 8080 #可以使用定义的port name
          httpHeaders:
          - name: X-Custom-Header
            value: Awesome
        initialDelaySeconds: 3
        periodSeconds: 3
    
  • TCPSocket

  • HTTPGet 参数:
    - Port
    - Host
    
      livenessProbe:
        tcpSocket:
          port: 8080
        initialDelaySeconds: 15
        periodSeconds: 20
    

生命周期

  • 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。
  • 运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
  • 成功(Succeeded):Pod 中的所有容器都被成功终止,并且不会再重启。
  • 失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
  • 未知(Unknown):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。

restartpolicy

  • Always
  • OnFailure
  • Never

特殊情况

  • Job 仅适用于重启策略为 OnFailure 或 Never 的 Pod
  • ReplicationController 仅适用于具有 restartPolicy 为 Always 的 Pod
  • DaemonSet 为每台机器运行一个 Pod

定义启动结束操作

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

说明

postStart和容器启动为异步执行,postStart执行完后pod才可能变为running状态

Kubernetes在容器创建之后就会马上发送postStart事件,但是并没法保证一定会 这么做, 它会在容器入口被调用之前调用postStart操作,因为postStart的操作跟容器的操作是异步的, 而且Kubernetes控制台会锁住容器直至postStart完成, 因此容器只有在 postStart操作完成之后才会被设置成为RUNNING状态。

results matching ""

    No results matching ""