Kubernetes nginx 入口在集群内部工作但在外部不可见

如何解决Kubernetes nginx 入口在集群内部工作但在外部不可见

我设置了一个简单的 kubernetes yaml 文件(如下)来测试 nginx 入口。 Nginx 在集群内按预期工作,但在集群外不可见。

我正在使用 minikubeminikube tunnel 运行 minikube addons enable ingress。当我 kubectl exec 进入 nginx-controller 时,我可以看到 nginx 正在工作并提供测试页面,但是当我尝试从外部点击它时,我得到 Failed to connect to 127.0.0.1 port 80: Connection refused

将以下 yaml 保存为 stackoverflow.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: cheese-app
  labels:
    app: cheese-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cheese-app
  template:
    metadata:
      labels:
        app: cheese-app
    spec:
      containers:
      - name: cheese-container
        image: errm/cheese:stilton
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: cheese-svc
spec:
  selector:
    app: cheese-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: cheese-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: cheese-svc
          servicePort: 80

然后初始化 minikube

minikube start
minikube addons enable ingress
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-system ingress-nginx/ingress-nginx
kubectl wait --for=condition=ready pod --all --timeout=120s
kubectl get pods

在另一个终端窗口中启动 minikube 隧道

minikube tunnel

并应用 yaml 文件

kubectl apply -f ./stackoverflow.yaml
kubectl wait --for=condition=ready pod --all --timeout=120s
kubectl get pods
kubectl get svc

作为参考,我的 pods 和 svc 是

NAME                                                       READY   STATUS    RESTARTS   AGE
cheese-app-74ddc9f7c6-xpjwx                                1/1     Running   0          89m
ingress-system-ingress-nginx-controller-656bf75d85-fkzzp   1/1     Running   0          90m

cheese-svc                                          ClusterIP      10.104.243.39   <none>        80/TCP                       82m
ingress-system-ingress-nginx-controller             LoadBalancer   10.106.203.73   127.0.0.1     80:30635/TCP,443:32594/TCP   83m
ingress-system-ingress-nginx-controller-admission   ClusterIP      10.101.103.74   <none>        443/TCP                      83m
kubernetes                                          ClusterIP      10.96.0.1       <none>        443/TCP                      84m

此时 curl 127.0.0.1/ 理论上应该返回一个示例网页,但它报告的是 connection refused

作为诊断步骤,我尝试使用 kubectl exec 从集群内部卷曲来自 nginx 服务器的页面。只要我使用自己的 127.0.0.1 端点卷曲 nginx,它就可以工作。如果我使用其 CLUSTER-IP(在此集群中为 10.106.203.73)来卷曲它,我将一无所获。

kubectl exec --stdin --tty ingress-system-ingress-nginx-controller-656bf75d85-fkzzp -- curl 127.0.0.1/ -i
...works...

kubectl exec --stdin --tty ingress-system-ingress-nginx-controller-656bf75d85-fkzzp -- curl 10.106.203.73/ -i
...nothing...

curl 127.0.0.1/
...nothing...

我没有以任何方式修改 /etc/nginx/nginx.conf,它是通过设置 kubernetes 入口自动生成的默认配置。

解决方法

从集群内这个链接应该可以工作 - http://.:port 在您的情况下,它将是 - http://cheese-svc.default:80

要从外部访问,可以在 nodePort 30635 上访问该服务 http://10.106.203.73:30635

,

当您使用 minikube 时,请使用 minikube ip 获取单节点 minikube 集群的 IP。

然后curl http://<minikube_ip>:<nodePort>

,

我的解决方案是得出结论认为 minikube 不值得付出努力。我烧了几分钱来启动一个小型 Azure Kubernetes 集群几分钟,一切都立即生效。

我曾假设在 minikube 或 Kubernetes 集群中本地运行,Windows 版 Docker 安装会比在云实例中运行更快、更容易,但我错了。这些本地测试环境中小而怪异的恼人拦截器的数量实在是太多了。你的里程可能会有所不同,但我绝对愿意花几美分来测试我的构建,如果它可以让我节省数天的本地开发环境调试失败。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?