【问题标题】:com.hazelcast.client.AuthenticationException: Invalid credentials! Principal :nullcom.hazelcast.client.AuthenticationException:凭据无效!校长:空
【发布时间】:2019-09-18 17:19:13
【问题描述】:

我已经通过 Kubernetes API 发现策略在 Kubernetes 上配置了我的多集群 Hazelcast 服务器。 (请看Two separate hazelcast clusters in kubernetes)并且每个集群的成员都成功地发现了彼此。

我的客户端项目作为我的 Hazelcast 服务器在 k8s 集群上运行。 我在我的客户项目 pom 中添加了以下依赖项:

    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast-kubernetes</artifactId>
        <version>1.3.1</version>
    </dependency>

我已经按照官方文档中的说明配置了我的 Hazelcast 客户端:

            clientConfig.getNetworkConfig().getKubernetesConfig()
                .setEnabled(true)
                .setProperty("namespace", "default")
                .setProperty("service-name", "xyz");

(我有一个名为“default”的命名空间和一个名为“xyz”的k8s服务对象)

这些是客户端启动的日志。尽管它识别了 Hazelcast 服务器 pod,但它给出了 AuthenticationException(如下面的扩展)。另外,要指出它没有尝试连接到正确的端口。

2019-09-18 12:59:36,699 [instance=local-service_01.devciny-dock] [localhost-startStop-1] INFO  com.hazelcast.client.HazelcastClient (Slf4jFactory.java:65) - local-service_01.devciny-dock [instance_identifier] [3.11.1] A non-empty group password is configured for the Hazelcast client. Starting with Hazelcast version 3.11, clients with the same group name, but with different group passwords (that do not use authentication) will be accepted to a cluster. The group password configuration will be removed completely in a future release.
2019-09-18 12:59:36,709 [instance=local-service_01.devciny-dock] [localhost-startStop-1] INFO  com.hazelcast.core.LifecycleService (Slf4jFactory.java:65) - local-service_01.devciny-dock [instance_identifier] [3.11.1] HazelcastClient 3.11.1 (20181218 - d294f31) is STARTING
2019-09-18 12:59:36,977 [instance=local-service_01.devciny-dock] [localhost-startStop-1] INFO  com.hazelcast.spi.discovery.integration.DiscoveryService (Slf4jFactory.java:65) - local-service_01.devciny-dock [instance_identifier] [3.11.1] Kubernetes Discovery properties: { service-dns: null, service-dns-timeout: 5, service-name: xyz, service-port: 0, service-label: null, service-label-value: true, namespace: default, resolve-not-ready-addresses: false, kubernetes-master: https://kubernetes.default.svc}
2019-09-18 12:59:36,980 [instance=local-service_01.devciny-dock] [localhost-startStop-1] INFO  com.hazelcast.spi.discovery.integration.DiscoveryService (Slf4jFactory.java:65) - local-service_01.devciny-dock [instance_identifier] [3.11.1] Kubernetes Discovery activated resolver: ServiceEndpointResolver
2019-09-18 12:59:36,999 [instance=local-service_01.devciny-dock] [localhost-startStop-1] INFO  com.hazelcast.client.spi.ClientInvocationService (Slf4jFactory.java:65) - local-service_01.devciny-dock [instance_identifier] [3.11.1] Running with 2 response threads
2019-09-18 12:59:37,060 [instance=local-service_01.devciny-dock] [localhost-startStop-1] INFO  com.hazelcast.core.LifecycleService (Slf4jFactory.java:65) - local-service_01.devciny-dock [instance_identifier] [3.11.1] HazelcastClient 3.11.1 (20181218 - d294f31) is STARTED
2019-09-18 12:59:37,390 [instance=local-service_01.devciny-dock] [local-service_01.devciny-dock.cluster-] INFO  com.hazelcast.client.connection.ClientConnectionManager (Slf4jFactory.java:65) - local-service_01.devciny-dock [instance_identifier] [3.11.1] Trying to connect to [10.42.1.111]:5701 as owner member
2019-09-18 12:59:37,432 [instance=local-service_01.devciny-dock] [local-service_01.devciny-dock.internal-3] WARN  com.hazelcast.client.connection.nio.ClientConnection (Slf4jFactory.java:67) - local-service_01.devciny-dock [instance_identifier] [3.11.1] ClientConnection{alive=false, connectionId=1, channel=NioChannel{/10.42.1.121:39003->/10.42.1.111:5701}, remoteEndpoint=null, lastReadTime=2019-09-18 12:59:37.426, lastWriteTime=2019-09-18 12:59:37.425, closedTime=2019-09-18 12:59:37.431, connected server version=null} closed. Reason: com.hazelcast.client.AuthenticationException[Invalid credentials! Principal: null]
com.hazelcast.client.AuthenticationException: Invalid credentials! Principal: null
        at com.hazelcast.client.connection.nio.ClientConnectionManagerImpl$AuthCallback.onResponse(ClientConnectionManagerImpl.java:747)
        at com.hazelcast.client.connection.nio.ClientConnectionManagerImpl$AuthCallback.onResponse(ClientConnectionManagerImpl.java:702)
        at com.hazelcast.client.spi.impl.ClientInvocationFuture$InternalDelegatingExecutionCallback.onResponse(ClientInvocationFuture.java:130)
        at com.hazelcast.client.spi.impl.ClientInvocationFuture$InternalDelegatingExecutionCallback.onResponse(ClientInvocationFuture.java:118)
        at com.hazelcast.client.spi.impl.ClientInvocationFuture$InternalDelegatingExecutionCallback.onResponse(ClientInvocationFuture.java:130)
        at com.hazelcast.client.spi.impl.ClientInvocationFuture$InternalDelegatingExecutionCallback.onResponse(ClientInvocationFuture.java:118)
        at com.hazelcast.spi.impl.AbstractInvocationFuture$1.run(AbstractInvocationFuture.java:255)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
        at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64)
        at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80)

