Traefik как входной контроллер + сервер GRPC - НЕИЗВЕСТНО: статус не получен

Я использую traefik в качестве контроллера входящего трафика в AKS, у меня есть служба grpc, которая работает правильно локально, но у меня есть проблема с traefik.

Когда сервер GRPC возвращает ошибку, я получаю ее правильно, но когда он отправляет нормальный ответ, я его не получал:

[email protected]:443> client.Ping({}, metadata, pr)
EventEmitter {}
[email protected]:443> 
Error:  { Error: 2 UNKNOWN: No status received
    at Object.exports.createStatusError (/usr/local/lib/node_modules/grpcc/node_modules/grpc/src/common.js:91:15)
    at Object.onReceiveStatus (/usr/local/lib/node_modules/grpcc/node_modules/grpc/src/client_interceptors.js:1204:28)
    at InterceptingListener._callNext (/usr/local/lib/node_modules/grpcc/node_modules/grpc/src/client_interceptors.js:568:42)
    at InterceptingListener.onReceiveStatus (/usr/local/lib/node_modules/grpcc/node_modules/grpc/src/client_interceptors.js:618:8)
    at callback (/usr/local/lib/node_modules/grpcc/node_modules/grpc/src/client_interceptors.js:845:24) code: 2, metadata: {}, details: 'No status received' }

vs

grpcServer@localhost:10000> client.Ping({}, metadata, pr)
EventEmitter {}
grpcServer@localhost:10000> 
{
  "response": "PONG"
}

Ошибка:

[email protected]:443> client.Ping({}, pr)
EventEmitter {}
[email protected]:443> 
Error:  { Error: 16 UNAUTHENTICATED: incorrect serial number
    at Object.exports.createStatusError (/usr/local/lib/node_modules/grpcc/node_modules/grpc/src/common.js:91:15)
    at Object.onReceiveStatus (/usr/local/lib/node_modules/grpcc/node_modules/grpc/src/client_interceptors.js:1204:28)
    at InterceptingListener._callNext (/usr/local/lib/node_modules/grpcc/node_modules/grpc/src/client_interceptors.js:568:42)
    at InterceptingListener.onReceiveStatus (/usr/local/lib/node_modules/grpcc/node_modules/grpc/src/client_interceptors.js:618:8)
    at callback (/usr/local/lib/node_modules/grpcc/node_modules/grpc/src/client_interceptors.js:845:24)
  code: 16,
  metadata:
   { 'content-length': '0', date: 'Wed, 06 Feb 2019 21:32:38 GMT' },
  details: 'incorrect serial number' }

Сервис k8s yml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: velcloud-grpc
  namespace: production
  annotations:
    kubernetes.io/ingress.class: traefik
    ingress.kubernetes.io/protocol: h2c
    traefik.protocol: h2c
spec:
  rules:
    - host: grpc.test.com
      http:
        paths:
          - path: /
            backend:
              serviceName: velcloud-grpc
              servicePort: grpc

Изменить: дополнительная информация

После некоторой отладки я просмотрел полученный ответ:

{ client_close: true,
  metadata: { date: [ 'Wed, 06 Feb 2019 23:48:06 GMT' ] },
  read: <Buffer 0a 04 50 4f 4e 47>,
  status:
   { code: 2,
     details: 'No status received',
     metadata: Metadata { _internal_repr: {} } } } { code: 2,
  details: 'No status received'
}

Единственная проблема здесь - статус, прочитанное содержимое - правильный ответ после десериализации: { response: 'PONG' }

Я не знаю, почему статус установлен на 2 (НЕИЗВЕСТНО), а не на 0 (ОК).


person jmaitrehenry    schedule 06.02.2019    source источник


Ответы (1)


В моей конфигурации Traefik я использую промежуточное ПО повтора ([retry]), а в Traefik v1.7.8 есть ошибка:

Когда промежуточное ПО повтора уже отправило заголовки, используйте исходную карту заголовков, чтобы иметь возможность отправлять трейлеры.

https://github.com/containous/traefik/pull/4442

Я вручную собираю ветку v1.7 с этим исправлением, и все снова работает! Большое спасибо Containous (Дэмиену и Жюльену!) За помощь в отладке этой проблемы!

person jmaitrehenry    schedule 08.02.2019