gpt4 book ai didi

docker - GKE - 在运行时绕过 Pod LoadBalancer(Pod 的外部 IP)到 Pod 的容器 IP 以用于 WebSocket 目的

转载 作者:行者123 更新时间:2023-12-02 12:02:38 27 4
gpt4 key购买 nike

我有以下情况:

我有几个微服务,现在只有两个是相关的。
- Web 套接字服务 API
- 调度服务

我们有 3 个用户,我们将分别称为 1、2 和 3。这些用户将自己连接到我们后端的 Web 套接字端点。我们的微服务在 Kubernetes 上运行,每个服务都可以在 Pod 内多次复制。对于这种情况,我们有 1 个用于调度程序的运行容器,以及 3 个用于 Web 套接字 api 的运行容器。每个 pod 都有其负载均衡器,这将是每次的入口点。

在我们的情况下,我们将有以下“模式”:

enter image description here

现在我们有了系统的表示(和图例),我们的 3 个用户将想要使用该应用程序并进行连接。

enter image description here

正如我们所看到的,我们的 pod 的负载均衡器在不同的容器之间转发了我们用户的 Web 套接字连接。每个容器一旦获得新连接,就会通知 Dispatcher Service,这个容器会将其保存在自己的数据库中。

现在,3 个用户连接到 2 个不同的容器,并且 Dispatcher 服务知道这一点。

用户 1 想向用户 2 发送消息。容器 A 将收到一条消息并告诉 Dispatcher Service:Please, send this to the user 2 .

由于调度程序知道用户 2 连接到哪个容器,因此我想直接向我的容器发送请求,而不是向 Pod 发送请求。将其发送到 Pod 会导致向负载均衡器发送请求,负载均衡器实际上将请求分派(dispatch)到最可用的容器实例......

enter image description here

我怎么能设法获得容器 IP?它可以被另一个 Pod 中的另一个容器访问吗?

对我来说,最好的方法是,一旦应用程序启动,它会获取当前容器的 IP,然后在注册请求中将其发送给调度程序,这样调度程序就会知道 ContainerID=IP

谢谢!

编辑 1

有我的web-socket-service-api.yaml

apiVersion: v1
kind: Service
metadata:
name: web-socket-service-api
spec:
ports:
# Port that accepts gRPC and JSON/HTTP2 requests over HTTP.
- port: 8080
targetPort: 8080
protocol: TCP
name: grpc
# Port that accepts gRPC and JSON/HTTP2 requests over HTTP.
- port: 8081
targetPort: 8081
protocol: TCP
name: rest
# Port that accepts WebSockets.
- port: 8082
targetPort: 8082
protocol: TCP
name: websocket
selector:
app: web-socket-service-api
type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: web-socket-service-api
spec:
replicas: 3
template:
metadata:
labels:
app: web-socket-service-api
spec:
containers:
- name: web-socket-service-api
image: gcr.io/[PROJECT]/web-socket-service-api:latest
ports:
- containerPort: 8080
- containerPort: 8081
- containerPort: 8082

最佳答案

Dispatcher ≈ 消息代理

正如我对您的设计的理解,您的 Dispatcher 本质上是您的 Websocket 服务的 pod 的消息代理。让所有 Websocket pod 连接到代理并让代理路由消息。这是一个有状态的服务,你应该使用 StatefulSet为此在 Kubernetes 中。根据您的要求,可能的解决方案是为此使用 MQTT 代理,例如mosquitto .大多数 MQTT 代理都支持 websocket。

横向扩展:Pod 的多个副本

each services can be replicated multiple times inside Pods. For this situation, we have 1 running container for the dispatcher, and 3 running containers for the web socket api.



这不是 Kubernetes 的用途。使用多个 pod 的复制品而不是 pod 中的多个容器。我建议您创建一个 Deployment为您的 Websocket 服务提供尽可能多的副本。

作为负载均衡器服务

Each pod has its Load Balancer and this will be each time the entry point.



在 Kubernetes 中,您应该创建一个 Service将流量负载平衡到一组 pod。

您的解决方案

To me, the best approach would be that, once the app start, it gets the current container's IP and then send it within the register request to the dispatcher, so the dispatcher would know that ContainerID=IP



是的,我基本同意。这与我在这里描述的相似。但我会让 Websocket 服务建立到 Broker/Dispatcher 的连接。

关于docker - GKE - 在运行时绕过 Pod LoadBalancer(Pod 的外部 IP)到 Pod 的容器 IP 以用于 WebSocket 目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59095095/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com