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

Я развернул приложение узла при запуске в облаке (GKE Cluster с включенной 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 "Хост: 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

<code>*   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
* Соединение № 0 с хостом 34.80.18.249 осталось без изменений

1 Ответ

0 голосов
/ 26 сентября 2019

Очевидно, что вы не владеете 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-адрес.

...