Kubernetes Ingress + TLS 故障排查全流程

注:本文虽然为大模型生成和整理,但是却具有极大的实践指导意义,请对大模型生成的文章质量多些信任,本作者通过多次根据指导实践,完成了问题查证,最终实现了预期效果

Kubernetes Ingress + TLS 故障排查全流程(命令+预期结果+流程图)

本文总结了 Ingress-Nginx 结合 TLS 证书访问不通的标准化排查流程,包含逐段验证命令、预期结果和故障定位逻辑,适用于 GitLab、Jenkins 等各类基于 Ingress 暴露的服务。

一、 故障排查核心流程图

复制代码
开始
├── 1. 基础连通性验证(端口+进程)
│   ├── 1.1 检查 Ingress-Nginx Pod 状态 → 正常: Running;异常: CrashLoopBackOff/Error
│   ├── 1.2 检查 Ingress-Nginx 端口监听 → 正常: 80/443 端口被 nginx-ingress 占用
│   └── 1.3 检查 Ingress 资源配置 → 正常: HOSTS/SECRET 配置正确;异常: 配置缺失/错误
├── 2. TLS 证书有效性验证
│   ├── 2.1 检查 TLS Secret 是否存在 → 正常: Secret 存在且包含 tls.crt/tls.key
│   ├── 2.2 解码证书验证域名/有效性 → 正常: 域名匹配+私钥证书成对;异常: 域名不匹配/密钥不匹配
│   └── 2.3 检查 Ingress TLS 关联 → 正常: secretName 与 Secret 名称一致;异常: 名称不匹配
├── 3. 域名解析与端口转发验证
│   ├── 3.1 验证域名解析 IP → 正常: 解析到 Ingress 节点 IP;异常: 解析到非监听节点
│   ├── 3.2 直接访问节点 IP+Host 头 → 正常: 建立 SSL 连接;异常: Connection refused/超时
│   └── 3.3 检查防火墙/安全组 → 正常: 80/443 端口放行;异常: 端口被拦截
├── 4. 后端服务转发链路验证
│   ├── 4.1 测试 Ingress → Service 连通性 → 正常: 集群内访问 Service 通;异常: Service 不可达
│   ├── 4.2 测试 Service → Pod 连通性 → 正常: 访问 Pod IP 通;异常: Pod 未运行/端口错误
│   └── 4.3 检查 Pod 内部服务状态 → 正常: 服务进程运行;异常: 进程崩溃/资源不足
└── 5. 高级配置验证(重定向/HTTP2)
    ├── 5.1 检查 Ingress 注解配置 → 正常: ssl-redirect 等注解正确;异常: 注解缺失/冲突
    └── 5.2 查看 Ingress-Nginx 日志 → 正常: 无转发错误;异常: 日志中包含 upstream 错误
结束(定位问题并修复)

二、 分阶段排查步骤(命令+预期结果+故障处理)

阶段 1:基础连通性验证(Ingress 组件是否正常)

核心目标:确认 Ingress-Nginx 控制器本身运行正常,端口监听无误。

|-----------------------------|-----------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------|
| 排查步骤 | 执行命令 | 预期结果 | 异常处理方案 |
| 1.1 检查 Ingress-Nginx Pod 状态 | ​​kubectl get pod -n kube-system -l app=nginx-ingress​​ | Pod 状态为 ​​Running​​,RESTARTS 为 0 | 1. 异常状态(CrashLoopBackOff):执行 ​​kubectl logs <pod-name> -n kube-system​​ 查看日志 2. 常见原因:资源不足/端口冲突 → 扩容资源/停止占用 80/443 的服务 |
| 1.2 检查节点 80/443 端口监听 | `netstat -tlnp | grep -E "80 | 443"` |
| 1.3 检查 Ingress 资源配置 | ​​kubectl get ingress -n <namespace> -o yaml​​ | 1. ​​spec.tls.hosts​​ 包含目标域名 2. ​​spec.tls.secretName​​ 正确 3. ​​spec.rules.host​​ 与 TLS 域名一致 4. ​​spec.rules.http.paths.backend​​ 指向正确 Service/Port | 1. 域名不匹配:修改 Ingress ​​hosts​​ 与证书域名一致 2. Secret 名称错误:调整 ​​secretName​​ 与实际 Secret 名称一致 |

阶段 2:TLS 证书有效性验证(证书是否合法可用)

核心目标:确认 Secret 中的证书/私钥有效,且与 Ingress 配置匹配。

