Ingress 只能用于 Minikube 吗?它在 Ubuntu 安装中不起作用
Is Ingress useable only for Minikube? It is not working in Ubuntu installation
我在 minikube 中成功测试了入口,完全没有问题。
然后我将我的应用程序部署到 ubuntu,如果我使用服务 NodePort,它也工作得很好。在那之后,我想用 Ingress 作为负载均衡器来路由流量,这样 external url 就不再是丑陋的长端口了。
但是很遗憾,我没有成功,总是失败。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: dv
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /test
backend:
serviceName: ngsc
servicePort: 3000
kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
dv * 80 12s
root@kmaster:/home/ubuntu/datavisor# kubectl describe ing dv
Name: dv
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
*
/ ngsc:3000 (192.168.1.14:3000,192.168.1.17:3000,192.168.1.18:3000)
Annotations:
ingress.kubernetes.io/rewrite-target: /
Events: <none>
然后当我尝试访问时,出现以下错误:
curl http://cluster-ip
curl: (7) Failed to connect to <cluster-ip> port 80: Connection refused
我真正希望的是让url暴露在外面的是http://ipaddress, instead of http://ipaddress:30080
我知道我可以很容易地使用 kubernete 之外的 nginx 来满足这个要求,但这并不理想,我希望 kubernete 能够处理它,这样即使服务端口发生变化,一切仍然正常。
你能检查上面的输出并告诉我错误是什么吗?我查了很多文档,每个地方似乎都只关注 minikube,与真正的集群部署无关。我需要安装任何东西才能使 ingress 正常工作吗?当我使用 kubectl get all --all-namespaces 时,我根本没有看到安装入口控制器。如果需要我该如何安装?
感谢您的建议
嗯,实际上 Kubernetes 不提供任何开箱即用的 Ingress 控制器。您必须安装 Nginx Ingress 或 Traefik Ingress 或其他任何东西。入口控制器必须 运行 在集群中的某个地方,这是必须的。实际上入口控制器是将流量代理到您的应用程序的实际代理。
而且我认为您应该知道引擎盖下的 minikube 也使用 nginx-ingress-controller(参见 https://github.com/kubernetes/minikube/tree/master/deploy/addons/ingress)。
在云环境中,入口控制器 运行 在云负载平衡器后面执行集群节点之间的负载平衡。
如果你 运行 本地集群 - 那么通常你的入口控制器是 运行 作为 NodePort 服务,你可以创建指向你的节点 IP 地址的 DNS 记录。也可以 运行 在专用节点上进入控制器并使用 hostNetwork: true
。这将允许使用标准的 80/443 端口。所以这里有很多选择。
我在 minikube 中成功测试了入口,完全没有问题。 然后我将我的应用程序部署到 ubuntu,如果我使用服务 NodePort,它也工作得很好。在那之后,我想用 Ingress 作为负载均衡器来路由流量,这样 external url 就不再是丑陋的长端口了。 但是很遗憾,我没有成功,总是失败。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: dv
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /test
backend:
serviceName: ngsc
servicePort: 3000
kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
dv * 80 12s
root@kmaster:/home/ubuntu/datavisor# kubectl describe ing dv
Name: dv
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
*
/ ngsc:3000 (192.168.1.14:3000,192.168.1.17:3000,192.168.1.18:3000)
Annotations:
ingress.kubernetes.io/rewrite-target: /
Events: <none>
然后当我尝试访问时,出现以下错误:
curl http://cluster-ip
curl: (7) Failed to connect to <cluster-ip> port 80: Connection refused
我真正希望的是让url暴露在外面的是http://ipaddress, instead of http://ipaddress:30080
我知道我可以很容易地使用 kubernete 之外的 nginx 来满足这个要求,但这并不理想,我希望 kubernete 能够处理它,这样即使服务端口发生变化,一切仍然正常。
你能检查上面的输出并告诉我错误是什么吗?我查了很多文档,每个地方似乎都只关注 minikube,与真正的集群部署无关。我需要安装任何东西才能使 ingress 正常工作吗?当我使用 kubectl get all --all-namespaces 时,我根本没有看到安装入口控制器。如果需要我该如何安装?
感谢您的建议
嗯,实际上 Kubernetes 不提供任何开箱即用的 Ingress 控制器。您必须安装 Nginx Ingress 或 Traefik Ingress 或其他任何东西。入口控制器必须 运行 在集群中的某个地方,这是必须的。实际上入口控制器是将流量代理到您的应用程序的实际代理。
而且我认为您应该知道引擎盖下的 minikube 也使用 nginx-ingress-controller(参见 https://github.com/kubernetes/minikube/tree/master/deploy/addons/ingress)。
在云环境中,入口控制器 运行 在云负载平衡器后面执行集群节点之间的负载平衡。
如果你 运行 本地集群 - 那么通常你的入口控制器是 运行 作为 NodePort 服务,你可以创建指向你的节点 IP 地址的 DNS 记录。也可以 运行 在专用节点上进入控制器并使用 hostNetwork: true
。这将允许使用标准的 80/443 端口。所以这里有很多选择。