首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >入口-nginx错误连接被拒绝

入口-nginx错误连接被拒绝
EN

Stack Overflow用户
提问于 2020-06-02 22:16:02
回答 1查看 6.3K关注 0票数 4

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

代码语言:javascript
复制
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: auth-srv
              servicePort: 3000
          - path: /api/tickets/?(.*)
            backend:
              serviceName: tickets-srv
              servicePort: 3000
          - path: /?(.*)
            backend:
              serviceName: client-srv
              servicePort: 3000
代码语言:javascript
复制
apiVersion: v1
kind: Namespace
metadata:
  name: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
---
kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  externalTrafficPolicy: Local
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: http
      port: 443
      protocol: TCP
      targetPort: https
代码语言:javascript
复制
❯ 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

入口-nginx运行在名称空间ingress上。因此,http://ingress-nginx.ingress-nginx.svc.cluster.local应该可以访问它。但是当我访问它的时候,上面写着connection refused 10.101.124.218:80。我可以从外部访问入口,即从ingress ip访问。

我正在使用迷你和使用入口通过运行minikube addons enable ingress。是的,我是通过minikube tunnel运营隧道的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-03 18:46:20

我测试了您的环境,发现了相同的行为,外部访问,但是内部连接被拒绝,这就是我解决的方法:

  • ,Minikube在kube-system命名空间中部署控制器。如果尝试在新创建的命名空间中部署服务,它将不会到达kube-system命名空间中的部署。很容易混淆这些概念,因为默认的trying.
  • Another部署使用名称空间ingress-nginx,正如我发现的那样,您的服务没有将所有选择器分配给控制器deployment.
  • The --最简单的方法是在nginx控制器上运行kubectl expose

代码语言:javascript
复制
kubectl expose deployment ingress-nginx-controller --target-port=80 --type=NodePort -n kube-system

  • 使用此命令创建nginx-ingress控制器服务,所有通信都正常工作,包括外部和内部的.

Reproduction:

在本例中,我只使用两个入口后端,以避免在我的explanation.

  • Using minikube 1.11.0

  • Enabled ingressmetallb addons.

  • Deployed两个hello应用程序中重复使用:v1v2,它们都监听端口8080,并作为节点端口公开如下:

代码语言:javascript
复制
$ 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

这里的

  • 是入口文件,就像您的文件一样,只更改后端服务名称和端口,以与我部署的名称和端口匹配:

代码语言:javascript
复制
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

  • 现在我将创建公开控制器部署的nginx-ingress服务,这样所有的标记和设置都将被继承:

代码语言:javascript
复制
$ kubectl expose deployment ingress-nginx-controller --target-port=80 --type=NodeP
ort -n kube-system
service/ingress-nginx-controller exposed

  • 现在我们部署入口对象:

代码语言:javascript
复制
$ 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

  • 从外部测试入口:

代码语言:javascript
复制
$ 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

然后,我部署了一个

  • 来测试集群内部的访问:

代码语言:javascript
复制
$ 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

正如你所看到的,所有的请求都得到了满足。

注:

<SVC_NAME>.<NAMESPACE>.svc.cluster.local.

  • In @suren所指出的,在进入时,我必须用-H

  • 指定主机--服务名称必须完全为FQDN,因为我们处理的是另一个名称空间中的服务,使用JS应用程序的格式,您必须传递Host参数才能到达入口。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62162209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档