GKE RPC Health Check 同后端服务下多端口多协议

GKE RPC Health Check with multiple ports and different protocols under the same backend service

我正在尝试启动接受 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

默认情况下,如果我在没有 BackendConfig (x-rpc-config ),它只能检测到 2 个健康的后端服务,它们都具有 HTTP 端口:8000 和 8030)。然而后端服务监听端口:8020 (RPC) 和 8030 (WS) 被认为是不健康的。我相信这是由于协议类型而发生的,所以我创建了 BackendConfig (x-rpc-config) 到 运行 TPC 健康检查,使用端口 8020 的 HTTP2 协议 - 这是 livenessProbe 指向的地方到.

pods 和服务已正确创建,但负载均衡器仍无法将它们检测为健康服务。控制台仅显示以下警告:

Some backend services are in UNHEALTHY state

目标是打开端口 8020 (RPC),同时保持 8000 (HTTP) 正常工作。可能吗?我需要其他类型的负载均衡器还是只是配置问题?

我找不到任何在同一服务下使用不同协议的多个端口的 HealthCheck 配置示例。这可能是一个反模式?

提前致谢。

解决方案

我没有使用默认在 GCP 上启动 HTTP/HTTPs Load BalancerIngress,而是将 Service 更改为 LoadBalancer自定义 HTTP2 健康检查配置。默认情况下,此配置将在 GCP 上启动 TCP Load Balancer。例如:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: rpc-config
spec:
  healthCheck:
    checkIntervalSec: 10
    timeoutSec: 3
    healthyThreshold: 2
    unhealthyThreshold: 2
    type: HTTP2
    port: 8020
---
apiVersion: v1
kind: Service
metadata:
  name: x-service
  annotations:
    cloud.google.com/app-protocols: '{"rpc-a":"HTTP2", "rpc-b":"HTTP2", "rpc-c":"HTTP2"}'
    beta.cloud.google.com/backend-config: '{"default": "rpc-config"}'
spec:
  selector:
    app: x-node
  ports:
    - name: rpc-a
      port: 5001
      protocol: TCP
      targetPort: 5001
    - name: rpc-b
      port: 8020
      protocol: TCP
      targetPort: 8020
    - name: rpc-c
      port: 8000
      protocol: TCP
      targetPort: 8000
  type: LoadBalancer

下一步是为 TCP LB 启用 SSL。我看到 GCP 有 SSL 代理 LB,这可能会解决它。只需要找出正确的配置,我在他们的文档中找不到它。