Kubernetes 使用同一主机的多个入口控制器

Kubernetes 使用同一主机的多个入口控制器,kubernetes,kubernetes-ingress,nginx-ingress,Kubernetes,Kubernetes Ingress,Nginx Ingress,我有两个入口控制器(用于公共/内部流量),我希望所有端点都使用公共入口,但/metrics除外,它应该是内部的,并且都使用相同的主机 例如 这就是我尝试过的: 内部入口 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-metrics-ingress annotations: kubernetes.io/ingress.class: ingress-internal spec: rules

我有两个入口控制器(用于公共/内部流量),我希望所有端点都使用公共入口,但/metrics除外,它应该是内部的,并且都使用相同的主机

例如

这就是我尝试过的:

内部入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-metrics-ingress
  annotations:
    kubernetes.io/ingress.class: ingress-internal
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /metrics
        backend:
          serviceName: example-servicename
          servicePort: 80
和公众进入

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path:
        backend:
          serviceName: example-servicename
          servicePort: 80
当我访问example.com/metrics时,内部入口当前被忽略(它使用公共入口)

如果我将内部入口更改为使用与公共入口相同的入口控制器,并将服务端口更改为81(例如),这将提供一个错误(这是预期的),这表明正在使用两个不同的入口。然而,只要我使用两个不同的入口控制器,那么一个入口的规则就不会被接受


如何配置ingress以获得所需的结果?

当运行多个ingress nginx控制器时,如果其中一个控制器使用默认的
--ingress class
值(请参见
内部/ingress/annotations/class/main.go
中的
IsValid
方法),它将只处理未设置的类注释,否则,将需要类注释

如果
--入口类
设置为
nginx
的默认值,则控制器将监控无类别注释的入口和注释类设置为
nginx
的入口。为
--入口等级
使用非默认值,以确保控制器仅满足特定的入口等级

在您的情况下,使用注释
kubernetes.io/ingres.class:“外部|内部”
和标志
--ingres class=EXTERNAL |内部
的组合可以过滤nginx入口控制器应选择的入口规则

看一看:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path:
        backend:
          serviceName: example-servicename
          servicePort: 80