在将应用迁移到 kubernetes(k8s)后,如何确保应用的健康和稳定性是一个关键问题。以下是一些方法和策略,以提高应用的可观测性和可恢复能力。
为了确保应用的健康和稳定性,提高应用的可观测性至关重要。这包括监控资源使用情况、应用自身的健康状态以及实时日志,以方便进行问题的诊断和分析。
当应用出现问题时,首先需要降低影响范围。例如,当 Pod 不可用时,Service 会在负载均衡中移除该 Pod。理想情况下,K8S 的自愈机制可以进行完整的恢复,例如在 Node 故障时,K8S 会将该 Node 上的 Pod 迁移到其他健康的 Node 上。
K8S 提供了两种主要的探测机制来检查应用的健康状态:
Readiness Probe(就绪探针):用于判断 Pod 是否就绪。只有在 Pod 就绪时,Service 才会将流量分发给该 Pod。适用于启动后无法立即对外提供服务的应用。
Liveness Probe(存活探针):用于判断 Pod 是否存活。如果 Pod 处于非存活状态,Kubelet 会杀掉该容器,并根据重启策略(例如配置为 always)重新拉起 Pod。适用于支持重新拉起的应用。
Liveness 和 Readiness 探针支持三种不同的探测方式:
httpGet:通过发送 HTTP GET 请求进行判断。当返回码在 200-399 之间时,表明应用是健康的。可能遇到鉴权问题,返回 401。

Exec:通过在容器中执行命令来判断服务是否正常。当命令返回 0 时,表明容器是健康的。

tcpSocket:通过探测容器的 IP 和 Port 进行 TCP 健康检查。如果 TCP 连接能够正常建立,表明容器是健康的。适用于 Web 应用。

initialDelaySeconds:Pod 启动后延迟多久才开始进行检查。periodSeconds:检测的时间间隔,默认是 10 秒。timeoutSeconds:检测的超时时间,超时即视为失败状态。successThreshold:从探测失败到成功所需的阈值次数,默认是 1 次。failureThreshold:探测失败的重试次数,默认是 3 次,连续 3 次失败则认为 Pod 处于失败状态。探测结果主要分为三种:
success:通过健康检查。Failure:未通过健康检查,Readiness 会将 Pod 从 Service 中移除,Liveness 会重新拉起或删除 Pod。Unknown:探测机制未完整执行,可能由于超时或脚本未及时返回,探针不会采取任何操作,等待下次检查。K8S 的状态机制通过 YAML 文件定义期望状态,执行过程中由各种 Controller 负责状态转换。不同状态的转换会在 K8s 对象上留下 Status 或 Conditions 字段。

状态转换会产生事件,分为 Normal 和 Warning 两种。

Pod 停留在 Pending:表示调度器未介入。通过 kubectl describe pod 查看事件,可能是由于资源不足、端口占用或 Node Selector 导致 Pod 无法调度。
Pod 停留在 Waiting:通常表示镜像未正常拉取,可能是私有镜像未配置 Secret、镜像地址不存在或公网镜像拉取失败。
Pod 不断被拉起且看到 Crashing:表示 Pod 已调度但启动失败,此时应关注应用自身状态,并查看 Pod 日志。
Pod 处于 Running 但未正常工作:可能由于配置错误,导致 YAML 下发后部分未生效。可以通过 kubectl apply -f pod.yaml --validate 验证 YAML,并检查端口和探针配置。
Service 无法正常工作:通常是使用问题。Service 与 Pod 通过 Selector 匹配,若 Label 配置错误,Service 无法找到 Endpoint,导致无法提供服务。检查 Service 是否有 Endpoint 以及 Endpoint 是否正常工作。
Service 远程调试:使用开源组件 Telepresence,将本地应用代理到远程集群的 Service 上。
暴露集群服务:通过 kubectl port-forward 将远程应用映射到本地端口,访问本地端口即可访问远程服务。
<code>kubectl port-forward svc/app -n app-namespace</code>
开源调试工具 - kubectl-debug:依赖 Linux namespace 的方式,附加到 Pod 的 namespace 中执行调试操作,查看 hostname、进程、netstat 等信息。
重启策略为 always 的场景:应用处于 failed 状态时,再拉起一次可能仍会失败,但应用通常不会立即失败,在特定情况下才会挂,重新拉起可以撑一阵,保留日志供后续排查。
K8S 的弹性扩展:详细了解和使用 Kubernetes 中 Pod 的弹性伸缩机制。
通过以上策略和工具,可以有效地保障在 K8S 环境中应用的健康与稳定性。
以上就是十一、可观测性——你的应用健康吗的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号