|------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------|---------------------------------------------------------------------------------------|
| 排查步骤 | 执行命令 | 预期结果 | 异常处理方案 |
| 2.1 检查 TLS Secret 是否存在 | ​​kubectl get secret <tls-secret-name> -n <namespace>​​ | Secret 存在,Type 为 ​​kubernetes.io/tls​​ | 不存在则重新创建: ​​kubectl create secret tls <name> --cert=xxx.crt --key=xxx.key -n <ns>​​ |
| 2.2 解码证书验证域名 | ​​kubectl get secret <tls-secret-name> -n <ns> -o jsonpath='{.data.tls\.crt}' | base64 -d > secret.crt<br>openssl x509 -in secret.crt -noout -subject​​ | Subject 中 ​​CN​​​ 字段等于目标域名(如 ​​CN=gitlab.devops.global-fairy.top​​) | 域名不匹配:重新生成包含正确域名的证书,再重建 Secret |
| 2.3 验证证书与私钥成对 | ​​kubectl get secret <tls-secret-name> -n <ns> -o jsonpath='{.data.tls\.key}' | base64 -d > secret.key<br># 验证私钥有效性<br>openssl rsa -in secret.key -check<br># 对比模数 MD5<br>openssl x509 -in secret.crt -noout -modulus | openssl md5<br>openssl rsa -in secret.key -noout -modulus | openssl md5​​ | 1. 私钥验证无报错 2. 两个 MD5 值完全一致 | 1. 私钥无效:重新生成证书私钥对 2. MD5 不一致:确认证书和私钥是成对生成的,重建 Secret |

阶段 3:域名解析与端口转发验证(请求能否到达 Ingress 节点)

核心目标:确认域名解析到正确的 Ingress 节点,且端口可访问。

|----------------------|---------------------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------|
| 排查步骤 | 执行命令 | 预期结果 | 异常处理方案 |
| 3.1 验证域名解析 IP | ​​nslookup <目标域名>​​​ 或 ​​getent hosts <目标域名>​​ | 解析到的 IP 是 Ingress-Nginx 运行的节点 IP | 1. 解析到错误 IP:修改 hosts 文件或 DNS 记录,指向正确节点 IP 2. 提示未知域名:检查 hosts/DNS 配置是否生效 |
| 3.2 直接访问节点 IP+Host 头 | ​​curl -v https://<节点IP> --insecure -H "Host: <目标域名>"​​ | 1. 输出 ​​SSL connection using TLSv1.3​​(SSL 握手成功) 2. 无 ​​Connection refused​​ 错误 | 1. 连接拒绝:检查 Ingress-Nginx 是否监听 443 端口 → 调整部署模式(NodePort/HostNetwork) 2. SSL 握手失败:回到阶段 2 重新验证证书 |
| 3.3 检查防火墙/安全组 | ```# CentOS 防火墙检查 firewall-cmd --list-ports | grep -E "80 | 443" # NodePort 模式需检查映射端口 kubectl get svc nginx-ingress-controller -n kube-system``` | 1. 80/443 端口已放行 2. NodePort 模式下 443 对应的 NodePort 已放行 |

阶段 4:后端服务转发链路验证(Ingress 能否转发到 Pod)

核心目标:确认 Ingress → Service → Pod 的转发链路畅通。

|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------|
| 排查步骤 | 执行命令 | 预期结果 | 异常处理方案 |
| 4.1 获取 Service 信息 | ​​kubectl get svc <service-name> -n <namespace> -o yaml​​ | 1. ​​spec.ports[0].port​​ 与 Ingress 配置的后端端口一致 2. ​​spec.selector​​ 标签与 Pod 标签匹配 | 1. 端口不匹配:修改 Ingress 后端端口或 Service 端口 2. 标签不匹配:调整 Service selector 或 Pod 标签 |
| 4.2 测试 Service 连通性 | ​​SVC_IP=$(kubectl get svc <svc-name> -n <ns> -o jsonpath='{.spec.clusterIP}')<br>curl -v http://$SVC_IP:<service-port>​​ | 返回后端服务响应(如 GitLab 的 302 重定向、Jenkins 的 200 响应) | 1. Service 不可达:检查 Service 是否关联到 Pod → ​​kubectl get endpoints <svc-name> -n <ns>​​2. 返回 404/500:检查后端 Pod 服务是否正常 |
| 4.3 测试 Pod 连通性 | ​​POD_IP=$(kubectl get pod <pod-name> -n <ns> -o jsonpath='{.status.podIP}')<br>curl -v http://$POD_IP:<pod-port>​​ | 返回后端服务响应(与 4.2 结果一致) | 1. Pod 不可达:检查 Pod 是否运行 → ​​kubectl get pod <pod-name> -n <ns>​​2. Pod 内服务未启动:进入 Pod 重启服务 → ​​kubectl exec -it <pod-name> -n <ns> -- bash​​ |
| 4.4 检查 Pod 资源与状态 | ​​# 无 Metrics Server 时查看 Pod 事件<br>kubectl describe pod <pod-name> -n <ns> | grep -A 10 Events<br># 有 Metrics Server 时查看资源<br>kubectl top pod <pod-name> -n <ns>​​ | 1. Events 无 ​​OOMKilled​​​/​​BackOff​​ 错误 2. 资源使用率未超过 limits | 1. OOM 错误:扩容 Pod 资源限制 2. 启动失败:查看 Pod 日志 → ​​kubectl logs <pod-name> -n <ns>​​ |

