Traefik как входной контроллер + сервер GRPC - НЕИЗВЕСТНО: статус не получен
Я использую traefik в качестве входного контроллера в AKS, у меня есть сервис grpc, который корректно работает локально, но у меня есть некоторые проблемы с traefik.
Когда сервер GRPC возвращает ошибку, я получаю ее правильно, но когда он отправляет нормальный ответ, я не получаю ее:
grpcServer@grpc.test.com:443> client.Ping({}, metadata, pr)
EventEmitter {}
grpcServer@grpc.test.com: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' }
против
grpcServer@localhost:10000> client.Ping({}, metadata, pr)
EventEmitter {}
grpcServer@localhost:10000>
{
"response": "PONG"
}
Ошибка:
grpcServer@grpc.test.com:443> client.Ping({}, pr)
EventEmitter {}
grpcServer@grpc.test.com: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 (ОК).
1 ответ
В моей конфигурации Traefik я использую промежуточное ПО для повторных попыток ([retry]
) и Traefik v1.7.8 имеют ошибку:
Когда промежуточное ПО для повторных попыток уже отправило заголовки, используйте исходную карту заголовков, чтобы иметь возможность отправлять трейлеры.
Я вручную строю ветку v1.7 с этим исправлением и все снова работает! Большое спасибо Containous (Дэмиен и Жюльен!) За помощь в устранении этой проблемы!