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

Kubernetes nginx ingress working inside cluster but not visible outside

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

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

将以下 yaml 保存为 Whosebug.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 隧道 window

minikube tunnel

并应用 yaml 文件

kubectl apply -f ./Whosebug.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/ 理论上应该 return 一个示例网页,但它报告 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 ingress 自动生成的默认配置。

在集群中,这个 link 应该可以工作 - http://.:port 在你的情况下它将是 - http://cheese-svc.default:80

要从外部访问它,可以在节点端口 30635 上访问该服务 http://10.106.203.73:30635

由于您正在使用 minikube,请使用 minikube ip.

获取单节点 minikube 集群的 IP

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

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

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