无法访问Kubernetes中的简单入口

4c8rllxm  于 2023-03-12  发布在  Kubernetes
关注(0)|答案(3)|浏览(135)

重要:使用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安装中(没有改变任何东西)
救命啊!

wfsdck30

wfsdck301#

入口资源似乎没有正确配置或没有被nginx-ingress-controller识别。以下是您可以采取的一些步骤来解决此问题:

验证nginx名称空间中的nginx入口控制器是否正在运行且运行状况良好:

kubectl get pods -n nginx

这应该显示nginx-ingress-controller的一个或多个pod正在运行。验证它们是否处于“Running”状态并且没有错误。

检查nginx-ingress-controller pod的日志,以查看是否存在任何错误或警告:

kubectl logs -n nginx <nginx-ingress-controller-pod-name>

查找与您的Ingress资源或服务相关的任何错误或警告。

验证入口资源是否被nginx-ingress-controller识别:

kubectl describe ingress -n app1 ingress1

查找“Events”部分,查看是否有任何与Ingress资源相关的警告或错误。

检查nginx-ingress-controller配置以确保其配置正确:

kubectl get configmap -n nginx nginx-ingress-controller

在配置文件中查找任何错误配置。

验证DNS记录是否指向正确的IP地址:

nslookup app1.alexthedeveloper.com.br

这将返回群集中某个工作节点的IP地址。请验证它是否与Route 53记录中的IP地址匹配。
如果这些步骤都无法解决问题,请尝试删除并重新创建入口资源,并验证nginx-ingress-controller是否正在获取该资源。您还可以尝试更改入口注解或使用其他入口控制器,以查看是否可以解决问题。

hgc7kmma

hgc7kmma2#

TL;DR

通过NodePort(在本例中为31111)联系您的nginx-ingressService,因为curl到端口为80的工作节点IP地址不起作用:

kubectl get svc -n nginx
NAME                  TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
nginx-nginx-ingress   LoadBalancer   10.111.12.216   <pending>     80:-->31111/TCP<--,443:32467/TCP   8m53s

解释:

当Kubernetes本身是托管解决方案(如GKEAKSEKS)和非托管解决方案(如您创建的解决方案)时,Kubernetes Services的处理方式不同。
假设您使用的是EKSnginx-ingress将从AWS负载均衡器接收一个地址,您可以联系它来访问您的hello-world应用程序。
你可以在这里看到:

kubectl get svc -n nginx
NAME                  TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
nginx-nginx-ingress   LoadBalancer   10.111.12.216   <pending>     80:31111/TCP,443:32467/TCP   8m53s
                                                      ^^^^^^
                                                       HERE!

您的设置是自我管理的,因此此命令的输出将类似于我上面包含的输出。访问您的应用程序可以通过以下方式实现:

  • ClusterIP类型的服务,名称为svc1,内部端口为:
  • 5678(从群集内部)
  • nginx-ingress控制器和端口的NodePort类型服务:
  • 31111(HTTP)(从群集外部)〈--将因您的设置而异!
  • 32467(HTTPS)(从群集外部)〈--对于您的设置将有所不同!

基本上,不会分配针对您的环境的负载平衡器的外部IP。
要完全按照端口80上的描述工作,您需要配置您的nginx-ingressDeployment以使用hostPort。您还需要考虑如果您有超过1个Node会发生什么,并且nginx-ingress控制器将被重新创建。
从最佳实践的Angular 来看,我建议不要这样做,而是坚持使用NodePort

  • *Kubernetes.io:文档:概念:配置:概述:服务 *

我相信你可以找到AWS解决方案,可以为你做端口转发。

lndjwyie

lndjwyie3#

我认为这是因为你的重写。你正在重写你的/app 1路径到/,而你在/上没有任何服务
在注解中注解掉那一行,重新应用并给予一次。
(抱歉格式不好,在移动的上发布)

相关问题