• Pod 生命周期、重启策略、健康检查、服务可用性检查


    生命周期

    正常就正常,不正常看日志。下一个

    重启策略

    Pod 重启策略包括 Always、Never、OnFailure。
    kubelet 重启失败容器的时间间隔以 sync-frequency 乘 2n 来计算,如 1、2、4、8 倍等,最长时延 5min,并在重启成功之后的 10 min 后重置该时间。

    当前可用于管理 Pod 的控制器包括 RC、Job、DaemonSet,还可以通过 kubelet 管理(静态 Pod),每种控制器对应的 Pod 重启策略要求如下:

    • RC 和 DS:必须设置为 Always,需要保证容器的正常运行。
    • Job:必须不设置为 Always,确保 Job 执行完毕之后不会重启。
    • 对于 kubelet,在 Pod 失效时自动启动它。

    Pod 健康检查 & 服务可用性检查

    k8s 对 Pod 的检查有三种探针,LivenessProbe、ReadinessProbe、SetupProbe。相对前两种比较常用,kubelet 会定期执行这两种探针来诊断容器的健康状况。

    LibenessProbe 用于判断容器是否存活,如果不健康,就杀掉,然后看看要不要重启。如果没有设定该探针,则默认一直是存活的,至于真实是死是活就不好说了。
    ReadinessProbe 用于判断容器服务是否可用,对于被 Service 管理的 Pod,如果发现容器不可用,系统将从 Service 的后端 Pod Endpoint 列表中将该 pod 隔离出去,直到它什么时候可用了再放回来。这样可以防止 Service 将业务转发到不可用的 Pod 上。
    SetupProbe 探针,用于一些启动比较慢的情况。此时 ReadinessProbe 就不适用了,对于这种有且仅有一次的操作,使用 SetupProbe。

    探针实现方式

    以上三种探针均可使用以下三种实现方式:

    1)execAction,在容器内部运行一个命令,如果命令返回码为0,则表明容器健康。

    apiVersion: v1
    kind: Pod
    meatdate:
      name: liveness-exec
    spec:
      containers:
      - name: liveness
        image: busybox:latest
        args:
        - /bin/sh
        - -c
        - echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 60
        livenessProbe:
          exec:
            command:
            - cat
            - /tmp/health
          initialDelaySeconds: 15	# 启动容器后首次警醒健康检查的等待时间
          timeoutSeconds: 1			# 健康检查发送请求之后等待响应的时间,如果超时,则 kubelet 认为容器已无法提供服务
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2)通过 tcpSocket
    通过容器的 IP 地址和端口号执行 TCP 检查,如果能够建立连接则说明容器健康。
    以下以 localhost:80 为例:

    apiVersion: v1
    kind: Pod
    meatdate:
      name: liveness-exec
    spec:
      containers:
      - name: liveness
        image: busybox:latest
        args:
        - /bin/sh
        - -c
        - echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 60
        livenessProbe:
          tcpSocket:
            port:80
          initialDelaySeconds: 15
          timeoutSeconds: 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3)httpGet 方式
    通过容器 IP、端口号以及路径调用 Get 方法,如果返回值结余 200~400 则说明正常。

    apiVersion: v1
    kind: Pod
    meatdate:
      name: liveness-exec
    spec:
      containers:
      - name: liveness
        image: busybox:latest
        args:
        - /bin/sh
        - -c
        - echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 60
        livenessProbe:
          httpGet: 
            path: /_status/healthz
            port: 80
          initialDelaySeconds: 15
          timeoutSeconds: 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    setupProbe 参考

    apiVersion: v1
    kind: Pod
    meatdate:
      name: liveness-exec
    spec:
      containers:
      - name: liveness
        image: busybox:latest
        args:
        - /bin/sh
        - -c
        - echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 60
        startupProbe:
          httpGet:
            path: /_status/healthz
            port: 80
          failureThreshold: 20
          periodSeconds: 10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这个 Pod 有 20 * 10 = 200s 的启动时间。


  • 相关阅读:
    认识接口自动化测试
    说说 JSON 格式的弊端与解决方法
    使用 request 和 cheerio 库来发送 HTTP 请求
    安装docker,打包jar包镜像文件,输出tar压缩包
    R语言-关于颜色
    Debian利用现有软件包或者光盘镜像搭建本地软件源
    UnityShader数学基础篇
    sql基本语法
    不标准的 json 格式的字符串如何转为标准的(json字符串属性名不带双引号如何转
    2024字节跳动校招面试真题汇总及其解答(五)
  • 原文地址:https://blog.csdn.net/qq_43762191/article/details/126922367