Kubernetes Ingress从入门到实战
创建 echo Ingress 所需的核心知识:从原理到实践
在 Kubernetes(K8s)集群中,Ingress 是管理 “外部流量访问集群内部 Service” 的核心资源,它像 “集群入口的路由规则”,能通过域名和路径将请求精准转发到对应 Service。本文结合 “创建 echo Ingress” 的具体需求,梳理完成任务必须掌握的知识,帮你避开配置误区,确保 curl http://example.org/echo能正常返回 “Hello World ^_^”。
一、先搞懂:Ingress 到底是什么?它解决了什么问题?
在学习配置前,必须先明确 Ingress 的定位 —— 它不是 “直接暴露服务的组件”,而是 “路由规则的集合”,核心作用是解决 “多 Service 共享一个外部 IP” 的问题。
1. Ingress 的核心价值
K8s 中暴露 Service 的方式有 3 种:NodePort、LoadBalancer、Ingress。前两种存在明显局限:
- NodePort:每个 Service 占用节点的一个端口,端口范围有限(30000-32767),不适合多服务场景;
- LoadBalancer:依赖云厂商的负载均衡器,每个 Service 对应一个 LB,成本高且管理复杂。
而 Ingress 的优势在于:
- 共享 IP:多个 Service 可通过同一个 Ingress 关联的外部 IP 暴露,只需通过 “域名 + 路径” 区分;
- 规则集中:所有路由规则(如域名匹配、路径转发、SSL 配置)都在 Ingress 中定义,便于管理;
- 低成本:无需为每个 Service 创建负载均衡器,只需为 Ingress Controller 配置一个外部 IP。
2. Ingress 的工作依赖:Ingress Controller
这是最容易被忽略的前提:Ingress 资源本身不具备 “转发流量” 的能力,它需要依赖 “Ingress Controller”(如 Nginx Ingress Controller、Traefik)来实现规则落地。
Ingress Controller 的作用:
- 持续监听 K8s API 中 Ingress 资源的变化;
- 将 Ingress 的路由规则转换为自身的配置(如 Nginx 的 nginx.conf);
- 接收外部流量,根据规则转发到集群内部的 Service。
简单说:Ingress 是 “规则清单”,Ingress Controller 是 “执行规则的引擎”—— 没有部署 Ingress Controller,创建再多 Ingress 资源也无法生效。
二、任务核心:Ingress 的 3 个关键配置维度
本次任务要求:Ingress 名称为 echo、命名空间为 sound-repeater,将http://example.org/echo路由到 echoserver-service 的 8080 端口。需精准掌握 Ingress 配置的 3 个核心维度:命名空间隔离、路由规则(Host+Path)、后端 Service 关联。
1. 维度 1:命名空间 ——Ingress 与 Service 的 “归属绑定”
任务明确 Ingress 和 Service 都在 “sound-repeater” 命名空间,这涉及 K8s 命名空间的核心规则:
- 资源隔离:命名空间内的资源(Ingress、Service、Pod)只能被同一命名空间的资源访问,跨命名空间需显式配置;
- Ingress 的限制:Ingress 只能关联 “同一命名空间” 的 Service,无法直接转发到其他命名空间的 Service(除非通过 ServiceImport 等特殊资源)。
配置要点:在 Ingress 的 metadata 中必须指定namespace: sound-repeater,否则 Ingress 会默认创建在default命名空间,导致无法找到 sound-repeater 中的 echoserver-service。
2. 维度 2:路由规则 ——Host+Path 精准匹配请求
Ingress 通过 “Host(域名)” 和 “Path(路径)” 确定请求的转发目标,这是任务的核心配置。
(1)Host:域名匹配
任务中的 Host 是example.org,需理解:
- Host 的作用:Ingress 会检查请求的Host头(即访问的域名),只有匹配的请求才会进入该 Ingress 的规则;
- 格式要求:必须是合法的域名(如example.org、api.example.org),不能是 IP 地址;
- 通配符支持:若需匹配子域名,可使用*.example.org(但需 Ingress Controller 支持)。
误区提醒:若不指定 Host,Ingress 会匹配 “所有没有 Host 头的请求”,但本次任务需精准匹配example.org,必须显式配置host: example.org。
(2)Path:路径匹配
任务中的 Path 是/echo,需掌握 Path 的匹配规则和pathType(K8s 1.18 + 新增,必填):
- 常见 pathType 类型:
-
- Exact:精确匹配路径,仅当请求路径与配置完全一致时生效(如/echo只匹配/echo,不匹配/echo/或/echo/test);
-
- Prefix:前缀匹配,请求路径以配置的 Path 开头即生效(如/echo会匹配/echo、/echo/、/echo/test);
-
- ImplementationSpecific:由 Ingress Controller 决定匹配规则,不推荐新手使用。
任务适配:本次需转发http://example.org/echo,若希望仅匹配 “/echo” 路径,建议用pathType: Exact;若需支持 “/echo” 下的子路径(如/echo/detail),可使用pathType: Prefix。
3. 维度 3:后端 Service 关联 —— 路由的 “最终目标”
Ingress 匹配 Host 和 Path 后,需转发到集群内部的 Service,这部分通过backend字段配置,核心是 “Service 名称 + Service 端口”。
配置要求:
- Service 必须存在:需确保 sound-repeater 命名空间中已有名为echoserver-service的 Service,且该 Service 的spec.ports中包含port: 8080(无需关注 targetPort,Ingress 只需关联 Service 的端口,由 Service 转发到 Pod 的 targetPort);
- 字段格式:在 Ingress 的spec.rules.http.paths.backend中配置:
backend:
service:
name: echoserver-service # Service名称
port:
number: 8080 # Service的端口号
排查点:若 Service 不存在或端口错误,Ingress 会显示 “后端不可用”,curl 请求会返回 404 或 503 错误。
三、域名解析:让http://example.org/echo能找到集群
任务最后需要通过curl http://example.org/echo验证,这涉及 “域名解析” 的关键知识 —— 必须让example.org指向 Ingress Controller 的外部 IP,否则请求无法到达集群。
1. 两种常见的域名解析方式
(1)测试环境:修改 /etc/hosts 文件(推荐)
适合本地测试,无需配置 DNS 服务器,直接在执行 curl 的机器上修改/etc/hosts文件:
- 第一步:获取 Ingress Controller 的外部 IP(通常是 Ingress Controller 的 Service 的 EXTERNAL-IP):
# 查看Ingress Controller的Service(以Nginx Ingress为例,通常在ingress-nginx命名空间)
kubectl get svc -n ingress-nginx
# 输出中找到EXTERNAL-IP列,如192.168.1.100
- 第二步:编辑/etc/hosts,添加一行:
192.168.1.100 example.org # 格式:Ingress Controller外部IP + 域名
- 原理:当执行curl http://example.org/echo时,机器会优先从/etc/hosts读取解析,将请求发送到 192.168.1.100(Ingress Controller)。
(2)生产环境:配置 DNS 服务器
在生产环境中,需在 DNS 服务器(如阿里云 DNS、CoreDNS)中添加一条 “A 记录”:
- 记录类型:A(将域名指向 IPv4 地址);
- 主机记录:@(表示example.org,若为子域名则填 api、www 等);
- 记录值:Ingress Controller 的外部 IP;
- TTL:建议设置为 300 秒(5 分钟),便于后续 IP 变更时快速生效。
2. 常见误区:直接解析到 Service 的 ClusterIP
绝对不能将example.org解析到 echoserver-service 的 ClusterIP(如 10.96.0.10)!因为 ClusterIP 是集群内部的虚拟 IP,仅能在集群内部访问,外部机器(如执行 curl 的机器)无法通过 ClusterIP 访问 Service。
四、实操配置:Ingress YAML 文件的完整拆解
掌握上述知识后,可通过 YAML 文件创建 echo Ingress。下面是完整的 YAML 配置,并拆解每个字段的含义:
# echo-ingress.yaml
apiVersion: networking.k8s.io/v1 # Ingress的API版本(1.19+稳定版,推荐使用)
kind: Ingress # 资源类型为Ingress
metadata:
name: echo # Ingress名称,需与任务一致
namespace: sound-repeater # 命名空间,需与Service所在命名空间一致
# 可选:添加注解(Annotation),如配置Ingress Controller的特殊规则
annotations:
# 若使用Nginx Ingress,可添加该注解确保路径匹配正确
nginx.ingress.kubernetes.io/use-regex: "false"
spec:
# 可选:若需HTTPS,可配置tls字段(本次任务为HTTP,暂不配置)
# tls:
# - hosts:
# - example.org
# secretName: example-tls-secret
rules: # 路由规则列表,可配置多个规则
- host: example.org # 匹配的域名,需与任务一致
http:
paths: # 该域名下的路径规则列表
- path: /echo # 匹配的路径,需与任务一致
pathType: Exact # 路径匹配类型,根据需求选择Exact或Prefix
backend: # 匹配后的后端Service
service:
name: echoserver-service # 目标Service名称
port:
number: 8080 # 目标Service的端口号
关键字段说明:
- apiVersion:必须使用networking.k8s.io/v1(K8s 1.19+),旧版本extensions/v1beta1已废弃;
- pathType:不可省略,需根据业务需求选择(本次任务用Exact更精准);
- annotations:可选但常用,用于配置 Ingress Controller 的特殊行为(如 Nginx 的路径重写、缓存策略等)。
创建命令:
kubectl apply -f echo-ingress.yaml
五、验证与排查:确保 curl 能返回 “Hello World ^_^”
创建 Ingress 后,需通过一系列命令验证配置是否生效,若出现问题可按步骤排查。
1. 第一步:检查 Ingress 资源状态
kubectl get ingress -n sound-repeater
正常输出应包含:
- NAME:echo(Ingress 名称);
- HOSTS:example.org(匹配的域名);
- ADDRESS:Ingress Controller 的外部 IP(若为空,说明 Ingress Controller 未部署或配置错误);
- PORTS:80(HTTP 端口);
- AGE:Ingress 创建时间。
若ADDRESS为空,需先检查 Ingress Controller 是否正常运行:
# 以Nginx Ingress为例,检查Pod状态
kubectl get pods -n ingress-nginx
# 若Pod未Running,查看日志排查问题
kubectl logs <ingress-controller-pod-name> -n ingress-nginx
2. 第二步:检查 Service 可用性
Ingress 依赖 Service,需先确保 echoserver-service 正常:
# 查看Service状态
kubectl get svc echoserver-service -n sound-repeater
# 输出应包含PORT(S):8080/TCP,且TYPE不为ClusterIP(若为ClusterIP,需确保Ingress能访问)
# 集群内测试Service是否返回“Hello World ^_^”
# 1. 在集群内创建临时Pod
kubectl run -it --rm test-pod --image=busybox:1.35 -n sound-repeater
# 2. 在临时Pod内curl Service
curl http://echoserver-service:8080/echo
# 若返回“Hello World ^_^”,说明Service正常;否则需检查Service关联的Pod是否正常
3. 第三步:curl 验证外部访问
完成上述检查后,执行任务要求的 curl 命令:
curl http://example.org/echo
若返回 “Hello World ^_^”,说明 Ingress 配置成功;若失败,按以下步骤排查:
- 排查 1:/etc/hosts或 DNS 是否正确解析example.org到 Ingress Controller 的外部 IP(执行ping example.org验证);
- 排查 2:Ingress Controller 的外部 IP 是否能被访问(执行telnet example.org 80,若无法连接,检查防火墙规则);
- 排查 3:查看 Ingress Controller 日志,分析请求转发情况(以 Nginx 为例):
kubectl logs <ingress-controller-pod-name> -n ingress-nginx | grep example.org
六、总结:完成任务的知识链
创建 echo Ingress 的任务看似简单,实则需要串联 “Ingress 原理→Ingress Controller 依赖→命名空间隔离→路由规则配置→域名解析→验证排查” 的完整知识链:
- 理解 Ingress 不是 “转发组件”,而是 “规则清单”,必须依赖 Ingress Controller;
- 确保 Ingress 和 Service 在同一命名空间(sound-repeater);
- 精准配置 Host(example.org)、Path(/echo)和后端 Service(echoserver-service:8080);
- 通过/etc/hosts或 DNS 将域名解析到 Ingress Controller 的外部 IP;
- 按 “Ingress 状态→Service 可用性→外部 curl” 的顺序验证,快速定位问题。
掌握这些知识后,不仅能完成本次任务,更能应对复杂场景(如多域名、HTTPS、路径重写)的 Ingress 配置,真正理解 K8s 外部流量管理的核心逻辑。
更多推荐


所有评论(0)