阶段 5:高级配置验证(解决 302/400/无响应问题)

核心目标:处理 Ingress 配置导致的重定向、超时等问题。

|---------------------------|----------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|
| 排查步骤 | 执行命令 | 预期结果 | 异常处理方案 |
| 5.1 检查 Ingress 注解配置 | ​​kubectl get ingress <ingress-name> -n <ns> -o yaml​​ | 包含以下关键注解(按需配置): ​​nginx.ingress.kubernetes.io/ssl-redirect: "true"​​ ​​nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"​​ ​​nginx.ingress.kubernetes.io/http2-disable: "true"​​ | 1. 缺失 ssl-redirect:添加注解强制 HTTP 转 HTTPS 2. 存在 HTTP2 兼容性问题:添加 ​​http2-disable: "true"​​ 注解 |
| 5.2 查看 Ingress-Nginx 日志 | ​​kubectl logs <nginx-ingress-pod> -n kube-system​​ | 无 ​​upstream timed out​​​/​​host not found​​ 等错误 | 1. upstream 超时:延长 proxy-read-timeout 注解 2. host not found:检查 Ingress host 配置是否正确 |
| 5.3 重启 Ingress-Nginx 生效配置 | ​​kubectl rollout restart deployment nginx-ingress-controller -n kube-system​​ | Ingress-Nginx Pod 重启后状态为 Running | 重启后仍报错:检查配置文件语法是否正确 → ​​kubectl apply -f ingress.yaml --dry-run=client​​ |

三、 常见故障速查表

|--------------------------------|--------|---------------------------------|
| 故障现象 | 对应排查阶段 | 高频原因 |
| ​​Connection refused (443)​​ | 阶段 1/3 | Ingress-Nginx 未监听 443 端口;防火墙未放行 |
| ​​SSL handshake failed​​ | 阶段 2 | 证书域名不匹配;证书私钥不匹配 |
| 域名解析到错误 IP | 阶段 3 | hosts/DNS 记录配置错误 |
| ​​upstream timed out​​ | 阶段 4/5 | 后端 Pod 资源不足;Ingress 超时时间过短 |
| ​​302 Found​​ 但浏览器无法访问 | 阶段 5 | 缺失 HTTPS 重定向注解;HTTP2 兼容性问题 |

四、 复用说明

  1. 本文流程适用于 所有基于 Ingress-Nginx 暴露的服务 ,只需替换 ​<namespace>​/​<ingress-name>​ 等占位符;
  2. 排查时按阶段顺序执行,优先解决前序阶段的问题,再推进到后序阶段;
  3. 建议将本文保存为 Markdown 文件,结合实际场景补充自定义命令和故障案例。

需要我帮你把这份排查流程整理成一个可直接打印的排查 checklist吗?

相关推荐
岁岁种桃花儿2 小时前
K8s核心流量管理:Ingress与Service深度解析及实战对比
云原生·容器·kubernetes
晚霞的不甘2 小时前
Flutter for OpenHarmony 进阶实战:打造 60FPS 流畅的物理切水果游戏
javascript·flutter·游戏·云原生·正则表达式
市安2 小时前
docker命令知识点1
运维·docker·云原生·容器·eureka
天才奇男子3 小时前
LVS原理及部署
linux·运维·云原生·wpf·lvs·linux chrony
学习3人组3 小时前
Docker run 挂载本地两个目录到容器内的写法(核心规则+实操示例)
运维·docker·容器
礼拜天没时间.4 小时前
《Docker实战入门与部署指南:从核心概念到网络与数据管理》:初识Docker——概念与优势
linux·运维·网络·docker·容器·centos
fo安方5 小时前
软考~系统规划与管理师考试——真题篇——章节——第10章 云原生系统规划——解析版
云原生·项目管理·系统·软考·pmp·规划
小毅&Nora5 小时前
【云计算】【Kubernetes】⑥ 流量入口大解析:从 Nginx 到 Ingress 再到 Gateway API
kubernetes·ingress·gatewayapi
optimistic_chen5 小时前
【Docker入门】Docker Image(Docker 镜像)
linux·运维·docker·容器·镜像