一:Ingress资源清单文件解读
| 属性名称 | 取值类型 | 取值说明 |
|---|---|---|
| apiVersion | string | Api 版本。通常为 networking.k8s.io/v1 |
| kind | string | 资源类型。通常为 Ingress |
| metadata | Object | 元数据 |
| metadata.name | String | 控制器的名称 |
| metadata.namespace | String | 控制器所属的命名空间,默认值为 default |
| metadata.labels[] | List | 自定义标签列表 |
| metadata.annotation[] | List | 自定义注解列表 |
| spec | Object | 规范 Ingress 所需行为的规范 |
| 属性名称 | 取值类型 | 取值说明 |
|---|---|---|
| spec.defaultBackend | Object | defaultBackend 是 Ingress 规范中的一个参数,用于指定没有匹配到任何规则的请求该发送到哪个后端服务。该参数是可选的,如果没有设置,则请求会被丢弃,或者返回一个指定的 HTTP 响应代码,例如 404。这个后端服务可以是一个已经存在的 Service 或 Deployment,也可以是自定义的资源对象。只能指定一个。 |
| spec.defaultBackend.resource | Object | 指定后端服务为 Deployment 等,也可以是自定义的资源对象。 |
| 属性名称 | 取值类型 | 取值说明 |
|---|---|---|
| spec.defaultBackend.resource.apiGroup | string | 指定对应资源的 apiGroup |
| spec.defaultBackend.resource.kind | string | 指定资源的类型 |
| spec.defaultBackend.resource.name | string | 指定对应资源的名称 |
| spec.defaultBackend.service | Object | 指定后端服务为 Service |
| spec.defaultBackend.service.name | string | 指定后端服务 Service 的名称 |
| spec.defaultBackend.service.port | Object | 指定后端服务 Service 的端口 |
| 属性名称 | 取值类型 | 取值说明 |
|---|---|---|
| spec.ingressClassName | string | 在 Kubernetes Ingress 规范中,ingressClassName 参数是一个可选项,用于指定 Ingress 控制器应该使用哪个类别或类型来处理该规范。该参数与 Kubernetes 平台定义的 Ingress 类型分离,它允许多个 Ingress 控制器在同一个集群中共存并彼此独立地处理网络流量。例如:使用 Nginx Ingress Controller 时,可指定该值为 nginx。 |
| 属性名称 | 取值类型 | 取值说明 |
|---|---|---|
| spec.rules | []Object | spec.rules 参数是一个列表,用于定义请求的入口规则。每个规则对应一个 Ingress 请求的入口点,定义了该规则的转发行为。根据规则定义的主机名和 URL 路径,将请求转发到相应的后端服务或工作负载。 |
| spec.rules.host | string | spec.rules.host 参数指定了一个主机名,该规范将应用于该主机名匹配的所有 Ingress 请求。具体而言,当该参数与请求中的主机名匹配(通常是客户端请求的主机名或 DNS 名称)时,请求将被转发到该规范所定义的后端服务或工作负载中。 |
| spec.rules.http | Object | http 参数定义了使用 HTTP 协议的入口规则。每个 http 对象定义一个或多个 URL 路径,以及将路径请求转发到的后端服务或工作负载。同时,可以在 http 对象中配置多个端口和主机名。 |
| spec.rules.http.paths | []Object | spec.rules.http.paths 参数定义了 URL 路径,并指定了这些路径应该如何转发到相应的后端服务或工作负载。 |
| 属性名称 | 取值类型 | 取值说明 |
|---|---|---|
| spec.rules.http.paths.backend | Object | 在 Kubernetes Ingress 规范中,backend 参数用于定义将 Ingress 请求转发到的后端服务或工作负载。这个后端服务可以是一个已经存在的 Service 或 Deployment,也可以是自定义的资源对象。只能指定一个。 |
| spec.rules.http.paths.backend.resource | Object | 指定后端服务为 Deployment 等,也可以是自定义的资源对象。 |
| spec.rules.http.paths.backend.service | Object | 指定后端服务为 Service。 |
| spec.rules.http.paths.path | string | 在 Kubernetes Ingress 规范中,path 参数定义了 URL 路径,用于匹配客户端请求的路径,并将符合条件的请求转发到对应的后端服务。 |
| 属性名称 | 取值类型 | 取值说明 |
|---|---|---|
| spec.tls | []Object | tls 参数用于配置 Ingress 中用于 TLS 通信的证书和私钥。 |
| spec.tls.hosts | []string | 一个字符串数组,列出将使用此证书的主机名。必填项。 |
| spec.tls.secretName | string | 包含 TLS 密钥的 Kubernetes Secret 的名称。Secret 必须包括 tls.crt 和 tls.key 字段。必须与证书匹配的 TLS 证书密钥。必填项。 |
二:Ingress PathType匹配类型
ingress.spec.rules.http.paths.pathType 是 Ingress 资源中非常重要的路径匹配类型概念,每个路径都必须明确设置该类型,否则无法通过合法性检查。当前支持三种路径类型:
-
Prefix(前缀匹配) 当请求路径以
Path定义的值开头时,就会匹配。例:Path: /example→/example/foo、/example/bar都会匹配。 -
Exact(完全匹配) 只有当请求路径与
Path定义的值完全一致 时,才会匹配。例:Path: /example→ 只有/example会匹配。 -
ImplementationSpecific(实现特定匹配) 匹配逻辑由具体的
IngressClass决定,不同 Ingress 控制器(如 Nginx、Traefik)可能有不同实现;可以作为独立类型处理,也可与Prefix或Exact逻辑保持一致。
这个第三个用的很少,基本上不用,特别负载,还没有啥收益。

