我正在尝试建立一个服务,并在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域上的域app.mydomain.com
指向入口外部地址。还有一个证书管理器服务正在运行,以便支持HTTPS。
然而,虽然基本上相同的设置在GKE上完全开箱即用,但EKS让我很难过。
据我所知,与谷歌的第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>
我应该放弃在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
你在nginxingress控制器的日志中看到错误了吗?+kubectl events
对调试都很有用。
我会在任何地方禁用TLS,让你的服务在http上运行,然后逐步在ingress控制器上启用TLS。
编辑:根据您的回复,
curl -H "Host: app.mydomain.com" http://<elb-address>:80
应该在入口后面呼叫您的服务。
app.mydomain.com是如何定义的?它是dns条目的CNAME吗?