【问题标题】:How to convert a prefix+domain name to a directory/prefix in EKS(kubernetes)如何在 EKS(kubernetes) 中将前缀+域名转换为目录/前缀
【发布时间】:2022-01-18 08:38:39
【问题描述】:

我有一个 Route53 和 EKS 环境。

我在 EKS ingress-controller 中写了几个域名,现在我需要使用 URL 访问每个目录。

如果您有一个域名“example.com”,并且它有一个前缀,您希望将前缀视为域名之后的目录。 (例如:main.example.com -> example.com/main) (例如:settings.example.com -> example.com/settings)

换句话说,如果您在浏览器的 URL 中输入“main.example.com”,它将访问正在路由的 pod example.com/main。

我在这个问题上花费了大量的工作时间。 你知道解决办法吗?

这是我的“ingress.yaml”的一部分。

enter code here
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: "ingress"
  namespace: "public"
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/listen-ports: 
      '[{"HTTP":80,"HTTPS": 443}]'
    alb.ingress.kubernetes.io/certificate-arn: ****secret****
nginx.ingress.kubernetes.io/server-snippet: |
  server {
    location / {
      server_name ~^(?<name>[\w-]+)\.example\.com$;
      proxy_pass http://example.com/$name;
      proxy_set_header Host $host;
    }
  }
labels:
  app: develop-app
spec:
 rules:
   - host: main.example.com
     http:
      paths:
       - path: /*
         backend:
           serviceName: "hook"
           servicePort: 8080
   - host: settings.example.com
     http:
      paths:
       - path: /*
         backend:
           serviceName: "hook"
           servicePort: 8080
   - host: example.com
     http:
      paths:
       - path: /*
         backend:
           serviceName: "hook"
           servicePort: 8080

【问题讨论】:

  • 例如,我试着给它起一个全名,像这样 server_name "main\.example\.com"; proxy_pass example/main;但是,我想知道为什么当我在 URL 中输入“main.example.com”时,它不会被视为“example.com/main”。

标签: kubernetes kubernetes-ingress amazon-eks


【解决方案1】:

根据您的反馈进行更新,您可能正在寻找的是使用 nginx 服务器块而不是 k8s 入口规则:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    ...
    nginx.ingress.kubernetes.io/server-snippet: |
      server {
        location / {
          server_name ~^(?<name>[\w-]+)\.example\.com$;
          proxy_pass http://<your k8s service>/$name;
          proxy_set_header Host $host;
        }
      }
spec:
  rules:
  - host: main.example.com
  - host: setting.example.com

【讨论】:

  • 感谢您的帮助。问题还没有完全解决,但多亏了你,我看到了一条通往终点的道路。当“example.com”设置为最低优先级时,连接仍然存在问题。但是,我认为这是因为“example.com”的目的地不同,而 EC2 是目的地。
  • 嗯,只有当我在 URL 中输入“example.com/main”时,它才会返回正确的响应。输入该 URL 后,如何连接到 example.com(示例 pod)下目录中的 /main?
  • Ingress 规则不这样做,您需要深入研究 nginx 服务器块。更新后的答案将为您提供想法
  • 感谢您的慷慨跟进。如您所说,我尝试了您建议的代码,但没有成功。是“nginx.ingress.kubernetes.io/server-sn-p”不能正常工作,还是因为与另一个注解冲突?我在问题中添加了一段代码。
  • 注意kubernetes.io/ingress.class: alb 不支持你想做的事情。您需要使用 ingress-nginx 才能使用 nginx.ingress.kubernetes.io/server-snippet
猜你喜欢
  • 2021-10-30
  • 2020-04-04
  • 2013-08-08
  • 2013-04-02
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多