簡體   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