Kubernetes - 一个 Ingress 中的多个配置

Kubernetes - multiple configuration in one Ingress

我在同一个 Kubernetes 集群中有不同的应用程序 运行。

我希望多个域访问我的 Kubernetes 集群并根据域进行重定向。 对于每个域,我想要不同的 annotations/configuration.

没有注释,我有一个入口部署,例如:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: frontdoor
  namespace: myapps
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  type: LoadBalancer
  tls:
    - hosts:
        - foo.bar.dev
        - bar.foo.dev
      secretName: tls-secret
  rules:
    - host: foo.bar.dev
      http:
        paths:
          - backend:
              serviceName: foobar
              servicePort: 9000
            path: /(.*)
    - host: bar.foo.dev
      http:
        paths:
          - backend:
              serviceName: varfoo
              servicePort: 80
            path: /(.*)

但是他们需要有多个配置,比如一个需要有如下注解

    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "PHPSESSID"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"

另一个会有这个

    nginx.ingress.kubernetes.io/backend-protocol: "FCGI"
    nginx.ingress.kubernetes.io/fastcgi-index: "index.php"
    nginx.ingress.kubernetes.io/fastcgi-params-configmap: "example-cm"

这些配置不兼容,我找不到通过主机指定配置的方法。

我也明白不可能有 2 个 Ingress 服务于外部 HTTP 请求。

那么我不理解/做错了什么?

I also understand that it's impossible to have 2 Ingress serving External HTTP request

我不确定你在哪里找到这个,但你完全可以做到。

您应该能够创建两个单独的入口对象,如下所示:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: frontdoor-bar
  namespace: myapps
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod

    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "PHPSESSID"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"

spec:
  type: LoadBalancer
  tls:
    - hosts:
        - bar.foo.dev
      secretName: tls-secret-bar
  rules:
    - host: bar.foo.dev
      http:
        paths:
          - backend:
              serviceName: barfoo
              servicePort: 80
            path: /(.*)

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: frontdoor-foo
  namespace: myapps
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod

    nginx.ingress.kubernetes.io/backend-protocol: "FCGI"
    nginx.ingress.kubernetes.io/fastcgi-index: "index.php"
    nginx.ingress.kubernetes.io/fastcgi-params-configmap: "example-cm"

spec:
  type: LoadBalancer
  tls:
    - hosts:
        - foo.bar.dev
      secretName: tls-secret-foo
  rules:
    - host: foo.bar.dev
      http:
        paths:
          - backend:
              serviceName: foobar
              servicePort: 9000
            path: /(.*)

这是一个完全有效的入口配置,很可能是唯一可以解决您问题的有效配置。

每个入口对象配置一个域。