入口nginx错误连接被拒绝

入口nginx错误连接被拒绝,nginx,kubernetes,kubernetes-ingress,minikube,Nginx,Kubernetes,Kubernetes Ingress,Minikube,我试图从一个服务访问我的ingress nginx服务,但它拒绝连接。这是我的入口 apiVersion:networking.k8s.io/v1beta1 种类:入口 元数据: 名称:入口服务 注释: kubernetes.io/ingres.class:nginx nginx.ingres.kubernetes.io/use-regex:“true” 规格: 规则: -主持人:ticketing.dev http: 路径: -路径:/api/users/?(*) 后端: 服务名称:auth

我试图从一个服务访问我的ingress nginx服务,但它拒绝连接。这是我的入口

apiVersion:networking.k8s.io/v1beta1 种类:入口 元数据: 名称:入口服务 注释: kubernetes.io/ingres.class:nginx nginx.ingres.kubernetes.io/use-regex:“true” 规格: 规则: -主持人:ticketing.dev http: 路径: -路径:/api/users/?(*) 后端: 服务名称:auth srv 服务端口:3000 -路径:/api/tickets/?(*) 后端: 服务名称:票srv 服务端口:3000 -路径:/?(*) 后端: 服务名称:客户端srv 服务端口:3000 apiVersion:v1 种类:名称空间 元数据: 名称:ingress nginx 标签: app.kubernetes.io/name:ingress nginx app.kubernetes.io/part-of:ingress nginx --- 种类:服务 版本:v1 元数据: 名称:ingress nginx 名称空间:ingress nginx 标签: app.kubernetes.io/name:ingress nginx app.kubernetes.io/part-of:ingress nginx 规格: 外部流量策略:本地 类型:负载平衡器 选择器: app.kubernetes.io/name:ingress nginx app.kubernetes.io/part-of:ingress nginx 端口: -名称:http 港口:80 协议:TCP targetPort:http -名称:http 港口:443 协议:TCP 目标端口:https ingress nginx正在命名空间ingress nginx上运行。 因此,应该可以通过
http://ingress-nginx.ingress-nginx.svc.cluster.local
。但当我访问它时,它显示
连接被拒绝10.101.124.218:80
。我能够从外部访问入口,即从
入口
ip


我正在使用minikube并通过运行
minikube插件启用入口来使用入口。是的,我正在通过minikube tunnel运行隧道,我测试了您的环境,发现了相同的行为,外部访问但内部连接被拒绝,我就是这样解决的:

  • Minikube Ingress插件在
    kube系统
    命名空间中部署控制器。如果您尝试在新创建的命名空间中部署服务,它将不会到达
    kube system
    命名空间中的部署
  • 很容易混合这些概念,因为默认的
    nginx-ingres
    部署在您尝试时使用了名称空间
    ingres-nginx
  • 我发现的另一个问题是,您的服务没有为控制器部署分配所有选择器

  • 部署工作的最简单方法是在nginx控制器上运行
    kubectl expose

  • 使用此命令创建nginx入口控制器服务,所有外部和内部通信都正常工作

复制:

  • 对于这个例子,我只使用了两个入口后端,以避免在我的解释中重复太多
  • 使用minikube 1.11.0
  • 已启用
    ingres
    metallb
    插件
  • 部署了两个hello应用程序:
    v1
    v2
    ,两个POD都侦听端口
    8080
    ,并作为节点端口公开,如下所示:
  • 现在,我将创建公开控制器部署的
    nginx入口
    服务,这样所有标记和设置都将被继承:
  • 现在我们部署入口对象:
  • 然后我部署了一个
    alpine
    pod来测试集群内部的访问:
如您所见,所有请求都已满足


注意:

  • 正如@suren所指出的,在卷曲入口时,我必须用-H指定主机

  • 服务名称需要完全为FQDN,因为我们正在处理托管在另一个命名空间中的服务,使用的格式为
    .svc.cluster.local

  • 在JS应用程序中,您必须传递
    Host
    参数才能到达入口


