【问题标题】:Exposing a service on EKS using NGINX ingress and issues with load balancer使用 NGINX 入口在 EKS 上公开服务和负载均衡器问题
【发布时间】:2021-01-28 12:50:18
【问题描述】:

我正在尝试设置服务并将其在 EKS 上对外公开。我已经很容易在 GKE 上完成了,但现在 AWS 让我很难过。

我的 NGINX yaml 看起来像这样:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"

spec:
  tls:
  - hosts:
    - app.mydomain.com
    secretName: myapp-tls
  rules:
  - host: app.mydomain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: myapp-service
          servicePort: 80

然后我在 Google Domains 上的域 app.mydomain.com 指向入口外部地址。为了支持 HTTPS,还运行了一个 cert-manager 服务。

但是,虽然基本相同的设置在 GKE 上完全开箱即用,但 EKS 让我很难过。

据我了解,与 Google 的第 7 层相比,EKS 默认 LoadBalancer 是第 4 层(这说明 HTTPS 不起作用),但也存在域重定向问题,因为它只是解析为入口地址而不是我想要的地址,因此我的应用程序没有出现。

该域是通过 Google Domains 注册的,我正在创建指向我在 EKS 上的入口外部地址的合成记录(用于我的子域)。相同的方案在 GKE 上运行良好,但在这里它将地址解析为入口地址而不是我的域,这导致入口端出现 404。

我想知道是否有人可以指点我如何正确设置它?我应该放弃 EKS 上的 nginx 入口并转向 ALB 吗?以及如何正确关联域?

非常感谢您!


编辑:

kubectl describe ingress myapp-ingress的输出:

Name:             myapp-ingress
Namespace:        default
Address:          ********************************-****************.elb.eu-west-1.amazonaws.com
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
TLS:
  myapp-tls terminates app.mydomain.com
Rules:
  Host                          Path  Backends
  ----                          ----  --------
  app.mydomain.com  
                                /   myapp-service:80 (172.31.2.238:8000)
Annotations:                    cert-manager.io/cluster-issuer: myapp-letsencrypt-prod
                                kubernetes.io/ingress.class: nginx
Events:                         <none>

【问题讨论】:

    标签: amazon-web-services nginx kubernetes kubernetes-ingress amazon-eks


    【解决方案1】:

    我是否应该放弃 EKS 上的 nginx 入口并转向 ALB

    没有。 NGinX 入口控制器在 EKS 上运行良好。可以将它们配置为第 4 层或第 7 层;我们在第 7 层模式下使用它。

    你能用输出更新你的问题

    kubectl get ingress myapp-ingress
    

    我认为您的入口路径也不正确。除非我弄错了,那只是路由应用程序的根目录,而不是所有 uris。我们使用方案

    spec:
      rules:
        - host: service.d.tld
          http:
          paths:
            - path: /?(.*)  # <--- 
              backend:
                serviceName: my-service
                servicePort: http
    

    您是否在 nginx 入口控制器的日志中看到错误? +kubectl events 都可用于调试目的。

    我会在所有地方禁用 TLS 并让您的服务在 http 上运行,然后逐步在入口控制器上启用 TLS。

    编辑:根据您上面的回复,

    curl -H "Host: app.mydomain.com" http://<elb-address>:80 
    

    应该在入口后面调用你的服务。

    app.mydomain.com 是如何定义的?它是 dns 条目的 CNAME 吗?

    【讨论】:

    • 感谢您的回复!我用describe 的输出而不是get 更新了我的原始帖子,因为我觉得它会更详细。关于 //?(.*) - 我的 yaml 基本上是我从 GKE 复制粘贴的 yaml,一切都运行良好,所以除非 GKE 和 EKS 之间存在差异,否则我相信它应该可以工作
    • 响应您的编辑(还将更新原始内容):该域是通过 Google Domains 注册的,并且我正在创建指向我在 EKS 上的入口外部地址的合成记录。相同的方案在 GKE 上运行良好,但在这里它将地址解析为入口地址而不是我的域,这导致入口端出现 404。
    • 使用 curl 我收到一个 308 状态代码,即使使用 -L 标志,curl 也无法遵循
    • 我想知道这是否是因为app.mydomain.com 部分。尝试使用不同的主机名定义您的入口,例如 app2.mydomain.com 并再次使用 curl 进行测试。问题可能与 dns 解析有关?
    • 我已经尝试过不同的域名:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2013-08-08
    • 2023-02-15
    • 2020-06-28
    • 1970-01-01
    • 2017-12-22
    • 2018-12-27
    相关资源
    最近更新 更多