当前位置 博文首页 > 文章内容

    存活性、就绪性探测 及容器生命周期回调

    作者: 栏目:未分类 时间:2020-09-23 10:02:18

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    存活性探测:kubelet通过存活性探测pod的状态(应用是否可用、是否hang住无法提供服务等等),来判断何时重启pod,并根据restartPolicy的重启策略进行动作,提升pod中应用的可用性。

    就绪性探测:kubelet通过就绪性探测(pod提供提供服务必要条件已存在),来标记该pod的就绪状态是否能够作为service的后端调度分发流量,当 Pod 还没有准备好时,会在Service 的负载均衡器中被剔除。

    容器生命周期回调:在pod启动后(PostStart)和停止前(PreStop),pod可以通过暴露的两个回调函数搞一些事情。

    一、存活性探测

    pod的存活性探测支持三种方式:

    • 命令command模式
    • HTTP 模式
    • TCP Socket模式
    1、command模式

    引用官方示例:

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: liveness
      name: liveness-exec
    spec:
      containers:
      - name: liveness
        image: k8s.gcr.io/busybox
        args: # 启动运行命令
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
        livenessProbe: #存活探测
          exec: #执行命令返回值为0表示成功,其它值kubelet会kill掉pod,并按重启策略动作
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 5 # 第一次探测前应该等待的时间
          periodSeconds: 5 #执行探测间隔
    
    2、HTTP 模式

    引用官方示例:

    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
    

    HTTP模式的存活性探测,会通过GET方法请求执行的资源,返回状态码范围区间为[200-400)表示成功,其它为失败,同样kubelet会kill掉pod,并按照重启策略restartPolicy动作

    3、TCP Socket模式

    与HTTP模式相似,只不过通信模式变成了套接字连接

    引用官方示例:

    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
    
    • 启动探测startupProbe
      当却有一些pod需要很长的初始化时间,要不影响对引起探测死锁的快速响应,可通过设置启动探测startupProbe来为pod提供更多的初始化时间
    ...
    ports:
    - name: liveness-port
      containerPort: 8080
      hostPort: 8080
    
    livenessProbe:
      httpGet:
        path: /healthz
        port: liveness-port
      failureThreshold: 1
      periodSeconds: 10
    
    startupProbe: # pod启动探测
      httpGet:
        path: /healthz
        port: liveness-port
      failureThreshold: 30 # 失败阈值30次
      periodSeconds: 10
    

    应用程序将会有最多 5 分钟(30 次* 10 = 300s) 的时间来完成它的启动。 一旦启动探测成功一次,存活探测任务就会接管对容器的探测,对容器死锁可以快速响应。 如果启动探测一直没有成功,容器会在 300 秒后被杀死,并且根据 restartPolicy 来设置 Pod 状态。

    二、就绪性探测

    与存活性探测一样有三种模式:command 、HTTP、TCP Socket,使用的配置都一致,不再过多赘述

    示例:

    ...
    startupProbe: # pod启动探测
      httpGet:
        path: /healthz
        port: liveness-port
      failureThreshold: 3 
      periodSeconds: 10
    
    • 存活性和就绪性探测的可选配置字段
      在Probe下可以设置的字段:
      • initialDelaySeconds:容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒,最小值是 0。
      • periodSeconds:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
      • timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。
      • successThreshold:探测器在失败后,被视为成功的最小连续成功数。默认值是 1。 存活探测的这个值必须是 1。最小值是 1。
      • failureThreshold:当探测失败时,Kubernetes 的重试次数。 存活探测情况下的放弃就意味着重新启动容器。 就绪探测情况下的放弃 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1。

    HTTP Probes 可以在 httpGet 上配置额外的字段:

    • host:连接使用的主机名(一般不进行配置),默认是 Pod 的 IP。也可以在 HTTP 头中设置 “Host” 来代替。
    • scheme :用于设置连接主机的方式(HTTP 还是 HTTPS)。默认是 HTTP。
    • path:访问 HTTP 服务的路径。
    • httpHeaders:请求中自定义的 HTTP 头。HTTP 头字段允许重复。
    • port:访问容器的端口号或者端口名。如果数字必须在 1 ~ 65535 之间。

    对于 HTTP 探测,kubelet 发送一个 HTTP 请求到指定的路径和端口来执行检测。 除非 httpGet 中的 host 字段设置了,否则 kubelet 默认是给 Pod 的 IP 地址发送探测。 如果 scheme 字段设置为了 HTTPS,kubelet 会跳过证书验证发送 HTTPS 请求。 大多数情况下,不需要设置host 字段。 这里有个需要设置 host 字段的场景,假设容器监听 127.0.0.1,并且 Pod 的 hostNetwork 字段设置为了 true。那么 httpGet 中的 host 字段应该设置为 127.0.0.1。 可能更常见的情况是如果 Pod 依赖虚拟主机,就不应该设置 host 字段,而是应该在 httpHeaders 中设置 Host。

    对于 TCP Socket 探测,kubelet 在节点上(不是在 Pod 里面)建立探测连接, 这意味着不能在 host 参数上配置服务名称,因为 kubelet 不能解析服务名称。

    注:在k8s集群中对重要的pod很有必要配置存活性和就绪性探测来最大程度保证pod的可用性