在同一个后端服务下使用多个端口和不同的协议进行GKE RPC运行状况检查

问题描述

我正在尝试启动一个接受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-service.yaml)的情况下启动了后端服务(x-rpc-config),则只能检测到2健康的后端服务,都具有HTTP端口:8000和8030)。但是,后端服务侦听端口:8020(RPC)和8030(WS)被认为不正常。我相信它是由于协议类型而发生的,所以我创建了BackendConfig(x-rpc-config)来运行TPC运行状况检查,而使用HTTP2协议为端口8020 -这是livenessProbe指向的地方。 >

已正确创建Pod和服务,但是Load Balancer仍无法将它们检测为运行状况良好的服务。控制台仅显示以下警告:

某些后端服务处于不健康状态

目标是打开端口8020(RPC),但也保持8000(HTTP)工作。可能吗?我是否需要另一种类型的负载均衡器还是仅仅是配置问题?

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

谢谢。

解决方法

解决方案

我没有使用Ingress(默认情况下会在GCP上启动HTTP/HTTPs Load Balancer),而是将Service更改为使用自定义{ {1}}运行状况检查配置。默认情况下,此配置将在GCP上加速LoadBalancer。例如:

HTTP2

下一步是为TCP LB启用SSL。我看到GCP具有SSL Proxy LB,也许可以解决它。只是需要找出正确的配置,我在他们的文档中找不到它。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...