Kubernetes nginx 入口在集群内部工作但在外部不可见
Kubernetes nginx ingress working inside cluster but not visible outside
我设置了一个简单的 kubernetes yaml 文件(如下)来测试 nginx 入口。 Nginx 在集群内按预期工作,但在集群外不可见。
我是 运行 minikube
,minikube tunnel
和 minikube 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 安装会比 运行 在云实例中安装更快更容易,但是我错了。这些本地测试环境中的小怪异烦人的拦截器数量实在是太多了。你的里程可能会有所不同,但我绝对愿意支付几美分来测试我的构建,如果它确实可以节省我几天不成功调试本地开发环境的时间。
我设置了一个简单的 kubernetes yaml 文件(如下)来测试 nginx 入口。 Nginx 在集群内按预期工作,但在集群外不可见。
我是 运行 minikube
,minikube tunnel
和 minikube 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
.
然后curl http://<minikube_ip>:<nodePort>
我的解决方案是得出 minikube 不值得付出努力的结论。我花费了几分钱来启动一个小型 Azure Kubernetes 集群几分钟,一切都立即运行。
我假设 运行 在 minikube 或 Kubernetes 集群中本地 Docker Windows 安装会比 运行 在云实例中安装更快更容易,但是我错了。这些本地测试环境中的小怪异烦人的拦截器数量实在是太多了。你的里程可能会有所不同,但我绝对愿意支付几美分来测试我的构建,如果它确实可以节省我几天不成功调试本地开发环境的时间。