Сервисы не общаются в сервисной сети Istio - PullRequest
0 голосов
/ 15 октября 2018

У меня есть сервисная сетка с двумя сервисами (Service1 и Service2).Коляски включены.Я использовал основной шлюз из официального учебника Istio для bookinfo и настроил VirtualService:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"


apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: virtual-template-service
spec:
  gateways:
  - bookinfo-gateway
  hosts:
  - "*"
  http:
  - match:
    - uri:
        prefix: /api/home/method1
    - uri:
        prefix: /api/home/method2
    route:
    - destination:
        host: service1.service1-production.svc.cluster.local
        port:
          number: 80
  - match:
    - uri:
        prefix: /api/home2
    route:
    - destination:
        host: service2.service2-production.svc.cluster.local
        port:
          number: 80


apiVersion: v1
kind: Service
metadata:
  labels:
    app: {{ .Chart.Name }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
    component: app
  name: {{ .Release.Name }}
spec:
  ports:
  - name: http
    port: {{ .Values.service.port }}
    protocol: TCP
    targetPort: {{ .Values.service.port }}
  selector:
    app: {{ .Chart.Name }}
    release: {{ .Release.Name }}
    component: app
  sessionAffinity: None
  type: ClusterIP

method1 Service1 не взаимодействует с Service2.Когда я запрашиваю Service1 / api / home / method1.Все работает нормально.

method2 Service1 действительно взаимодействует с Service2.Он отправил простой асинхронный HTTP-запрос методом POST.И этот метод не работает.

В журналах коляски Service1 я вижу, что запрос был отправлен, но статус 500. И в журналах приложений я вижу ошибку: No such address or device.

В служебной коляске Service2 журналы не имеют активности.

Запрос к service2 / api / home2 тоже работает нормально.

Я не понимаю, что я делаю неправильно.Что вы думаете об этом?Пожалуйста, помогите.

ОБНОВЛЕНИЕ

Оба приложения на основе ядра .net.Поэтому я использую веб-клиент для отправки запросов.Пример:

public static async Task<string> RequestToService2Async(string request)
        {
            using (var client = new WebClient())
            {
                client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
                var response = await client.UploadStringTaskAsync(new Uri(http://service2/api/home2), "POST", request);
                return response;
            }
        }

Журналы служебной машины Service1:

 "GET /api/home/method2HTTP/1.1" 500 - 0 0 28 5 "20.100.3.1" "PostmanRuntime/7.3.0" "083fbcbc-9598-9973-b0c1-b897afdc9df0" "Service1" "127.0.0.1:80" inbound|80||Service1.Service1-production.svc.cluster.local - 20.100.3.110:80 20.100.3.1:0 outbound|80||Service1.Service1-production.svc.cluster.local

ОШИБКА в журналах приложения

fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HLHJ7PTBHFRI", Request id "0HLHJ7PTBHFRI:00000002": An unhandled exception was thrown by the application.
System.Net.WebException: No such device or address No such device or address ---> System.Net.Http.HttpRequestException: No such device or address ---> System.Net.Sockets.SocketException: No such device or address
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask`1 creationTask)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at System.Net.HttpWebRequest.SendRequest()
   at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)

ОБНОВЛЕНИЕ 2.0

Когда я использую в Uri MyService2ClusterIP / api / home2 - все работает!Итак, я просто не могу сделать запрос с именем хоста в URI.

...