重要:我不使用EKS。我已通过shell脚本安装了此群集。请认为它是完全正常的。
我有一个完全在EC2示例上运行的集群,并且不能访问非常简单的入口。
我已经做了以下工作:
1.通过helm-chart安装nginx入口控制器
$ helm repo add nginx-stable https://helm.nginx.com/stable
$ helm repo update
$ helm install nginx nginx-stable/nginx-ingress --create-namespace --namespace "nginx"
1.在app 1名称空间中创建了我的部署、服务和入口
部署时间:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy1
namespace: app1
spec:
replicas: 1
selector:
matchLabels:
app: hello1
template:
metadata:
labels:
app: hello1
spec:
containers:
- image: hashicorp/http-echo
name: hello1
args:
- "-text=\"Hello from application 1!\""
服务:
apiVersion: v1
kind: Service
metadata:
name: svc1
namespace: app1
spec:
selector:
app: hello1
ports:
- protocol: 'TCP'
port: 5678
targetPort: 5678
type: ClusterIP
入口:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
namespace: app1
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: app1.alexthedeveloper.com.br
http:
paths:
- pathType: Prefix
path: "/app1"
backend:
service:
name: svc1
port:
number: 5678
1.已将我的DNS记录app1.alexthedeveloper.com.br指向路由53中的工作节点IP
1.尝试访问app1.alexthedeveloper.com.br/app1时,我收到以下错误:
由于服务的类型是ClusterIP,我可以从主节点内部正常地 curl 它。而且我确信端口80在我的安全组中是打开的,集群是在Amazon Linux 2 vanilla安装中(没有改变任何东西)
救命啊!
3条答案
按热度按时间wfsdck301#
入口资源似乎没有正确配置或没有被nginx-ingress-controller识别。以下是您可以采取的一些步骤来解决此问题:
验证nginx名称空间中的nginx入口控制器是否正在运行且运行状况良好:
这应该显示nginx-ingress-controller的一个或多个pod正在运行。验证它们是否处于“Running”状态并且没有错误。
检查nginx-ingress-controller pod的日志,以查看是否存在任何错误或警告:
查找与您的Ingress资源或服务相关的任何错误或警告。
验证入口资源是否被nginx-ingress-controller识别:
查找“Events”部分,查看是否有任何与Ingress资源相关的警告或错误。
检查nginx-ingress-controller配置以确保其配置正确:
在配置文件中查找任何错误配置。
验证DNS记录是否指向正确的IP地址:
这将返回群集中某个工作节点的IP地址。请验证它是否与Route 53记录中的IP地址匹配。
如果这些步骤都无法解决问题,请尝试删除并重新创建入口资源,并验证nginx-ingress-controller是否正在获取该资源。您还可以尝试更改入口注解或使用其他入口控制器,以查看是否可以解决问题。
hgc7kmma2#
TL;DR
通过
NodePort
(在本例中为31111
)联系您的nginx-ingress
Service
,因为curl
到端口为80
的工作节点IP地址不起作用:解释:
当Kubernetes本身是托管解决方案(如
GKE
、AKS
、EKS
)和非托管解决方案(如您创建的解决方案)时,Kubernetes Services的处理方式不同。假设您使用的是
EKS
,nginx-ingress
将从AWS
负载均衡器接收一个地址,您可以联系它来访问您的hello-world
应用程序。你可以在这里看到:
您的设置是自我管理的,因此此命令的输出将类似于我上面包含的输出。访问您的应用程序可以通过以下方式实现:
ClusterIP
类型的服务,名称为svc1
,内部端口为:5678
(从群集内部)nginx-ingress
控制器和端口的NodePort
类型服务:31111
(HTTP)(从群集外部)〈--将因您的设置而异!32467
(HTTPS)(从群集外部)〈--对于您的设置将有所不同!基本上,不会分配针对您的环境的负载平衡器的外部IP。
要完全按照端口
80
上的描述工作,您需要配置您的nginx-ingress
Deployment
以使用hostPort
。您还需要考虑如果您有超过1个Node
会发生什么,并且nginx-ingress
控制器将被重新创建。从最佳实践的Angular 来看,我建议不要这样做,而是坚持使用
NodePort
:我相信你可以找到
AWS
解决方案,可以为你做端口转发。lndjwyie3#
我认为这是因为你的重写。你正在重写你的/app 1路径到/,而你在/上没有任何服务
在注解中注解掉那一行,重新应用并给予一次。
(抱歉格式不好,在移动的上发布)