如何在Kubernetes中从容器内部执行URL健康检查?
在Kubernetes中实现容器内部的健康检查
要在K8s里实现基于容器内部环境的健康检查,核心是用**exec类型的探针**——这种模式下kubelet会直接在目标容器内部启动进程执行检查命令,完全复用容器内的环境、依赖和网络。
基础方案:直接执行内置命令
如果容器里已经有curl、wget这类工具,可以直接用它们检查内部URL,示例配置如下:
apiVersion: v1 kind: Pod metadata: name: internal-health-check-pod spec: containers: - name: app-container image: your-app-image:latest livenessProbe: exec: command: - curl - -f # 失败时返回非0退出码 - http://localhost:8080/your-health-endpoint initialDelaySeconds: 5 # 容器启动后延迟5秒开始检查 periodSeconds: 10 # 每10秒检查一次 readinessProbe: exec: command: - curl - -f - http://localhost:8080/your-readiness-endpoint initialDelaySeconds: 10 periodSeconds: 15
进阶方案:自定义检查脚本
如果需要更复杂的检查逻辑(比如验证环境变量、多步骤校验),可以把检查逻辑写进脚本,打包到容器镜像中:
- 编写健康检查脚本(比如
/app/health-check.sh):
#!/bin/bash # 检查环境变量是否存在 if [ -z "$APP_CONFIG" ]; then echo "APP_CONFIG env var missing" exit 1 fi # 检查内部服务状态 response_code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/healthz) if [ "$response_code" -ne 200 ]; then echo "Health endpoint returned $response_code" exit 1 fi # 所有检查通过 exit 0
- 在Dockerfile中把脚本加入镜像并设置权限:
FROM your-base-image:latest # 安装依赖工具(如果基础镜像没有curl/bash) RUN apt-get update && apt-get install -y curl bash \ && rm -rf /var/lib/apt/lists/* # 复制脚本 COPY health-check.sh /app/health-check.sh # 设置可执行权限 RUN chmod +x /app/health-check.sh
- 在K8s探针中调用该脚本:
readinessProbe: exec: command: - /app/health-check.sh initialDelaySeconds: 10 periodSeconds: 15 failureThreshold: 3 # 连续3次失败才标记为未就绪
关键注意事项
- 确保容器镜像包含命令依赖的工具:比如用
curl就要保证镜像里有它,没有的话在Dockerfile中安装。 - 脚本必须返回正确的退出码:0表示健康,非0表示异常,K8s会根据退出码判断探针状态。
- 合理设置探针参数:
initialDelaySeconds要足够让容器启动完成,periodSeconds根据业务稳定性调整检查频率。
内容的提问来源于stack exchange,提问作者Jon Tran
相关产品推荐
相关产品推荐

