IngressClass 解决什么
一个集群可以并存多个入口控制器,各自处理不同来源的流量。IngressClass 就是在控制器与入口对象之间建立对应关系的资源:入口对象通过类名字段声明由谁来处理,被标记为默认类的控制器接收那些没有写明类名的对象。这样公网入口与内网入口可以共存而不互相干扰。
基本信息
| 所属接口组 | networking.k8s.io/v1 |
|---|---|
| 关键字段 | spec.ingressClassName 与 spec.controller |
| 默认类标记 | 注解 ingressclass.kubernetes.io/is-default-class |
| 版本情况 | 1.18 引入,1.19 起稳定 |
| 失效表现 | 类名与控制器标识不匹配时对象不被处理 |
典型使用场景
- 集群同时部署公网入口与内网入口,按服务面向对象分流
- 从旧的注解声明方式迁移到类名字段方式,需要确认两者不冲突
- 新装的控制器不生效,核对类名与控制器标识是否对应
- 多团队共用集群时,为不同业务划分独立入口控制器
- 排查入口对象长期没有地址:先确认它被哪个控制器接管
查看与指定
查看与指定
kubectl get ingressclass # 集群里有哪些类
kubectl get ingressclass nginx -o yaml # 查看控制器标识
kubectl get ingress web-ing -o jsonpath='{.spec.ingressClassName}' # 对象声明的类名
kubectl annotate ingressclass nginx ingressclass.kubernetes.io/is-default-class=true # 标记默认类双控制器分流示例
双控制器分流示例
spec:
ingressClassName: nginx-internal # 交给内网入口控制器
rules:
- host: internal.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80字段与状态读法
| 字段或状态 | 含义 | 注意点 |
|---|---|---|
| spec.ingressClassName | 声明由哪个类处理 | 留空且存在默认类时走默认类 |
| spec.controller | 类对应的控制器标识 | 必须与控制器实现的标识一致 |
| 默认类注解 | 把该类标记为默认 | 集群中建议只保留一个 |
| 对象状态 | 是否分配地址与后端 | 长期无地址说明没有被接管 |
多个类同时被标记为默认时,没有写明类名的对象由谁接管没有确定性,一旦出问题排查会非常困难。默认类应当集群唯一。
旧版本用注解声明控制器,新版本推荐使用类名字段。迁移期间两种声明并存可能出现取舍冲突,应当逐个确认后再清理旧注解。