【发布时间】:2020-04-29 19:23:28
【问题描述】:
所以我已经成功部署了 istio,至少我是这么认为的,一切似乎都运行良好。我已经在 Istio 中部署了我的 API,我可以通过浏览器访问它。我什至可以使用邮递员测试我的 API,但是当我尝试通过 curl 访问我的 API 时,它会显示 The remote name could not be resolved: 'api.localhost'。那是第一个危险信号,但我忽略了它。现在我正在尝试从我的 web 应用程序访问我的 API,但 Chrome 以 net:ERR_FAILED 响应。
似乎我的服务只对主机可用,也就是我,没有别的。我似乎无法在互联网上找到解决方案,所以我希望有人有经验并知道解决方法。
谢谢!
编辑:更多信息
我的基础架构都是本地的,Docker for Desktop with Kubernetes。我使用的 Istio 版本是 1.5.0。
网关:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: api-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http-api
protocol: HTTP
hosts:
- "api.localhost"
虚拟服务:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: pb-api
spec:
gateways:
- api-gateway
hosts:
- "*"
http:
- match:
- uri:
prefix: /
rewrite:
uri: /
route:
- destination:
host: pb-api
port:
number: 3001
当我尝试执行curl http://api.localhost/user/me 时,我期望得到401,但我得到的是The remote name could not be resolved: 'api.localhost',如上所述。该错误与我关闭桌面版 Docker 并重试时相同。通过邮递员和浏览器可以正常工作,但是 curl 和我的 react webapp 无法访问它。
【问题讨论】:
-
您的基础架构是什么(云,本地)? istio 的版本是多少?能否请您添加网关和虚拟服务的 yaml?你能补充一下你是如何使用 curl 的吗?
-
@jt97 我用附加信息编辑了我的帖子。已经感谢您的调查!
-
istio 中的所有内容都应该通过入口网关,因此如果您使用
kubectl get svc istio-ingressgateway -n istio-system检查它,您应该有一个外部 IP,如果状态为待处理,那么您应该安装一些负载均衡器,例如 @ 987654321@。您可以尝试使用curl -v -H "host: api.localhost" istio-ingressgateway-external-ip/并检查它是否有效?看看我的示例 here 上的测试。如果您认为它可能有帮助,我可以向您展示 minikube 的示例。 -
外部IP是
localhost所以我尝试了这个命令curl -v -H "host: api.localhost" localhost/user/me它给了我401。所以这似乎可行,我想我会在 webapp 的请求中添加这个标头以使其工作。 -
如果您愿意,您可以将网关主机从“api.localhost”更改为通配符
"*",它应该可以在没有标头的情况下工作。
标签: kubernetes kubernetes-ingress istio