国企真实案例 | k8s Pod自定义健康检查,升级代码对用户无感知

‍‍        

一、问题描述:

pod可以通过存活探测和就绪探测对容器进行健康检查,探测时间太短,可能会增加集群的负载,并且可能会导致不必要的故障转移或服务中断,探测时间太长,可能出现Pod里的容器已经出问题了,但是还没开始探测,pod就不会从svc移除,请求svc还会把流量转到没就绪的pod,那如何做能最大限度的做到对业务无感知?

二、需求:

  1. 1、自定义健康检查:需要实现一个自定义的健康检查机制,定期检查容器中服务的健康状态。

  2. 2、自动触发容器退出:当发现服务状态异常时,能够主动触发容器的退出操作。

  3. 3、集成 Kubernetes 的自动重启:当容器退出后,Kubernetes     能够自动检测并执行容器的重启或故障转移操作。

三、解决方案:

我们可以在容器中实现一个自定义的监控进程,该进程定期检查服务的健康状态。如果发现服务不健康,监控进程将触发容器的退出。以下是详细的解决方案:

  1. 1、编写健康检查脚本

  • 使用 curl 工具定期发送请求到服务的健康检查接口。

  • 如果接口返回的 HTTP 状态码不是 200,则表示服务出现异常。

2、脚本实现容器退出

  • 当检测到服务异常时,使用 exit 1 命令退出脚本,使容器进程结束。这样 Kubernetes 将检测到容器退出并执行自动重启或故障转移。

3、集成到容器启动流程中

  • 将自定义健康检查脚本作为一个守护进程,在容器启动时自动运行。

四、实现步骤:

1. 创建自定义健康检查脚本

#!/bin/bash

# 自定义健康检查脚本

while true; do

# 发送请求到服务的健康检查接口

response=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health)

# 检查返回的 HTTP 状态码是否为 200

if [ "$response" != "200" ]; then

echo "服务未正常运行,退出容器..."

exit 1  # 退出脚本,触发容器退出

fi

sleep 0.001  # 控制每次检测间隔为1毫秒

done

2. 将脚本集成到容器镜像中

在容器镜像中,可以通过 Dockerfile 将该脚本集成进去,并在容器启动时运行该脚本。例如:

# 使用基础镜像

FROM alpine:latest

# 安装 curl 工具

RUN apk add --no-cache curl

# 将健康检查脚本添加到容器中

COPY health_check.sh /usr/local/bin/health_check.sh

# 赋予执行权限

RUN chmod +x /usr/local/bin/health_check.sh

# 容器启动时执行健康检查脚本

CMD ["/usr/local/bin/health_check.sh"]

3. 部署到 Kubernetes

将镜像部署到 Kubernetes 集群中,Kubernetes 会自动监控 Pod 的状态。如果健康检查脚本发现问题并退出,Kubernetes 将根据设置的策略自动重启容器或进行故障转移。

本月精彩文章推荐

  • 云计算架构师韩先超亲身经历 | 记录从大学到现在历程

  • 对合肥电信进行线下Kubernetes技术培训

  • Linux常用命令大全

  • Kubernetes 1.29 发布:新增特性一览

  • 简单易学的Kubernetes(k8s):架构和源码解读

  • K8S管理神器-Rancher一键式部署k8s资源

  • Kubernetes 安全指南:从审计到备份的全面防护

  • 弹性潮汐:基于Kubernetes HPA的智能Pod自动扩缩容

  • 很多docker镜像站被封了?哪些能用,抓紧收藏

  • 国产操作系统崛起!揭开未来科技的神秘面纱

  • Centos停更了,基于业务场景选择合适的操作系统替代Centos。

  • 干掉99%传统运维:基于Jenkins和K8S构建DevOps流水线

  • 深度探索:Linux内核优化高级指南

  • 全面掌握:Linux运维面试必备题库(服务器、网络、Docker、K8s、DevOps等)

  • 探索Kubernetes/K8S的奇妙世界:十大必知创新技术

  • 打造个人图书馆:探索超实用的开源电子书管理工具-Calibre

                  点赞和关注,服务器10年不宕机

你可能感兴趣的:(kubernetes,容器,云原生)