Kubernetes中配置Ingress实现七层路由需三步:部署Ingress Controller(如ingress-nginx)、准备后端Service与Pod、定义Ingress资源(含host/path/tls规则),并验证ADDRESS、DNS及日志排错。

在 Kubernetes 集群中配置 Ingress 实现七层(HTTP/HTTPS)路由和域名转发,核心是三步:部署 Ingress Controller、定义 Ingress 资源、确保后端 Service 和 Pod 正常就绪。Ingress 本身只是 API 对象,必须搭配 Ingress Controller(如 Nginx、Traefik、Kong)才能生效。
部署 Ingress Controller(以 nginx-ingress 为例)
官方推荐使用 ingress-nginx(由 Kubernetes 社区维护)。推荐通过 Helm 或官方 manifests 部署:
- 用 Helm(推荐,版本可控):
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace - 确认 Pod 运行正常:
kubectl get pod -n ingress-nginx —— 应看到ingress-nginx-controller-xxx处于 Running 状态 - 检查其 Service 类型:默认为 LoadBalancer(云环境)或 NodePort(裸机/测试环境)。若用 NodePort,需确保节点端口(如 30080/30443)可被外部访问
准备后端应用与 Service
Ingress 的作用是把流量转发到已有 Service,因此需先部署真实服务:
- 编写 Deployment + Service 示例(如一个 Nginx 页面):
kubectl create deploy web --image=nginx
kubectl expose deploy web --port=80 --target-port=80 --type=ClusterIP - 验证内部连通性:
kubectl run test --rm -it --image=curlimages/curl --restart=Never -- curl -s http://web —— 应返回 Nginx 欢迎页 - Service 名称(
web)、端口(80)将在 Ingress 中直接引用
定义 Ingress 资源(支持多域名、路径、TLS)
创建 YAML 文件描述路由规则。以下示例实现:
• app.example.com → 转发到 web Service
• api.example.com/v1 → 转发到另一 Service(如 api)
• 启用 HTTPS(需提前准备 TLS Secret)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2 # 用于路径重写(可选)
spec:
ingressClassName: nginx # 必须匹配已安装的 IngressClass 名称(Helm 默认为 "nginx")
tls:
- hosts:
- app.example.com
- api.example.com
secretName: example-tls # 需提前用 kubectl create secret tls 创建
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
- host: api.example.com
http:
paths:
- path: /v1(/|$)(.*)
pathType: Prefix
backend:
service:
name: api
port:
number: 8080
-
ingressClassName 必须与 Ingress Controller 所监听的 Class 一致(Helm 安装时默认创建
ingressclass.networking.k8s.io/nginx) -
pathType=Prefix 表示前缀匹配;
/v1(/|$)(.*)配合 rewrite 注解可将/v1/foo重写为/foo转发给后端 - TLS Secret 需通过
kubectl create secret tls example-tls --cert=tls.crt --key=tls.key -n default创建,且与 Ingress 同命名空间
验证与排错要点
配置完成后,按顺序检查:
- 执行 kubectl get ingress,状态应显示 ADDRESS(即 Ingress Controller 的 IP 或域名)
- 用
curl -H "Host: app.example.com" http://<INGRESS_IP>测试(若未配 DNS),确认返回后端响应 - DNS 解析:将
app.example.com解析到 Ingress Controller 的 External-IP(云环境)或任一节点 IP(NodePort 场景) - 常见问题定位:
•kubectl describe ingress example-ingress查看 Events 是否有 Warning(如 Service 不存在、Secret 未找到)
•kubectl logs -n ingress-nginx deploy/ingress-nginx-controller查看控制器日志
• 确保 Service 的selector匹配 Pod 的 labels,且 Pod 处于 Ready 状态


















