我有一个 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 代理阻止了启用 Istio 的 Kubernetes 集群中两个服务(service-1 和 service-2)之间的 RMI 流量。
要调试问题,您需要执行以下步骤:
检查两个 pod 之间是否存在任何连接问题。确保正确设置网络策略和防火墙规则。
检查特使代理(istio sidecar)的日志。为此,请使用以下命令获取特使代理日志:
kubectl 日志-c istio-proxy -n
检查是否有任何与RMI协议相关的错误。
检查 Istio 是否正确配置以允许两个 pod 之间的 RMI 流量。您可能需要为此检查 Istio 配置文件。
检查是否为 RMI 流量正确配置了端口转发。服务定义中提到的端口应该与RMI使用的相同。
如果以上所有检查都通过,则尝试从 pod 中删除 Envoy 代理(istio sidecar),看看是否能解决问题。这将有助于隔离问题。
如果以上步骤还不能解决问题,那么尝试在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 之间流动。
希望对你有帮助!