开发者学堂课程【Kubernetes 入门: 可观测性-你的应用健康吗?】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/51/detail/1017
可观测性-你的应用健康吗?
内容介绍
一、需求来源
二、Liveness 与 Readiness
三、问题诊断
四、应用远程调试
五、课后总结与实践
一、需求来源
当我们迁移应用到 Kubernetes 后,要如何保障应用健康稳定?提高应用的可观测性,提高应用的可恢复能力
应用的状态可以从被实时观测:
1、应用健康状态
2、应用资源使用
3、应用实时日志
4、应用出现问题需要降低影响范围,进行问题调试、诊断
5、应用出现问题可以通过自愈机制恢复
二、Liveness 与 Readiness
1、应用健康状态–初识 Liveness 与 Readiness
当应用的 Pod 已经运行起来,如何让 Kubernetes 检查应用的状态,判断是否已经准备好对外提供服务?
2、应用健康状态–使用方式
l 探测方式
httpGet 通过发送 http GET 请求返回200-399状态码则表明容器健康。
l Exec
通过执行命令来检查服务是否正常,命令返回值为0则表示容器健康。
tcpSocket 通过容器的 IP 和 Port 执行 TCP 检查,如果能够建立 TCP 连接则表明容器健康。
l 探测结果
Success Container 通过了检查
Failure Container 未通过检查
Unknown 未能执行检查,不采取任何动作
l 重启策略
Always 总是重启
OnFailure 失败才重启
Never 永远不重启
3、应用健康状态–Pod Probe Spec
l 其他参数
initialDelaySeconds Pod 启动后延迟多久进行检查,单位:秒
periodSeconds 检查的间隔时间,默认为10秒,单位:秒 timeoutSeconds 探测的超时时间,默认为1秒,单位:秒
successThreshold 探测失败后再次判断成功的阀值,默认为1,单位:次
failureThreshold 探测失败的重试次数,默认为3,单位:次
三、问题诊断
1、应用故障排查–了解状态机制
2、应用故障排查–常见应用异常
l Pod 停留在 Pending
Pending 表示调度器没有介入,可以通过 kubectl describe pod,查看事件排查,通常和资源使用相关。
l Pod 停留在 waiting
一般表示 Pod 的镜像没有正常的拉取,通常可能和私有镜像拉取,镜像地址不存在,镜像公网拉取相关。
l Pod 不断被拉起且可以看到 crashing
通常表示 Pod 已经完成调度并启动,但是启动失败,通常是由于配置、权限造成,需查看 Pod 日志。Pod 处在 Running 但是没有正常工作
通常是由于部分字段拼写错误造成的,可以通过校验部署来排查,例如: kubectl apply—validate -f pod.yaml
l Service 无法正常工作
在排除网络插件自身的问题外,最可能的是label配置有问题,可以通过查看 endpoint 的方式进行检查。
四、应用远程调试
l 应用远程调试一Pod 远程调试
当我们把一个应用部署到集群中发现问题需要快速进行验证修改时,可以通过远程调试的方式进行修改、验证。
l 进入一个正在运行的 Pod
kubectl exec -it pod-name /bin/bash
l 进入一个正在运行包含多容器的 Pod
kubectl exec -it pod-name -c container-name/bin/bash
1、应用远程调试-Service 远程调试
l 当集群中应用依赖的应用需要本地调试时:
可以使用 Telepresence 将本地的应用代理到集群中的一个 Service 上。
Telepresence —swap-deployment $DEPLOYMENT_NAME
l 当本地开发的应用需要调用集群中的服务时:
可以使用 Port一Forward 将远程的应用代理到本地的端口上。
kubectl port-forward svclapp -n app-namespace
五、课后总结与实践
l 应用状态探针与自动恢复
1.Liveness Probe 保活探针
2. Readiness Probe 就绪探针
l 应用问题诊断的三个步骤
1. 通过 describe 查看状态,通过状态判断排查方向。
2. 查看对象的 event 事件,获取更详细的信息。
3. 查看 Pod 的日志确定应用自身的情况。
l 应用远程调试
1. 代理本地应用到集群一Telepresence
2. 代理远程应用到本地-Port一Forward