应精准对齐端口管理与健康检查逻辑:先确认SLB、K8s探针、Docker HEALTHCHECK实际使用的端口和路径,再通过手动探测、端口监听验证及网络策略检查三步验证,最后按最小权限原则隔离开放专用健康端口,并纳入IaC协同管控。

关闭未使用端口本是安全加固的常规操作,但若误关了健康检查依赖的端口(如SLB默认用80端口探测、Kubernetes readiness probe指定8080),就会导致“服务明明在跑,却被标记为不健康、流量被剔除”的典型故障。关键不是“别关端口”,而是让端口管理与健康检查逻辑对齐。
确认健康检查实际使用的端口和路径
不同平台默认行为差异大,不能凭经验猜测:
- 阿里云SLB七层监听:健康检查默认发 HEAD / HTTP/1.0 到后端ECS内网IP的80端口(即使你监听的是443);若改了健康检查端口,必须同步开放该端口并确保应用监听
- Kubernetes中livenessProbe/readinessProbe:明确写在YAML里,例如 port: 8080 + path: /health,这个端口必须由容器内进程主动bind,且不能被iptables或云安全组拦截
- Docker HEALTHCHECK:CMD中curl的目标地址(如 http://localhost:3000/ready)决定真实探测端口,镜像里没装curl?路径返回500?端口没监听?都会失败
端口关闭前做三步验证
不是“先关再试”,而是“先验再关”:
- 查当前所有健康检查配置:梳理SLB监听、Ingress规则、Deployment探针、Dockerfile HEALTHCHECK,汇总出所有被实际调用的端口+路径
- 在目标机器上手动模拟探测:echo -e "HEAD /health HTTP/1.0\r\n\r\n" | nc -w 3 <内网IP> 8080,看是否收到HTTP 200响应;用netstat -tuln | grep :8080确认端口确实在LISTEN状态
- 检查网络链路:确认云平台安全组、主机iptables/firewalld、容器网络策略(如Calico NetworkPolicy)都放行该端口的入方向流量,尤其注意SLB健康检查源IP是内网固定段(非0.0.0.0/0)
用最小权限原则开放健康端口
不等于“全开80”,而是精准、隔离、可审计:
- 只在健康检查必需的网络平面开放:SLB健康检查走内网,就只在内网网卡上开8080;公网入口不需要该端口,就在公网安全组中显式拒绝
- 用专用健康端点替代主服务端口:比如主服务跑在8080,健康检查单独暴露一个轻量端口(如8081)并只挂载/health路由,避免业务接口变动影响探测
- 容器内用非root用户监听:避免因权限问题导致绑定失败;Docker HEALTHCHECK命令中用绝对路径调用工具(如/usr/bin/curl),防止精简镜像里缺失
建立端口变更的协同流程
运维关端口、开发改探针、SRE配监控,必须联动:
- 把健康检查配置纳入IaC管理:Terraform定义SLB健康检查参数,Helm Chart模板化K8s探针,Dockerfile统一HEALTHCHECK指令,避免手工散落
- 上线前自动校验:CI流水线中加入脚本,解析部署文件提取所有健康端口,然后在测试环境执行nc -zv host port连通性断言
- 生产变更双人复核:任何端口关闭操作,必须附带“已确认不影响以下健康检查端口:xxx”的签字记录,并触发一次人工抽检

















