繁体   English   中英

使用 NGINX 入口公开 EKS 上的服务和负载均衡器问题

[英]Exposing a service on EKS using NGINX ingress and issues with load balancer

我正在尝试设置一项服务并在 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我的域app.mydomain.com指向入口外部地址。 还有一个 cert-manager 服务正在运行以支持 HTTPS。

然而,虽然基本上相同的设置在 GKE 上完全开箱即用,但 EKS 给我带来了困难。

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

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

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

非常感谢您提前!


编辑:

kubectl describe ingress myapp-ingress输出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>

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

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

你能用输出更新你的问题吗

kubectl get ingress myapp-ingress

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM