CNCF x Alibaba云原生技术公开课 第十一章 应用健康Liveness和Readness

1、Liveness(存活探针)和Readness(就绪探针)

概念

  • Liveness

    • Liveness用来判断pod是否就绪【PASS】,如果就绪接入层流量能打到相应的pod
    • Liveness状态为Fail,上层判断机制会判断该pod是否需要被重新拉起restart
    • 判断容器是否存活,如果不存活杀死pod
  • Readness

    • 判断容器是否启动完成,pod的condition是ready。如果探测不成功pod会从endpoint移除;探测成功,将pod挂回到endpoint

CNCF x Alibaba云原生技术公开课 第十一章 应用健康Liveness和Readness_第1张图片

yaml参数含义

  • initialDelaySeconds:pod 启动延迟多久进行一次检查
  • periodSeconds:检测的时间间隔,正常默认的这个值是 10 秒
  • timeoutSeconds:当超时时间之内没有检测成功,那它会认为是失败的一个状态
  • successThreshold:当这个 pod 从探测失败到再一次判断探测成功,所需要的阈值次数,默认情况下是 1 次,表示原本是失败的,那接下来探测这一次成功了,就会认为这个 pod 是处在一个探针状态正常的一个状态
  • failureThreshold:探测失败的重试次数,默认值是 3,表示的是当从一个健康的状态连续探测 3 次失败,那此时会判断当前这个pod的状态处在一个失败的状态

状态获取方式

  • http get,返回码200-399表示应用健康
spec
    containers:
        livenessProbe:
            httpGet:
                path:/healthz
                port:8080
                httpHeaders:
                - name: custom-Header
                  value: Awesome
            initialDelaySeconds: 3
            periodSeconds: 3
  • exec 执行容器中的命令来判断当前服务是否正常,命令返回0,表示容器健康
spec
    containers:
        livenessProbe:
            exec:
                command:
                - cat
                - /tmp/healthy
            initialDelaySeconds: 5
            periodSeconds: 5
  • tcpSocket,通过连接容器的ip和port,如果tcp链接正常,则容器健康
spec
    containers:
        livenessProbe:
            tcpsocket:
                port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5
        readinessProbe:
            tcpsocket:
                port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5

pod健康探测结果

  • success
  • failure: container 没有通过健康检查,service层会将没有通过Readiness的pod摘除;Liveness将pod直接重新拉起或者删除
  • unknown:超时或者一些脚本没及时返回

配置注意事项

  • 根据实际情况,设置超时的阈值
  • 调整判断次数
  • exec:使用编译性的脚本(golang或c、c++编译出来的二进制)比shell脚本效率高30%
  • tcpSocket存在TLS隐患

pod的声明周期

  • pending
  • running
  • succeeded
  • failed
  • unknown

事件有两种

  • normal
  • warning

常见pod故障

  • pod在pending
    • 调度器没有介入
    • kubectl describe pod
  • pod在waiting
    • 镜像没拉取下来
  • pod在不断拉取,但是backoff
    • pod已经被调度完成,但是启动失败
  • pod在running但是不能正常服务
    • 配置错误
    • apply-validate-f pod.yaml 验证yaml
    • 验证端口
    • 查看Liveness和Readiness是否正确
  • service异常
    • service后面是不是有真正的endpoint
    • endpoint是否可以正常提供服务

debug命令

  • 进入一个正在运行的pod
    • kubectl exec -it pod-name /bin/bash
  • 进入一个包含多容器的pod
    • kubectl exec -it pod-name -c container-name /bin/bash
  • Service远程调试
    • telepresence工具:
      • telepresence-swap-deployment:将本地的应用代理到远程集群中的一个 service 上面
      • port-forward将远程应用调用到本地端口
  • kubectl debug xx-pod
    • 当执行 debug 的时候,首先会先拉取一些镜像,这个镜像里面实际上会默认带一些诊断的工具。当这个镜像启用的时候,把这个 debug container 进行启动。与此同时会把这个 container 和相应的你要诊断的这个 container 的 namespace 进行挂靠,也就说此时这个 container 和你是同 namespace 的,类似像网络站,或者是类似像内核的一些参数,其实都可以在这个 debug container 里面实时地进行查看。

2、测试题目

Kubernetes 目前支持的哪几种探针?(多选题)AB
A. Liveness Probe
B. Readiness Probe
C. Port Probe
D. Exec Probe

以下哪个关于 Liveness Probe 的描述是错误的?(多选题) AD
A. Liveness Probe 是就绪探针
B. Liveness Probe 是存活探针
C. Livenss Probe 和 Readiness Probe 的探测方式是一致的
D. Liveness Probe 主要面向有状态服务

Readiness Probe 在检测失败后会自动从 Endpoint 上摘掉 Pod。(单选题)A
A. TRUE
B. FALSE

一个应用可以组合两种探针同时使用。(单选题)A
A. TRUE
B. FALSE

当 Pod 处在 Pending的时候,可能是由于如下哪个问题造成的?(多选题)ABD
A. 资源不足,造成无法调度
B. Pod 尚未进入调度阶段
C. Pod 调度失败
D. Pod 正在拉取镜像

以下哪些方式是常见的应用调试手段?(多选题) ABCD
A. Exec 进入到 Pod 并进行调试
B. 使用 Port-Forward 调试远程的服务
C. 使用 telepresense 将本地应用模拟远程应用进行调试
D. 使用 kubectl-debug 调试 Pod

一个 service 无法对外提供服务的常见问题可能是?(多选题)ACD
A. service 和 endpoint 之间的 label 不匹配
B. service 名字与 Pod 不匹配
C. service 的后端映射端口不匹配
D. service 后端 Pod 状态异常

kubectl-debug 如何使用自定义的工具进行 Pod 调试?(单选题)A
A. 使用自定义镜像
B. 使用自定义命令
C. 使用自定义工具
D. 使用自定义配置

以下哪个方式不是调试 Pod 的方法?(单选题) D
A. 使用 exec 进入 Pod 进行调试
B. 查看 Pod 的事件
C. 查看 Pod 的日志
D. 查看 Pod 的标签

Readiness Probe 可以解决应用启动慢造成访问异常的问题(单选题) A
A. TRUE
B. FALSE

你可能感兴趣的:(读书笔记,#,K8s,云原生,docker,linux)