一个入口服务多个站点
入口对象支持在一个对象里写多条规则,每条规则可以绑定不同的主机名并指向不同后端,从而用同一套入口组件承载多个站点。除了具体域名,还可以使用通配主机名匹配一类子域。这样做的收益是共享入口组件与证书,减少资源占用与运维面。
基本信息
| 所属接口组 | networking.k8s.io/v1 |
|---|---|
| 规则数量 | 单个对象可包含多条主机规则 |
| 通配范围 | 只覆盖一级子域 |
| 路径类型 | 前缀匹配或精确匹配 |
| 依赖条件 | 域名需解析到入口地址 |
典型使用场景
- 同一业务的多个域名指向不同后端服务
- 静态资源用通配域名统一指向资源服务
- 主站与接口服务分开部署,共用一套入口组件
- 测试环境用域名前缀区分不同分支
- 对外统一入口、内部分流的架构设计
多规则示例
多规则示例
spec:
ingressClassName: nginx
rules:
- host: www.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: site-www
port:
number: 80
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: site-api
port:
number: 8080
- host: "*.static.example.com" # 通配只覆盖一级子域
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: site-static
port:
number: 80验证
验证
kubectl describe ingress multi-site | grep -E 'Host|Path' # 规则是否被接受
curl -s -H 'Host: api.example.com' http://<入口IP>/health # 用 Host 头验证路由
curl -sk --resolve www.example.com:443:<入口IP> https://www.example.com/ # 按域名验证
kubectl get ingress multi-site -o jsonpath='{.status.loadBalancer}' # 入口地址规则字段读法
| 字段 | 含义 | 注意点 |
|---|---|---|
| 主机名 | 匹配请求中的域名 | 不写表示匹配任意域名 |
| 通配主机 | 匹配一级子域 | 多级子域不匹配 |
| 路径与类型 | 匹配的请求路径与方式 | 前缀与精确匹配语义不同 |
| 后端服务 | 流量最终发往的服务与端口 | 服务不存在时返回错误 |
没有写主机名的规则相当于兜底规则,会接收所有未匹配到具体域名的请求。这条规则的位置与存在与否,会直接影响默认行为。
多个站点共用一套入口组件时,容量与限流也一并共用。某个站点出现流量突增会挤占其他站点的连接资源,重要业务应评估是否拆分入口。
路由规则正确不代表能访问:域名必须先解析到入口地址。用请求头或解析参数模拟域名验证,可以快速区分是路由问题还是解析问题。