ingress是kubernetes中唯一原生支持基于host和path路由的资源,service的loadbalancer仅分配单ip、nodeport仅用固定端口,均无法实现域名区分与http层路由,故ingress为必选项。

直接结论:Kubernetes 本身不解析域名,自定义域名需靠 Ingress + 外部 DNS 配合实现;Ingress 控制器(如 nginx-ingress、ingress-nginx)必须已部署,且你的 Go 应用需暴露 HTTP/HTTPS 端口并正确响应健康检查。
为什么 Ingress 是必选项,而不是 Service NodePort 或 LoadBalancer
Ingress 是 Kubernetes 中唯一原生支持基于 Host 和 Path 路由的资源,Service 的 type: LoadBalancer 只能给服务分配一个 IP,无法区分 api.example.com 和 admin.example.com;NodePort 更是只能走固定端口(如 30080),完全不参与域名解析。只有 Ingress 才能真正把 Host 头映射到后端 Service。
- 没装 Ingress 控制器?
kubectl get pods -n ingress-nginx返回空,就得先helm install ingress-nginx ingress-nginx/ingress-nginx或按官方 manifest 部署 - Ingress 控制器没暴露到集群外?确认它对应的 Service 类型是
LoadBalancer(云环境)或NodePort(裸机),且外部能访问其 IP:Port - Go 应用没监听
80/443或没返回 200?Ingress 默认只转发 HTTP 流量,你的http.ListenAndServe(":8080", nil)没问题,但 Ingress 的spec.rules.http.paths.backend.service.port.number必须设为8080,不能默认填 80
Go 应用 Deployment 和 Service 必须满足的三个条件
哪怕 Ingress 配对成功,后端 Pod 不符合要求也会 502/503。常见漏项:
-
readinessProbe和livenessProbe必须配置,路径要真实可访问(比如/health),且返回 HTTP 200;否则 Ingress 控制器会认为后端不可用,拒绝转发 - Service 的
selector必须和 Deployment 的pod.template.metadata.labels完全一致,字段名和值一个字符都不能差 - Go 服务启动时别绑定
127.0.0.1:8080—— 必须用":8080"(即监听所有接口),否则 Pod 内其他容器(包括 Ingress 控制器)无法访问
Ingress YAML 中 Host 和 TLS 配置的关键细节
自定义域名生效的核心在 Ingress 的 host 字段和 TLS 终止位置,不是写上去就自动解析:
- Host 值必须小写、无通配符(除非你明确用了
*.example.com并配了泛域名证书),且 DNS A 记录必须指向 Ingress 控制器的外网 IP(不是集群内 ClusterIP) - 如果要用 HTTPS,
tls[].hosts必须和rules[].host完全一致;证书 Secret 必须存在且命名正确:kubectl create secret tls example-tls --cert=cert.pem --key=key.pem -n default - 别在 Ingress 里写
nginx.ingress.kubernetes.io/ssl-redirect: "true"却没配 TLS —— 这会导致所有 HTTP 请求被 308 重定向,但没证书就卡死
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-app-ingress
spec:
tls:
- hosts:
- api.example.com
secretName: example-tls
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: go-app-service
port:
number: 8080
DNS 和本地调试怎么验证是否真通
很多人卡在“Ingress 已创建,但浏览器打不开”,其实问题常出在链路中间:
- 先绕过 DNS:用
curl -H "Host: api.example.com" http://<ingress-ip></ingress-ip>,如果返回 Go 服务内容,说明 Ingress + Service + Pod 全通,只是 DNS 没切过去 - 查 DNS 是否生效:
dig api.example.com +short或nslookup api.example.com,必须返回 Ingress 控制器的外网 IP;Cloudflare 等 CDN 开启代理(橙色云)时,得确认它没拦截或缓存 5xx - 浏览器 F12 看 Network → Headers,确认请求发出去的
Request URL是https://api.example.com,且Response Headers里有server: nginx(来自 Ingress 控制器)而非server: Go(直连 Pod)
最易忽略的一点:Ingress 资源必须和 Go 应用的 Service 在同一个 namespace,跨 namespace 需用 ingressclass 或额外配置,别默认假设能跨。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











