【发布时间】:2020-11-06 19:07:40
【问题描述】:
我正在尝试启动一个接受 4 个不同端口的连接的第三方服务:
x-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: x-deployment
labels:
app: x
...
ports:
- containerPort: 8000 # HttpGraphQLServer
- containerPort: 8001 # WebSocketServer
- containerPort: 8020 # JsonRpcServer
- containerPort: 8030 # HttpIndexingServer
livenessProbe:
tcpSocket:
port: 8020
x-service.yaml
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: x-rpc-config
spec:
healthCheck:
checkIntervalSec: 7
timeoutSec: 3
healthyThreshold: 2
unhealthyThreshold: 2
type: HTTP2
port: 8020
---
apiVersion: v1
kind: Service
metadata:
name: x-service
annotations:
beta.cloud.google.com/backend-config: '{"default": "x-rpc-config"}'
spec:
selector:
app: x
ports:
- name: graphql
port: 8000
targetPort: 8000
- name: subscription
port: 8001
targetPort: 8001
- name: indexing
port: 8030
targetPort: 8030
- name: jrpc
port: 8020
targetPort: 8020
type: NodePort
ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: backend-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: backend-dev-ip-address
networking.gke.io/managed-certificates: backend-certificate
spec:
rules:
- host: x.dev.domain.io
http:
paths:
- path: /rpc
backend:
serviceName: x-service
servicePort: 8020
- path: /idx
backend:
serviceName: x-service
servicePort: 8030
- path: /ws
backend:
serviceName: x-service
servicePort: 8001
- path: /*
backend:
serviceName: x-service
servicePort: 8000
默认情况下,GKE LoadBalancer 在 HTTP:80 上运行健康检查,如果我在没有 BackendConfig (x-rpc-config) 的情况下启动后端服务 (x-service.yaml),它只能检测到 2 个健康的后端服务,都带有 HTTP 端口:8000 和 8030)。但是后端服务监听端口:8020 (RPC) 和 8030 (WS) 不被认为是健康的。我相信这是因为协议类型而发生的,所以我创建了 BackendConfig (x-rpc-config) 来运行 TPC 健康检查,使用 HTTP2 协议访问端口 8020 - 这是 livenessProbe 指向的位置。
pod 和服务已正确创建,但负载均衡器仍无法将它们检测为健康服务。控制台仅显示以下警告:
一些后端服务处于不健康状态
目标是打开端口 8020 (RPC),同时保持 8000 (HTTP) 正常工作。是否可以?我需要其他类型的负载均衡器还是只是配置问题?
我找不到任何针对同一服务下具有不同协议的多个端口的 HealthCheck 配置示例。这可能是一种反模式?
提前致谢。
【问题讨论】:
-
您能详细说明
third-party service that accepts吗?您使用的是什么 GKE 版本。你配置防火墙了吗?这就是您在集群中应用的所有配置?它的标准集群还是私有的?您是否以任何方式配置网络? -
当然@PjoterS,第三方服务是一个图节点(hub.docker.com/r/graphprotocol/graph-node),它启动了4个服务器。我对 RPC 和 HTTP 服务器感兴趣——分别是端口 8020 和 8000。我正在使用 GKE v1.17.13-gke.600,网络配置是具有全局静态 IP 的入口的默认设置。我所做的唯一更改是为负载均衡器设置 HTTP2 协议,该协议从
x-service指向端口 8020,我可以看到x-rpc-config已正确应用于负载均衡器的健康检查设置。 -
您是否考虑过将HTTP(S) LB 与自定义端口号健康检查和NEG 一起使用?
-
我最终使用了 TCP LB。这解决了这个问题。谢谢
-
很高兴听到这个消息。您能否提供您的解决方案作为答案?它可能会帮助遇到类似问题的其他用户。
标签: kubernetes load-balancing google-kubernetes-engine rpc kubernetes-health-check