【问题标题】:GKE RPC Health Check with multiple ports and different protocols under the same backend serviceGKE RPC 健康检查在同一后端服务下使用多个端口和不同协议
【发布时间】: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


【解决方案1】:

解决方案

我没有使用 Ingress(默认情况下会在 GCP 上启动 HTTP/HTTPs Load Balancer),而是将 Service 更改为使用自定义 HTTP2 运行状况检查配置的 LoadBalancer。默认情况下,此配置将在 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,这可能会解决它。只需要找出正确的配置,我在他们的文档中找不到。

【讨论】:

    猜你喜欢
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2021-10-14
    • 2019-10-10
    • 2020-01-03
    • 2019-06-28
    相关资源
    最近更新 更多