当前位置: 首页 > 知识库问答 >
问题:

在同一后端服务下使用多个端口和不同协议进行GKE RPC健康检查

长孙作人
2023-03-14

我正在尝试启动一个接受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服务。亚马尔

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

进入。亚马尔

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上运行运行状况检查,如果我启动后端服务(x-service.yaml)而没有后端配置(x-rpc-config),它只能检测到2个健康的后端服务,这两个服务都有HTTP端口:8000和8030)。但是,后端服务侦听端口:8020(RPC)和8030(WS)被认为不正常。我相信这是因为协议类型,所以我创建了BackendConfig(x-rpc-config)来运行TPC运行状况检查,使用端口8020的HTTP2协议,这就是livenessProbe所指向的位置。

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

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

目标是打开端口8020(RPC),同时保持8000(HTTP)正常工作。有可能吗?我是否需要另一种类型的负载平衡器,或者这只是一个配置问题?

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

提前感谢。


共有1个答案

秦钟展
2023-03-14

解决方案

我没有使用默认情况下会在GCP上启动HTTP/HTTPs负载平衡器的入口,而是将服务更改为具有自定义的HTTP2健康检查配置的负载平衡器。默认情况下,此配置将在GCP上启动TCP负载平衡器。例如:

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,这可能会解决它。只需要找出正确的配置,我在他们的文档中找不到它。

 类似资料:
  • 因此,我们正在使用全局MTL部署istio 1.0.2,目前进展顺利。对于健康检查,我们为服务添加了单独的端口,并根据文档进行了配置: https://istio.io/docs/tasks/traffic-management/app-health-check/#mutual-tls-is-enabled 我们的应用程序端口现在位于 8080 上,运行状况检查端口位于 8081 上。完成此操作后

  • 我想netty是我所知道的最好的java网络框架,在阅读并尝试一些示例后,我有疑问: 1.使用netty 4.0为具有不同协议的多端口创建网络服务器的最佳方法是什么? 每个服务器创建: EventLoopGroup bossGroup=new NioEventLoopGroup();//(1) EventLoopGroup workerGroup=新的NioEventLoopGroup(); Se

  • 问题内容: 我遵循了负载均衡器教程:https : //cloud.google.com/container- engine/docs/tutorials/http-balancer 在使用Nginx映像时,当尝试使用自己的应用程序映像时,它工作正常后端切换为不正常。 我的应用程序重定向到/(返回302),但在pod定义中添加了一个: 我的入口看起来像: 服务配置为: 后端健康状况如下: 入口的规

  • 我遵循了负载均衡器教程:https://cloud.google.com/container-engine/docs/tutorials/http-balancer当我使用Nginx映像时工作正常,当我尝试使用我自己的应用程序映像时,尽管后端切换到不健康。 我的应用程序重定向到/(返回302),但我在pod定义中添加了一个livenessProbe: 我的入口看起来像: 服务配置为: 入口中的后端

  • 例如,我可以启动两个程序侦听端口371。第二个没有任何问题地启动并接收传入连接,而第一个没有。一旦最后开始的进程终止,第一个接收它们。 假设这是Windows(XP)行为,它怎么可能是安全的行为呢?这意味着人们可以“过载”任何已经侦听的端口,而不是获得通常的“地址已经在使用”错误消息,并简单地绕过防火墙,规则只是说“允许端口371上的任何传入TCP连接”。

  • imi 原生支持一个项目,单次启动,监听多个端口多个协议。 比如你要做一个聊天系统,http 用于注册、登录、上传文件等等,WebSocket 用于即时通讯。 http 和 WebSocket 同时做在一个项目中,代码之间没有隔阂,可以方便地互相调用和复用。 子服务器配置 项目配置文件: [ // 子服务器(端口监听)配置 'subServers' => [