Ingress 实现外部HTTP/HTTPS流量转发需Ingress Controller、后端Service、Ingress资源三者协同:Controller是执行流量转发的Pod(如ingress-nginx),Service提供稳定入口并关联Pod,Ingress资源定义基于host/path的路由规则,缺一不可且须按序部署。

配置 Kubernetes Ingress 实现外部流量转发,本质是搭建一条从公网到 Pod 的 HTTP/HTTPS 路径,关键不在“写一个 Ingress 资源”,而在于三个组件必须协同工作:Ingress Controller(执行者)、后端 Service(稳定入口)、Ingress 资源(路由指令)。缺一不可,顺序也不能颠倒。
部署并验证 Ingress Controller
Ingress 本身只是 YAML 文件,不干活;真正处理流量的是 Ingress Controller(如 ingress-nginx、Traefik)。它以 Pod 形式运行,监听 80/443 端口,并通过 Service 暴露出去。
- 推荐用官方 Helm Chart 安装 ingress-nginx:
helm upgrade -i ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx --create-namespace - 安装后检查控制器 Pod 是否就绪:
kubectl get pod -n ingress-nginx - 确认其 Service 类型(通常是 LoadBalancer 或 NodePort)及对外地址:
kubectl get svc -n ingress-nginx。若为 NodePort,需确保节点防火墙开放对应端口(如 30080/30443);若为 LoadBalancer,等待 EXTERNAL-IP 分配完成
准备好后端 Service 和 Pod
Ingress 规则最终指向的是 Service,不是 Pod。所以必须先有健康、带正确 label 的 Deployment 和匹配的 Service。
- Deployment 中定义
app: myapp这类标签 - Service 的
selector必须精确匹配上述 label,例如:selector: {app: myapp} - 用
kubectl get endpoints myapp-service验证是否关联到真实 Pod IP。空列表说明 Service 没找到 Pod,常见原因是 label 不一致或 Pod 未就绪
定义 Ingress 资源并绑定域名或路径
Ingress 对象声明“谁来访问、怎么分发”。支持基于 host(域名)和 path(路径)两级路由,也可启用 TLS。
- 最简示例(基于路径):
rules → http → paths → path: /api → backend → service.name: api-svc - 多域名示例:
host: app.example.com → backend to app-svc;host: api.example.com → backend to api-svc - 启用 HTTPS:在 Ingress 中添加
tls字段,引用已存入集群的 Secret(含 tls.crt/tls.key),且host必须与证书域名一致 - 注意 API 版本:K8s 1.22+ 推荐用
networking.k8s.io/v1,避免使用已废弃的extensions/v1beta1
排错要点:三看一测
流量不通时,按顺序排查:
- 看 Controller 日志:
kubectl logs -n ingress-nginx deploy/ingress-nginx-controller,关注是否报“no suitable endpoint”或 TLS 加载失败 - 看 Ingress 状态:
kubectl describe ingress my-ingress,检查 Events 是否提示 “No rule matched” 或 “service not found” - 看 Service 和 Endpoints:
kubectl get svc,ep,确认后端服务真实存在且有 Pod 注册 - 测连通性:从集群外 curl
http://<external-ip>/healthz</external-ip>(Controller 健康检查路径),再试具体路由路径,排除 DNS 或网络中间件干扰


















