Apache Ignite:将 1000 条警告 "Unable to perform handshake within timeout" 添加到日志中

Apache Ignite: 1000s of warnings "Unable to perform handshake within timeout" get added to the log

最近我将我的 .Net Core 3.1 应用程序中的 Apache Ignite 运行ning 从 2.7.5 更新到 2.8.1,今天我注意到日志中有数千条这样的警告

Jun 03 18:26:54 quote-service-us-deployment-5d874d8546-psbcs org.apache.ignite.internal.processors.odbc.ClientListenerNioListener: Site: WARN - Unable to perform handshake within timeout [timeout=10000, remoteAddr=/10.250.0.4:57941]
Jun 03 18:26:59 quote-service-uk-deployment-d644cbc86-7xcvw org.apache.ignite.internal.processors.odbc.ClientListenerNioListener: Site: WARN - Unable to perform handshake within timeout [timeout=10000, remoteAddr=/10.250.0.4:57982]
Jun 03 18:26:59 quote-service-us-deployment-5d874d8546-psbcs org.apache.ignite.internal.processors.odbc.ClientListenerNioListener: Site: WARN - Unable to perform handshake within timeout [timeout=10000, remoteAddr=/10.250.0.4:57985]
Jun 03 18:27:04 quote-service-uk-deployment-d644cbc86-7xcvw org.apache.ignite.internal.processors.odbc.ClientListenerNioListener: Site: WARN - Unable to perform handshake within timeout [timeout=10000, remoteAddr=/10.250.0.4:58050]
Jun 03 18:27:04 quote-service-us-deployment-5d874d8546-psbcs org.apache.ignite.internal.processors.odbc.ClientListenerNioListener: Site: WARN - Unable to perform handshake within timeout [timeout=10000, remoteAddr=/10.250.0.4:58051]
Jun 03 18:27:09 quote-service-uk-deployment-d644cbc86-7xcvw org.apache.ignite.internal.processors.odbc.ClientListenerNioListener: Site: WARN - Unable to perform handshake within timeout [timeout=10000, remoteAddr=/10.250.0.4:58114]
Jun 03 18:27:09 quote-service-us-deployment-5d874d8546-psbcs org.apache.ignite.internal.processors.odbc.ClientListenerNioListener: Site: WARN - Unable to perform handshake within timeout [timeout=10000, remoteAddr=/10.250.0.4:58118] 

我不直接在我的应用程序中使用 ODBC 或 JDBC,并且该应用程序 运行 在虚拟网络的 Kubernetes 集群中运行。 有趣的是,在所有情况下,连接另一端的 IP(在本例中为 10.250.0.4)属于 kube-proxy pod。 我对此有点困惑。

更新: 据报告,同一 IP 地址也属于以下 pods: azure-ip-masq-agent 和 azure-cni-networkmonitor (我想那些属于我用于 运行 K8s 集群的 Azure Kubernetes 服务)

因此网络监视器可能正在尝试访问 ODBC 端口(只是猜测)。是否有机会抑制该警告或完全禁用 ODBC 连接?我不使用 ODBC,但我想保持 JDBC 连接处于启用状态,因为我偶尔会使用 DBeaver 连接到 Ignite 实例。谢谢!

如果你已经定义了一个服务并打开了端口 10800 那么 K8 将通过 kube-proxy 执行健康检查。这会导致 Ignite 在该端口上收到不完整的握手记录 "unable to perform handshake" 消息。

ClientListenerNioListener:站点:警告 - 无法在超时内执行握手 [超时=10000,remoteAddr=/10.250.0.4:58050]

此处客户端连接器侦听器 (ClientListenerNioListener) 表示无法在 10 秒内与 remoteAddr=/10.250.0.4:58050 建立成功的握手

配置客户端连接器:https://apacheignite.readme.io/docs/binary-client-protocol#connectivity
客户端连接器握手:https://apacheignite.readme.io/docs/binary-client-protocol#connection-handshake

服务示例w/port 10800开通:

kind: Service
metadata: 
  # The name must be equal to TcpDiscoveryKubernetesIpFinder.serviceName
  name: ignite
  # The name must be equal to TcpDiscoveryKubernetesIpFinder.namespaceName
  namespace: ignite
spec:
  type: LoadBalancer
  ports:
    - name: rest
      port: 8080
      targetPort: 8080
    - name: sql
      port: 10800
      targetPort: 10800

您可以重新定义服务不开放端口或更新服务定义为 使用不同的端口进行健康检查: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip

来自文档:
service.spec.healthCheckNodePort - 指定服务的健康检查节点端口(数字端口号)。如果未指定 healthCheckNodePort,服务控制器会从集群的 NodePort 范围中分配一个端口。您可以通过设置 API 服务器命令行选项 --service-node-port-range 来配置该范围。如果客户端指定,它将使用用户指定的 healthCheckNodePort 值。它仅在 type 设置为 LoadBalancer 且 externalTrafficPolicy 设置为 Local 时有效。