如何解决无法从集群内访问入口服务
我是 kubernetes 的新手,我的 linux mint 20 上安装了 minikube。 我正在尝试使用 nextjs 实现服务器端渲染,我已经使用 helm 安装了 ingress-nginx。
ingess-service.yaml :
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: example.dev
http:
paths:
- backend:
serviceName: users-srv
servicePort: 4000
path: /api/users/?(.*)
- backend:
serviceName: ui-srv
servicePort: 3000
path: /?(.*)
在下一个 js 应用程序 ui
中,我想访问入口控制器以便从服务器端进行 api 调用。我试过了:
axios.get('http://ingress-nginx-controller-admission/api/users/currentuser')
axios.get('http://ingress-nginx-controller/api/users/currentuser')
axios.get('http://ingress-service/api/users/currentuser')
但没有任何效果。
kubctl 获取服务:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.107.45.123 172.42.42.100 80:31205/TCP,443:32568/TCP 80m
ingress-nginx-controller-admission ClusterIP 10.111.229.112 <none> 443/TCP 80m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d1h
ui-srv ClusterIP 10.99.20.51 <none> 3000/TCP 89s
users-mongo-srv ClusterIP 10.103.187.200 <none> 27017/TCP 89s
users-srv ClusterIP 10.99.15.244 <none> 4000/TCP 89s
谁能帮帮我? 提前致谢...
解决方法
入口旨在处理到集群的外部流量,因此,它期望请求到达您指定的域(又名 example.dev)
要从 Pod 内部访问您的 API,您绝对应该直接使用 Ingress 提供的服务,例如 users-srv
或 ui-srv
。
如果你真的想联系入口而不是服务,你可以尝试一些事情:
-
使
example.dev
指向 LoadBalancer IP 地址,例如将其添加到集群节点的/etc/hosts
应该可以工作 8 甚至在 Pod 内部)。但请注意,这意味着当您可以使用服务名称访问服务时,需要通过很长的路径访问服务。 -
从您的规则中删除主机参数,这意味着服务通常应在 nginx 控制器的 IP 地址处提供,这应该使使用
ingress-nginx-controller
按预期工作。并非所有 Ingress Controller 都支持此功能,但它可以工作。
对于在浏览器中执行的代码
在您的笔记本电脑上运行:
echo "172.42.42.100 example.dev" | sudo tee -a /etc/hosts
对于在浏览器js中执行的js代码使用:
axios.get('http://example.dev/api/users/currentuser')
用于在 k8s 上的节点中执行的代码
在js中使用:
axios.get('http://users-srv.cluster.local/api/users/currentuser')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。