如果您有任何问题,请在评论中告诉我。

您可以编写访问服务所执行的确切命令吗?kubectl apply-f ingres-svc.yamlI是指,例如,针对端点运行的curl命令。你可以做
curlhttp://ingress-nginx.ingress-nginx.svc.cluster.local
?您如何尝试访问该服务?是的,我运行了
wgethttp://ingress-nginx.ingress-nginx.svc.cluster.local
运行服务的吊舱内
kubectl exec-it sh
,但仍然拒绝连接当您这样做时,主机是
cluster.local
,您需要传递一个指定ticketing.dev的头。尝试
curl-H“主机:ticketing.dev”ingress nginx.ingress nginx
。应该访问
客户端srv
服务。我是否只运行
kubectl expose deployment ingress nginx controller--目标端口=80--类型=LoadBalancer-n kube system
?是的,我相信如果您不想将服务暴露在外部,甚至可以将其设置为ClusterIP。@willrof,我不明白您做了什么。我尽可能多地跟踪,我得到的只是确认我一直得到502坏网关,而不是如何解决它。我拥有与OP完全相同的ingress nginx yaml文件,我可以成功跟踪-n1/etc/hosts,但如果没有与Postman中相同的502网关,我就无法卷曲。到底是什么问题?为什么我的路线是糟糕的网关,而这正是我在我的快速路线处理程序中所拥有的?@Daniel你还在寻找解决方案吗?@AmitParameshwar,我不是,但如果你觉得你有一个很好的解决方案,请随意发布。
❯ kubectl get services -n ingress-nginx
NAME            TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                      AGE
ingress-nginx   LoadBalancer   10.101.124.218   10.101.124.218   80:30634/TCP,443:30179/TCP   15m
kubectl expose deployment ingress-nginx-controller --target-port=80 --type=NodePort -n kube-system
$ kubectl get services
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
hello1-svc   NodePort    10.110.211.119   <none>        8080:31243/TCP   95m
hello2-svc   NodePort    10.96.9.66       <none>        8080:31316/TCP   93m
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
    - host: ticketing.dev
      http:
        paths:
          - path: /api/users/?(.*)
            backend:
              serviceName: hello1-svc
              servicePort: 8080
          - path: /?(.*)
            backend:
              serviceName: hello2-svc
              servicePort: 8080
$ kubectl expose deployment ingress-nginx-controller --target-port=80 --type=NodeP
ort -n kube-system
service/ingress-nginx-controller exposed
$ kubectl apply -f ingress.yaml 
ingress.networking.k8s.io/ingress-service created

$ kubectl get ingress
NAME              CLASS    HOSTS           ADDRESS      PORTS   AGE
ingress-service   <none>   ticketing.dev   172.17.0.4   80      56s

$ minikube ip
172.17.0.4
$ tail -n 1 /etc/hosts
172.17.0.4 ticketing.dev

$ curl http://ticketing.dev/?foo
Hello, world!
Version: 2.0.0
Hostname: hello2-67bbbf98bb-s78c4

$ curl http://ticketing.dev/api/users/?foo
Hello, world!
Version: 1.0.0
Hostname: hello-576585fb5f-67ph5
$ kubectl run --generator=run-pod/v1 -it alpine --image=alpine -- /bin/sh
/ # nslookup ingress-nginx-controller.kube-system.svc.cluster.local
Server:         10.96.0.10
Address:        10.96.0.10:53

Name:   ingress-nginx-controller.kube-system.svc.cluster.local
Address: 10.98.167.112

/ # apk update
/ # apk add curl

/ # curl -H "Host: ticketing.dev" ingress-nginx-controller.kube-system.svc.cluster.local/?foo
Hello, world!
Version: 2.0.0
Hostname: hello2-67bbbf98bb-s78c4

/ # curl -H "Host: ticketing.dev" ingress-nginx-controller.kube-system.svc.cluster.local/api/users/?foo
Hello, world!
Version: 1.0.0
Hostname: hello-576585fb5f-67ph5