Я хочу развернуть серверы 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
, изменение пути к зонду готовности устраняет проблему.