【问题讨论】:

  • 您是否在 Kubernetes 集群中运行您的 Hazelcast 客户端?好像是权限问题:connected server version=null} closed. Reason: com.hazelcast.client.AuthenticationException[Invalid credentials!
  • 是的,hz 客户端和 hz 服务器都在同一个集群上运行
  • 发现模式 - Kubernetes API - Requires setting up RoleBinding
  • 我也这样做了 Hanx。应用 rbac。

标签: kubernetes hazelcast


【解决方案1】:

您的 Hazelcast 客户端尝试连接到 10.42.1.111:5701 并在那里找到 Hazelcast 服务器。端口看起来是正确的,它正确地找到了 Hazelcast 服务器。

接下来发生的是它无法通过服务器进行身份验证,这可能意味着您没有在 Hazelcast 配置中指定集群密码。你可以在this StackOverflow question阅读更多关于如何做到这一点。

【讨论】:

  • 我添加了该答案中提到的密码。我什至设置了一个空白密码“”。但这没有帮助。另外,我在配置中指定的k8s服务并没有在5701上运行。这就是为什么我觉得尝试连接到5701是不正确的原因
  • 那么,你的 Hazelcast Kubernetes 发现一定是错误的,并试图访问错误的 Hazelcast 集群。然后,指定要在 Hazelcast Kubernetes 配置中使用的端口:&lt;service-port&gt; 属性。
  • 也试过了 :p 它无法识别这个属性。
  • 您也可以尝试在 Hazelcast 服务器 POD 上定义 containerPort
  • 我也定义了 containerPorts。 @rafal,您认为这可能是 rbac 的问题吗?我刚刚部署了这里给出的标准 yaml:github.com/hazelcast/…
【解决方案2】:

您没有分享与客户端身份验证相关的配置中最重要的部分。那是来自您的客户端的集群和组配置的组配置。我预计,问题根源在那里。

默认身份验证将成员上的组名与来自客户端的用户名进行比较。用户名由客户端的组名填充(默认情况下)。

检查AuthenticationBaseMessageTask代码

    private AuthenticationStatus authenticate(UsernamePasswordCredentials credentials) {
        GroupConfig groupConfig = nodeEngine.getConfig().getGroupConfig();
        String nodeGroupName = groupConfig.getName();
        boolean usernameMatch = nodeGroupName.equals(credentials.getUsername());
        return usernameMatch ? AuthenticationStatus.AUTHENTICATED : AuthenticationStatus.CREDENTIALS_FAILED;
    }

【讨论】:

  • 我检查了我的服务器和客户端配置。它们都具有相同的组配置名称。服务器组配置:` String name = groupName + "_" + environment; config.getGroupConfig().setName(name);`客户端组配置:clientConfig.getGroupConfig().setName(groupName + "_" + environmentName);
猜你喜欢
  • 2021-09-09
  • 2019-03-25
  • 2018-11-07
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 2013-06-26
相关资源
最近更新 更多