【问题标题】:Kubernetes - multiple configuration in one IngressKubernetes - 一个入口中的多个配置
【发布时间】:2020-10-26 17:10:40
【问题描述】:

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

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

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

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"

另一个会有这个

    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 请求。

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

【问题讨论】:

  • 你可以拥有多个Ingress-resources,但只能使用一个Ingress-controller。
  • 在那种情况下,如果我想要两条不同配置的规则该怎么办?
  • “规则”是什么意思?请更清楚您想要做什么。
  • 我希望多个域访问我的 Kubernetes 集群。对于每个域,我想要不同的注释/配置。
  • 我编辑了我的帖子,以便更清楚地了解我想要做什么。

标签: nginx kubernetes kubernetes-ingress


【解决方案1】:

我也明白不可能有 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: /(.*)

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

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

【讨论】:

  • 谢谢,我显然需要更加努力地理解 Kubernetes 的 Ingress 部分。
猜你喜欢
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
相关资源
最近更新 更多