无法直接从浏览器访问支持 Istio 的 GKE 服务,只能通过 curl
Not able to access a Istio enabled GKE service directly from browser but only through curl
我在云 运行 选项上部署了一个节点应用程序(启用了 Istio 的 GKE 集群)。
我使用 'kubectl get services -n istio-system' 检查了服务 运行ning,它显示
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
istio-ingressgateway LoadBalancer 10.4.15.63 34.80.18.249 15020:30228/TCP,80:31380/TCP,443:31390/TCP
nodeservice1 ExternalName <none> istio-ingressgateway.istio-system.svc.cluster.local
nodeservice1-qdvk6 ClusterIP 10.4.12.102 <none> 80/TCP
nodeservice1-qdvk6-metrics ClusterIP 10.4.8.162 <none> 9090/TCP
nodeservice1-qdvk6-priv ClusterIP 10.4.14.49 <none> 80/TCP
我可以通过
curl -v -H "Host: nodeservice1.istio-system.example.com" 34.80.18.249
但如果我从浏览器中点击“http://34.80.18.249:8080”,它就不起作用。
如果我不选择云 运行 平台并设置普通的 kubernete 集群,那么我可以选择将 nodeservice1 公开为 LoadBalancer 类型并可从浏览器访问。
curl 的输出command:curl -v -H "Host: nodeservice1.istio-system.example.com" 34.80.18.249/restcall
* Trying 34.80.18.249:80...
* TCP_NODELAY set
* Connected to 34.80.18.249 (34.80.18.249) port 80 (#0)
> GET //restcall HTTP/1.1
> Host: nodeservice1.istio-system.example.com
> User-Agent: curl/7.65.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< content-security-policy: default-src 'none'
< content-type: text/html; charset=utf-8
< date: Wed, 25 Sep 2019 09:24:15 GMT
< x-content-type-options: nosniff
< x-powered-by: Express
< x-envoy-upstream-service-time: 5349
< server: istio-envoy
< Accept-Ranges: none
< Content-Length: 148
< Via: HTTP/1.1 forward.http.proxy:3128
< Connection: keep-alive
<
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot GET //restcall</pre>
</body>
</html>
* Connection #0 to host 34.80.18.249 left intact
显然,您不拥有 example.com
。
所以您不能指望从您的浏览器访问 http://nodeservice1.istio-system.example.com 能正常工作,因为您没有为域配置 DNS。
当你做curl -H "Host: foo" http://ip
时,不需要通过DNS(因为你直接给了ip
地址)。然后,Istio 入口网关使用您提供的 Host
header(通常由浏览器提供,从 URL 推断)将流量路由到正确的服务。
假设你使用 Knative/Cloud 运行,你应该考虑 updating the default domain on Cloud Run on GKE 从 example.com 到你拥有的东西,这样你就可以为你的子域设置 DNS 记录。
或者,您可以将本地 DNS 记录添加到 /etc/hosts
文件,将该主机名指向您的 istio-ingressgateway 的 External-IP 地址,您的浏览器将使用本地 hack 来将该主机名解析为该 IP。
我在云 运行 选项上部署了一个节点应用程序(启用了 Istio 的 GKE 集群)。 我使用 'kubectl get services -n istio-system' 检查了服务 运行ning,它显示
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
istio-ingressgateway LoadBalancer 10.4.15.63 34.80.18.249 15020:30228/TCP,80:31380/TCP,443:31390/TCP
nodeservice1 ExternalName <none> istio-ingressgateway.istio-system.svc.cluster.local
nodeservice1-qdvk6 ClusterIP 10.4.12.102 <none> 80/TCP
nodeservice1-qdvk6-metrics ClusterIP 10.4.8.162 <none> 9090/TCP
nodeservice1-qdvk6-priv ClusterIP 10.4.14.49 <none> 80/TCP
我可以通过 curl -v -H "Host: nodeservice1.istio-system.example.com" 34.80.18.249 但如果我从浏览器中点击“http://34.80.18.249:8080”,它就不起作用。
如果我不选择云 运行 平台并设置普通的 kubernete 集群,那么我可以选择将 nodeservice1 公开为 LoadBalancer 类型并可从浏览器访问。
curl 的输出command:curl -v -H "Host: nodeservice1.istio-system.example.com" 34.80.18.249/restcall
* Trying 34.80.18.249:80...
* TCP_NODELAY set
* Connected to 34.80.18.249 (34.80.18.249) port 80 (#0)
> GET //restcall HTTP/1.1
> Host: nodeservice1.istio-system.example.com
> User-Agent: curl/7.65.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< content-security-policy: default-src 'none'
< content-type: text/html; charset=utf-8
< date: Wed, 25 Sep 2019 09:24:15 GMT
< x-content-type-options: nosniff
< x-powered-by: Express
< x-envoy-upstream-service-time: 5349
< server: istio-envoy
< Accept-Ranges: none
< Content-Length: 148
< Via: HTTP/1.1 forward.http.proxy:3128
< Connection: keep-alive
<
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot GET //restcall</pre>
</body>
</html>
* Connection #0 to host 34.80.18.249 left intact
显然,您不拥有 example.com
。
所以您不能指望从您的浏览器访问 http://nodeservice1.istio-system.example.com 能正常工作,因为您没有为域配置 DNS。
当你做curl -H "Host: foo" http://ip
时,不需要通过DNS(因为你直接给了ip
地址)。然后,Istio 入口网关使用您提供的 Host
header(通常由浏览器提供,从 URL 推断)将流量路由到正确的服务。
假设你使用 Knative/Cloud 运行,你应该考虑 updating the default domain on Cloud Run on GKE 从 example.com 到你拥有的东西,这样你就可以为你的子域设置 DNS 记录。
或者,您可以将本地 DNS 记录添加到 /etc/hosts
文件,将该主机名指向您的 istio-ingressgateway 的 External-IP 地址,您的浏览器将使用本地 hack 来将该主机名解析为该 IP。