gpt4 book ai didi

kubernetes - GKE Ingress 上的 gRPC 和 HTTP 服务器未能对 gRPC 后端进行健康检查

转载 作者:行者123 更新时间:2023-12-02 11:43:27 26 4
gpt4 key购买 nike

我想使用 HTTP/2 和双向 TLS 在 GKE 上部署 gRPC + HTTP 服务器。我的部署具有自定义路径的就绪探针和 active 探针。我通过 Ingress 公开 gRPC 和 HTTP 服务器。

部署的探针和暴露的端口:

    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

节点端口服务:
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

入口:
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

在创建 liveness 和 readiness 探针之前,pod 确实存在,并且具有“绿色”状态。我在我的服务器上看到 /_ah/live 的常规日志。和 /_ah/ready由 kube-probe 调用,服务器响应 200回复。

我在负载均衡器 (LB) 上使用 Google 托管的 TLS 证书。我的 HTTP 服务器创建了一个自签名证书——灵感来自 this blog .

在我开始查看探针的日志后,我创建了 Ingress。之后,它会创建一个具有两个后端的 LB,一个用于 HTTP,一个用于 gRPC。 HTTP 后端的运行状况检查正常,并且可以从 Internet 访问 HTTP 服务器。 gRPC 后端的健康检查失败,因此 LB 不路由 gRPC 协议(protocol),我收到 502错误响应。

这是 GKE master 1.12.7-gke.10。我还尝试了新的 1.13 和旧的 1.11 大师。集群启用了 HTTP 负载平衡并启用了 VPC-native。有防火墙规则允许从 LB 访问我的 pod(我什至尝试允许来自所有 IP 地址的所有端口)。延迟探测也无济于事。

有趣的是,我部署了几乎相同的设置,只是服务器的 Docker 镜像不同,几个月前它运行没有任何问题。我什至可以部署服务器的新 Docker 镜像,一切都很棒。我找不到这两者之间的任何区别。

还有一个问题,Ingress 几天都停留在“Creating Ingress”状态。它永远不会结束,也永远不会看到 LB。 Ingress 的 LB 从来没有前端,我总是必须手动添加一个带有静态 IP 和 Google 管理的 TLS 证书的 HTTP/2 前端。这应该只发生在没有“HTTP负载平衡”的集群上,但在我的情况下,每次我的所有“启用HTTP负载平衡”的集群都会发生这种情况。工作部署已经处于这种状态几个月了。

即使我看到 kube-probe 调用就绪和活跃端点的日志,为什么 gRPC 后端的运行状况检查可能会失败的任何想法?

编辑:
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更改准备就绪探测的路径可解决此问题。

最佳答案

编辑健康检查以指向就绪探针的路径并将端口更改为 HTTP 后端之一修复了此问题(在 HTTP 后端的健康检查中查找端口。它是 NodePort 的。)。它运行知道没有任何问题。

对 gRPC 后端使用与 HTTP 后端相同的健康检查不起作用,它被重置为自己的健康检查。即使删除 gRPC 后端的健康检查也无济于事,它被重新创建了。只有编辑它以使用不同的端口和路径才有帮助。

关于kubernetes - GKE Ingress 上的 gRPC 和 HTTP 服务器未能对 gRPC 后端进行健康检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56277949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com