Kubernetes-在一个Ingress中进行多种配置

问题描述

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

我希望多个域访问我的Kubernetes集群并根据该域进行重定向。 对于每个域,我想要不同的注释/配置。

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

datePicker.minuteInterval = 30

但是它们需要具有多种配置,例如,一个需要具有以下注释

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: /$1
    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"

这些配置不兼容,我找不到一种方法来按主机指定配置。

我也了解不可能有2个Ingress服务外部HTTP请求。

那我不明白/做错了什么吗?

解决方法

我也了解不可能有2个Ingress服务外部HTTP请求

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

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

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: /$1
    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: /(.*)

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

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