首页/云/Kubernetes 速查/IngressClass 与多控制器选择
网络与服务55 条

IngressClass 与多控制器选择

IngressClass 标识由哪个控制器处理 Ingress:集群可装多个控制器,用 spec.ingressClassName 指定;设默认类可省略该字段。

Kubernetes 速查云更新于 2026-10-13

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类对应的控制器标识必须与控制器实现的标识一致
默认类注解把该类标记为默认集群中建议只保留一个
对象状态是否分配地址与后端长期无地址说明没有被接管
多个类同时被标记为默认时,没有写明类名的对象由谁接管没有确定性,一旦出问题排查会非常困难。默认类应当集群唯一。
旧版本用注解声明控制器,新版本推荐使用类名字段。迁移期间两种声明并存可能出现取舍冲突,应当逐个确认后再清理旧注解。

易错点

  • 类名与控制器标识不匹配:对象创建成功却没有地址,看起来像入口组件整体故障
  • 新旧两种声明方式并存:控制器取舍行为不确定,同一个对象可能被忽略
  • 设置多个默认类:新对象归属不确定,故障时难以定位到具体控制器
  • 以为改了类名就完成迁移:目标控制器需支持对象上原有的注解规则,否则行为会变化

数据来源与参考

  • Kubernetes 官方文档 · IngressClass
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