Невозможно получить доступ к сервису GKE с поддержкой Istio напрямую из браузера, но только через curl

Я развернул приложение узла в облаке (кластер GKE с включенным Istio). Я проверил запущенные службы с помощью kubectl get services -n istio-system, и он показывает

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  

Я могу получить доступ к nodeservice1 через curl -v -H "Host: nodeservice1.istio-system.example.com" 34.80.18.249, но если я нажму " http://34.80.18.249:8080/" из браузера, это не сработает.

Если я не выберу облачную платформу и не настрою обычный кластер kubernete, то у меня есть возможность предоставить nodeservice1 как тип LoadBalancer, доступный из браузера.

Вывод команды curl:curl -v -H "Хост: 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

1 ответ

Решение

Очевидно, вам не принадлежит example.com.

Таким образом, вы не можете ожидать, что посещение http://nodeservice1.istio-system.example.com/ из вашего браузера сработает, потому что вы не настраивали DNS для домена.

Когда ты делаешь curl -H "Host: foo" http://ip, ему не нужно проходить через DNS (потому что вы даете ipобращайтесь напрямую). ВHost предоставленный вами заголовок (обычно предоставляемый браузером, выводится из URL-адреса) затем используется входным шлюзом Istio для маршрутизации трафика к нужной службе.

Предполагая, что вы используете Knative/Cloud Run, вам следует подумать об обновлении домена по умолчанию в Cloud Run на GKE с example.com на то, что принадлежит вам, чтобы вы могли установить записи DNS для своих поддоменов.

В качестве альтернативы вы можете добавить локальную запись DNS в /etc/hosts файл, который указывает это имя хоста на внешний IP-адрес вашего istio-ingressgateway, и ваш браузер будет использовать локальный взлом, чтобы преобразовать это имя хоста в этот IP-адрес.

Другие вопросы по тегам