Серверы gRPC и HTTP на GKE Ingress не проходят проверку работоспособности для сервера gRPC - PullRequest
0 голосов
/ 23 мая 2019

Я хочу развернуть серверы gRPC + HTTP на GKE с HTTP / 2 и взаимным TLS.В моем развертывании есть и тест готовности, и тест живучести с пользовательским путем.Я предоставляю доступ к серверам gRPC и HTTP через Ingress.

зонды развертывания и открытые порты:

    livenessProbe:
      failureThreshold: 3
      httpGet:
        path: /_ah/health
        port: 8443
        scheme: HTTPS
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1
    readinessProbe:
      failureThreshold: 3
      httpGet:
        path: /_ah/health
        port: 8443
        scheme: HTTPS
    name: grpc-gke
    ports:
    - containerPort: 8443
      protocol: TCP
    - containerPort: 50052
      protocol: TCP

Служба NodePort:

apiVersion: v1
kind: Service
metadata:
  name: grpc-gke-nodeport
  labels:
    app: grpc-gke
  annotations:
    cloud.google.com/app-protocols: '{"grpc":"HTTP2","http":"HTTP2"}'
    service.alpha.kubernetes.io/app-protocols: '{"grpc":"HTTP2", "http": "HTTP2"}'
spec:
  type: NodePort
  ports:
  - name: grpc
    port: 50052
    protocol: TCP
    targetPort: 50052
  - name: http
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    app: grpc-gke

Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: grpc-gke-ingress
  annotations:
    kubernetes.io/ingress.allow-http: "false"
    #kubernetes.io/ingress.global-static-ip-name: "grpc-gke-ip"
  labels:
    app: grpc-gke
spec:
  rules:
  - http:
      paths:
      - path: /_ah/*
        backend:
          serviceName: grpc-gke-nodeport
          servicePort: 443
  backend:
    serviceName: grpc-gke-nodeport
    servicePort: 50052

Стручок существует и имеет «зеленый» статус перед созданием зондов живучести и готовности.На моем сервере регулярно регистрируются сообщения о том, что kube-probe вызывает и /_ah/live, и /_ah/ready, а сервер отвечает 200.

Я использую сертификат TLS, управляемый Google, набалансировщик нагрузки (LB).Мой HTTP-сервер создает самозаверяющий сертификат, вдохновленный этим блогом .

. Я создаю Ingress после того, как начинаю видеть журналы зондов.После этого он создает LB с двумя бэкэндами, один для HTTP и один для gRPC.Проверки состояния бэкэнда HTTP в порядке, а сервер HTTP доступен из Интернета.Проверка работоспособности бэкэнда gRPC не проходит, поэтому LB не маршрутизирует протокол gRPC, и я получаю ответ об ошибке 502.

Это с мастером GKE 1.12.7-gke.10.Я также попробовал более новые версии 1.13 и более старые версии 1.11.В кластере включена балансировка нагрузки HTTP и включен собственный VPC.Существуют правила брандмауэра, разрешающие доступ с LB к моим модулям (я даже пытался разрешить все порты со всех IP-адресов).Задержка зондов также не помогает.

Забавно, что я развернул почти ту же настройку, просто образ Docker сервера другой, пару месяцев назад, и он работает без каких-либо проблем.Я даже могу развернуть новые образы сервера Docker, и все отлично.Я не могу найти никакой разницы между этими двумя.

Есть еще одна проблема, вход застрял в состоянии "Создание входа" на несколько дней.Это никогда не заканчивается и никогда не видит LB.У Ingress 'LB никогда нет внешнего интерфейса, и мне всегда нужно вручную добавлять внешний интерфейс HTTP / 2 со статическим IP-адресом и управляемым Google TLS-сертификатом.Это должно происходить только для кластера, который был создан без «HTTP-балансировки нагрузки», но это происходит в моем случае каждый раз для всех моих «HTTP-балансировок нагрузки».Рабочее развертывание находится в этом состоянии уже в течение нескольких месяцев.

Есть идеи, почему проверка работоспособности бэкэнда gRPC может быть неудачной, даже если я вижу в журналах, что конечные точки готовности и живучести вызываются kube-probe?

РЕДАКТИРОВАТЬ:

describe svc grpc-gke-nodeport

Name:                     grpc-gke-nodeport
Namespace:                default
Labels:                   app=grpc-gke
Annotations:              cloud.google.com/app-protocols: {"grpc":"HTTP2","http":"HTTP2"}
                        kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{"cloud.google.com/app-protocols":"{\"grpc\":\"HTTP2\",\"http\":\"HTTP2\"}",...
                        service.alpha.kubernetes.io/app-protocols: {"grpc":"HTTP2", "http": "HTTP2"}
Selector:                 app=grpc-gke
Type:                     NodePort
IP:                       10.4.8.188
Port:                     grpc  50052/TCP
TargetPort:               50052/TCP
NodePort:                 grpc  32148/TCP
Endpoints:                10.0.0.25:50052
Port:                     http  443/TCP
TargetPort:               8443/TCP
NodePort:                 http  30863/TCP
Endpoints:                10.0.0.25:8443
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

и проверка работоспособности для gRPC является HTTP / 2 GET с использованием пути / на порт 32148.Его описание - «Проверка работоспособности балансировки нагрузки по умолчанию для kubernetes L7».где в качестве описания проверки работоспособности сервера HTTP используется «Проверка работоспособности Kubernetes L7, созданная с настройками проверки готовности».Таким образом, проверка работоспособности для сервера gRPC не создается из зонда готовности.

Редактирование проверки работоспособности для указания на порт 30863, изменение пути к зонду готовности устраняет проблему.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Редактирование проверки работоспособности для указания пути проверки готовности и изменение порта на порт HTTP-сервера исправили эту проблему (найдите порт в проверке работоспособности HTTP-сервера. Это NodePort.) , Он работает без проблем.

Использование той же проверки работоспособности для серверной части gRPC, что и для серверной части HTTP, не сработало, она была возвращена к собственной проверке работоспособности. Даже удаление проверки работоспособности сервера gRPC не помогло, оно было воссоздано. Помогло только его редактирование с использованием другого порта и пути.

0 голосов
/ 24 мая 2019

Вход GKE только недавно начал поддерживать полную поддержку gRPC в бета-версии (тогда как HTTP2 ro HTTP1.1 преобразование использовалось в прошлом).Чтобы использовать gRCP, вам нужно добавить аннотацию к входу "cloud.google.com/app-protocols: '{" http2-service ":" HTTP2 "}'". Обратитесь к этой инструкции для получения дополнительной информации.

...