无法在 istio 中的服务之间建立 RMI 连接

问题描述 投票:0回答:1

我有一个 kubernetes 集群,其中 istio 部署了一堆服务,但我似乎无法使用 RMI 协议在两个特定的 pod 之间建立通信,两个 pod 都注入了 istio sidecar。

这是 kubernetes 服务:

apiVersion: v1
kind: Service
metadata:
  name: service-1
  namespace: xxx
spec:
  ports:
  - name: rmi-port
    port: 10022
    targetPort: 10022
    appProtocol: tcp
  selector:
    app: svc-1
  type: ClusterIP

apiVersion: v1
kind: Service
metadata:
  name: service-2
  namespace: xxx
spec:
  ports:
  - name: rmi-port
    port: 10021
    targetPort: 10021
    appProtocol: tcp
  selector:
    app: svc-2
  type: ClusterIP

在此示例中,service-2 是请求的发起者并尝试连接到端口 10022 上的 service-1,但我总是收到以下错误:

java.net.SocketException: Connection reset - java.rmi.ConnectIOException : error during JRMP connection establishment

应该提到的是,如果我试图从启动请求的 pod 中删除特使代理,就会发生通信。 我还注意到,每当我向 service-1 发出 rmi 请求时,特使代理日志都会生成“BlackHoleCluster” envoy proxy logs

kubernetes rmi istio
1个回答
0
投票

在我看来,您遇到的这个问题的根本原因是 Envoy 代理阻止了启用 Istio 的 Kubernetes 集群中两个服务(service-1 和 service-2)之间的 RMI 流量。

要调试问题,您需要执行以下步骤:

  1. 检查两个 pod 之间是否存在任何连接问题。确保正确设置网络策略和防火墙规则。

  2. 检查特使代理(istio sidecar)的日志。为此,请使用以下命令获取特使代理日志:

kubectl 日志-c istio-proxy -n

检查是否有任何与RMI协议相关的错误。

  1. 检查 Istio 是否正确配置以允许两个 pod 之间的 RMI 流量。您可能需要为此检查 Istio 配置文件。

  2. 检查是否为 RMI 流量正确配置了端口转发。服务定义中提到的端口应该与RMI使用的相同。

  3. 如果以上所有检查都通过,则尝试从 pod 中删除 Envoy 代理(istio sidecar),看看是否能解决问题。这将有助于隔离问题。

  4. 如果以上步骤还不能解决问题,那么尝试在Istio配置文件中添加如下内容:

yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: allow-rmi-traffic
spec:
  hosts:
  - service-1
  - service-2
  tcp:
  - match:
    - port: 10021
      protocol: tcp
    route:
    - destination:
        host: service-1
        port:
          number: 10022

这将允许使用 RMI 协议的流量在 service-1 和 service-2 之间流动。

希望对你有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.