Go服务应暴露/healthz端点返回200 OK,避免副作用;/readyz分离依赖检查,用带超时的PingContext;K8s探针与Docker HEALTHCHECK无关,应统一配置于K8s资源中。
Kubernetes 的 livenessProbe 和 readinessProbe 默认依赖 HTTP 状态码,Go 服务只需提供一个稳定、低开销的 HTTP handler 即可。关键不是“实现多复杂”,而是“不引入副作用”——比如避免在健康检查中触发数据库连接、缓存刷新或日志刷盘。
推荐用 net/http 直接注册 /healthz(K8s 社区约定路径),返回 200 OK 即可:
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain")
w.WriteHeader(http.StatusOK)
w.Write([]byte("ok"))
})
如果需要轻量级状态反馈(如是否加载了配置),可返回 JSON,但务必控制字段数量和序列化开销;避免调用
time.Now() 或 runtime.NumGoroutine() 这类看似无害实则可能波动的指标。
HTTP 探针失效的典型场景:服务监听 Unix socket、仅支持 gRPC、或明确禁止外部 HTTP 访问(如某些内部管理服务)。这时需退回到更底层的探测方式。
tcpSocket 适合纯 TCP 服务(如 Redis、自研协议服务器),K8s 仅尝试建立连接,不发任何数据 —— 所以你的 Go 服务只要监听了对应端口且未被防火墙拦截,就可通过exec 探针适用于必须验证进程内状态的场景,例如检查某个临时文件是否存在、确认本地 etcd 成员状态。此时需在容器内提供可执行命令,比如:exec: command: ["/bin/sh", "-c", "grep -q 'ready' /var/run/app-state && exit 0 || exit 1"]注意:Go 程序本身不能直接响应
exec,必须靠外部脚本或提前写入的状态文件配合readiness 不等于 liveness:前者决定“能否接收流量”,后者决定“是否该重启”。很多团队误把数据库连通性检查塞进 /healthz,导致 DB 临时抖动时整个服务被 K8s 从 Service Endpoints 中摘除,反而放大故障。
更合理的做法是分离端点:
/healthz:只做进程存活检查(如上文的纯 HTTP 200)/readyz:检查依赖就绪状态(DB 连接池可用、gRPC 后端可达、本地缓存 warmup 完成)在 Go 中,/readyz 应使用带超时的非阻塞检查。例如检查 PostgreSQL 连接:
db, _ := sql.Open("pgx", dsn)
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
defer cancel()
err := db.PingContext(ctx)
if err != nil {
http.Error(w, "db unreachable", http.StatusServiceUnavailable)
return
}
w.WriteHeader(http.StatusOK)
注意:不要复用全局 *sql.DB 的 Ping(),它不带上下文,超时不可控;也不要在这里执行 SELECT 1 —— PingContext 已足够。
Docker 自身的 HEALTHCHECK(如 HEALTHCHECK --interval=30s CMD curl -f http://localhost:8080/healthz || exit 1)和 K8s 的探针是两套独立机制。K8s 完全忽略 镜像里定义的 HEALTHCHECK,它只认 Pod spec 中的 livenessProbe/readinessProbe。
这意味着:
unhealthy,得先确认是 docker ps 报的,还是 kubectl describe pod 里 Events 显示的建议:在 K8s 环境下,彻底移除 Dockerfile 中的 HEALTHCHECK,所有健康策略统一收口到 Helm chart 或 K8s YAML 的 probe 字段中。
# redis
# js
# json
# go
# docker
# golang
# 防火墙
# app
# 端口
# 后端
# curl
# ai
# unix
# sql
# select
相关文章:
威客平台建站流程解析:高效搭建教程与设计优化方案
建站之星安装失败:服务器环境不兼容?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
表情包在线制作网站免费,表情包怎么弄?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
公司门户网站制作流程,华为官网怎么做?
家庭建站与云服务器建站,如何选择更优?
如何快速生成凡客建站的专业级图册?
如何通过远程VPS快速搭建个人网站?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
如何在建站主机中优化服务器配置?
如何做静态网页,sublimetext3.0制作静态网页?
网站制作免费,什么网站能看正片电影?
黑客入侵网站服务器的常见手法有哪些?
Thinkphp 中 distinct 的用法解析
如何高效利用亚马逊云主机搭建企业网站?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何选择高效响应式自助建站源码系统?
如何自定义建站之星网站的导航菜单样式?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何实现建站之星域名转发设置?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
常州自助建站工具推荐:低成本搭建与模板选择技巧
网站制作报价单模板图片,小松挖机官方网站报价?
如何在宝塔面板创建新站点?
营销式网站制作方案,销售哪个网站招聘效果最好?
个人网站制作流程图片大全,个人网站如何注销?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
seo网站制作优化,网站SEO优化步骤有哪些?
微信小程序 五星评分(包括半颗星评分)实例代码
宿州网站制作公司兴策,安徽省低保查询网站?
音乐网站服务器如何优化API响应速度?
电商平台网站制作流程,电商网站如何制作?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
建站之星如何修改网站生成路径?
利用JavaScript实现拖拽改变元素大小
如何快速搭建高效WAP手机网站吸引移动用户?
如何选择最佳自助建站系统?快速指南解析优劣
Java解压缩zip - 解压缩多个文件或文件夹实例
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
如何通过西部建站助手安装IIS服务器?
香港服务器租用费用高吗?如何避免常见误区?
定制建站流程解析:需求评估与SEO优化功能开发指南
在线教育网站制作平台,山西立德教育官网?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
深圳网站制作平台,深圳市做网站好的公司有哪些?
北京的网站制作公司有哪些,哪个视频网站最好?
建站之星安装步骤有哪些常见问题?
*请认真填写需求信息,我们会在24小时内与您取得联系。