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 Balancer
的 Ingress
,而是将 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,这可能会解决它。只需要找出正确的配置,我在他们的文档中找不到它。
我正在尝试启动接受 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 Balancer
的 Ingress
,而是将 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,这可能会解决它。只需要找出正确的配置,我在他们的文档中找不到它。