gpt4 book ai didi

nginx - ingress-nginx 错误连接被拒绝

转载 作者:行者123 更新时间:2023-12-02 11:36:21 24 4
gpt4 key购买 nike

我正在尝试从服务访问我的 ingress-nginx 服务,但它拒绝连接。这是我的入口

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

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
❯ 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

ingress-nginx 在命名空间 ingress-nginx 上运行。
所以它应该可以通过 http://ingress-nginx.ingress-nginx.svc.cluster.local 访问.但是当我访问它时,它显示 connection refused 10.101.124.218:80 .我可以从外部访问入口,即从 ingress知识产权。

我正在使用 minikube 并通过运行 minikube addons enable ingress 使用 ingress .是的,我正在通过 minikube tunnel 运行隧道

最佳答案

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

  • Minikube Ingress Addon 在 kube-system 中部署 Controller 命名空间。如果您尝试在新创建的命名空间中部署该服务,它将无法到达 kube-system 中的部署。命名空间。
  • 很容易混合这些概念,因为默认 nginx-ingress部署使用命名空间 ingress-nginx正如你所尝试的。
  • 我发现的另一个问题是您的服务没有分配给 Controller 部署的所有选择器。
  • 使部署工作的最简单方法是运行 kubectl expose在 nginx Controller 上:
  • kubectl expose deployment ingress-nginx-controller --target-port=80 --type=NodePort -n kube-system
  • 使用此命令创建 nginx-ingress-controller 服务,所有外部和内部通信都正常工作。


  • 转载:
  • 对于这个例子,我只使用了两个入口后端,以避免在我的解释中重复太多。
  • 使用 minikube 1.11.0
  • 已启用 ingressmetallb插件。
  • 部署了两个 hello 应用程序:v1v2 , 两个 Pod 都监听端口 8080并作为节点端口公开如下:
  • $ 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
  • 现在我将创建 nginx-ingress暴露 Controller 部署的服务,这样所有标签和设置都将被继承:
  • $ 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
  • 然后我部署了一个 alpine用于测试集群内部访问的 pod:
  • $ 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

    如您所见,所有请求均已完成。

    注:
  • 正如 所指出的@suren ,当 curl 入口时,我必须用 -H
  • 指定主机
  • 服务名称需要完全是 FQDN,因为我们正在处理托管在另一个命名空间中的服务,使用格式 <SVC_NAME>.<NAMESPACE>.svc.cluster.local .
  • 在您的 JS 应用程序中,您必须通过 Host参数以到达入口。

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

    关于nginx - ingress-nginx 错误连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62162209/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com