三:Ingress的策略配置技巧
为了实现灵活的负载分发策略,Ingress可以按照多种方式进行配置,下面面对常见的Ingress转发策略进行说明
1:转发到单个后端服务
基于这种设置,客户端到 Ingress Controller 的访问请求都将被转发到后端的唯一 Service 上,在这种情况下 Ingress 无须定义任何 rule。
通过如下所示的设置,对 Ingress Controller 的访问请求都将被转发到 tomcat:8080 这个服务上。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-myapp
namespace: default
spec:
ingressClassName: nginx
rules:
- host: tomcat.zyf.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tomcat
port:
number: 8080
2:同一域名下,不同的URL路径被转发到不同的服务上
这种配置常用于一个网站通过不同的路径提供不同服务的场景,例如 /web 表示访问 Web 页面,/api 表示访问 API 接口,对应到后端的两个服务,通过 Ingress 的设置很容易就能将基于 URL 路径的转发规则定义出来。
通过如下所示的设置,对 tomcat.zyf.com/web 的访问请求将被转发到 web-service:80 服务上;对 tomcat.zyf.com/api 的访问请求将被转发到 api-service:80 服务上。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-myapp
namespace: default
spec:
ingressClassName: nginx
rules:
- host: tomcat.zyf.com
http:
paths:
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8081
3:不同的域名(虚拟主机名)被转发到不同的服务上
这种配置常用于一个网站通过不同的域名或虚拟主机名提供不同服务的场景,例如 nginx.web1.com 域名由 service1 提供服务,nginx.web2.com 域名由 service2 提供服务。
通过如下所示的设置,对 "nginx.web1.com" 的访问请求将被转发到 "service1:80" 服务上,对 "nginx.web2.com" 的访问请求将被转发到
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-myapp
namespace: default
spec:
ingressClassName: nginx
rules:
- host: nginx.web1.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- host: nginx.web2.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service2
port:
number: 80
4:主机通配符
主机名可以是精确匹配(例如 "foo.bar.com")或者使用通配符来匹配(例如 "*.foo.com")。精确匹配要求 HTTP host 头部字段与 host 字段值完全匹配。通配符匹配则要求 HTTP host 头部字段与通配符规则中的后缀部分相同。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-myapp
namespace: default
spec:
ingressClassName: nginx # 指定使用的 IngressClass
rules:
# 规则1:精确匹配域名
- host: "nginx.web1.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80 # 后端Service端口
# 规则2:通配符匹配域名(匹配所有 *.web2.com)
- host: "*.web2.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service2
port:
number: 80 # 后端Service端口