首页 > 解决方案 > Apache Ignite:将 1000 条警告“无法在超时内执行握手”添加到日志中

问题描述

最近,我将在我的 .Net Core 3.1 应用程序中运行的 Apache Ignite 从 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。我对此有点困惑。

UPD:据报道,相同的 IP 地址也属于以下 pod:azure-ip-masq-agent 和 azure-cni-networkmonitor(我猜它们属于我用来运行 K8s 集群的 Azure Kubernetes 服务)

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

标签: kubernetesload-balancingignite

解决方案


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

ClientListenerNioListener:站点:警告 - 无法在超时内执行握手 [timeout=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
 
 

打开端口 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/#保留客户端源 IP

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


推荐阅读