【问题标题】:Java : Connecting to Redis cluster running in minikubeJava:连接到在 minikube 中运行的 Redis 集群
【发布时间】:2017-11-06 09:29:29
【问题描述】:

我有一个 Redis 集群,在 minikube 中运行 3 个 master 和 3 个 slave。

PS D:\redis\main\kubernetes-redis-cluster> kubectl exec -ti redis-1-2723908297-prjq5 -- /bin/bash
root@redis-1:/data# redis-cli -p 7000 -c
127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:2
cluster_stats_messages_ping_sent:9131
cluster_stats_messages_pong_sent:9204
cluster_stats_messages_meet_sent:3
cluster_stats_messages_sent:18338
cluster_stats_messages_ping_received:9202
cluster_stats_messages_pong_received:9134
cluster_stats_messages_meet_received:2
cluster_stats_messages_received:18338



127.0.0.1:7000> cluster nodes
de9a4780d93cb7eab8b77abdaaa96a081adcace3 172.17.0.7:7000@17000 slave ee4deab0525d054202e612b317924156ff587021 0 15099603
02577 4 connected
b3a3c05225e0a7fe8ae683dd4316e724e7a7daa6 172.17.0.5:7000@17000 myself,master - 0 1509960301000 2 connected 5461-10922
8bebd48850ec77db322ac51501d59314582865a3 172.17.0.6:7000@17000 master - 0 1509960302000 3 connected 10923-16383
ee4deab0525d054202e612b317924156ff587021 172.17.0.4:7000@17000 master - 0 1509960303479 1 connected 0-5460
28a1c75e9976bc375a13e55160f2aae48defb242 172.17.0.8:7000@17000 slave b3a3c05225e0a7fe8ae683dd4316e724e7a7daa6 0 15099603
02477 5 connected
32e9de12324b8571a6256285682fa066d79161ab 172.17.0.9:7000@17000 slave 8bebd48850ec77db322ac51501d59314582865a3 0 15099603
02000 6 connected
127.0.0.1:7000>

我可以通过 redis-cli 设置/获取键/值,没有任何问题。 现在我正在尝试从一个从 eclipse 运行的简单 java 程序连接到 redis 集群。

我知道我需要转发端口。我执行了下面的命令。

kubectl port-forward redis-0-334270214-fd4k0 7000:7000

现在当我执行下面的程序时。

public class Main {
    public static void main(String[] args) {
    GenericObjectPoolConfig config = new GenericObjectPoolConfig();
    config.setMaxTotal(500);
    config.setMaxIdle(500);
    config.setMaxWaitMillis(60000);
    config.setTestOnBorrow(true);
    config.setMaxWaitMillis(20000);

    Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
    jedisClusterNode.add(new HostAndPort("192.168.99.100", 31695));

    JedisCluster jc = new JedisCluster(jedisClusterNode, config);

    jc.set("prime", "1 is primeee");
    String keyVal = jc.get("prime");
    System.out.println(keyVal);
    }
}

然后我得到以下异常。

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
    at redis.clients.util.Pool.getResource(Pool.java:53)
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
    at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnectionFromSlot(JedisSlotBasedConnectionHandler.java:66)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:116)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141)
    at redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:31)
    at redis.clients.jedis.JedisCluster.set(JedisCluster.java:103)
    at com.redis.main.Main.main(Main.java:25)
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
    at redis.clients.jedis.Connection.connect(Connection.java:207)
    at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
    at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767)
    at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106)
    at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:819)
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:429)
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:360)
    at redis.clients.util.Pool.getResource(Pool.java:49)
    ... 10 more
Caused by: java.net.SocketTimeoutException: connect timed out
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at redis.clients.jedis.Connection.connect(Connection.java:184)
    ... 17 more

Redis 服务也已创建并运行..

PS C:\Users\rootmn> kubectl get services
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)                          AGE
kubernetes   10.0.0.1     <none>        443/TCP                          11h
redis-0      10.0.0.105   <pending>     7000:31695/TCP,17000:31596/TCP   10h
redis-1      10.0.0.7     <pending>     7000:30759/TCP,17000:30646/TCP   10h
redis-2      10.0.0.167   <pending>     7000:32591/TCP,17000:30253/TCP   10h
redis-3      10.0.0.206   <pending>     7000:31644/TCP,17000:31798/TCP   10h
redis-4      10.0.0.244   <pending>     7000:30186/TCP,17000:32701/TCP   10h
redis-5      10.0.0.35    <pending>     7000:30628/TCP,17000:32396/TCP   10h

远程登录到 redis ip 端口工作正常。 我在这里做错什么了吗。什么会导致这个问题?

【问题讨论】:

  • 你的集群中创建redis服务了吗?
  • 是的 redis-service 在那里.. 让我也更新 redis-service 日志..
  • @sfgroups 我已经更新了。请检查这是否应该是这样的
  • 基于您尝试从桌面连接的示例,对吗?还是您在 minikube 中运行的连接容器?
  • @sfgroups 我正在尝试从桌面连接。 Minikube 正在同一台笔记本电脑上的虚拟机上运行。

标签: docker redis kubernetes docker-machine minikube


【解决方案1】:

您需要定义类型为 Nodeport 的服务。从下面的 yaml 文件中更新 selection 部分以匹配您的 redis pod 标签。

apiVersion: v1
kind: Service
metadata:
  name: redis-master-nodeport
  labels:
    app: redis   
spec:
  ports:
  - port: 7000   
  selector:
    app: redis
    role: master
    tier: backend
  type: NodePort

创建服务kubectl.exe create -f redis-master-service.yaml

然后检查它会为您提供端口号的服务。 例如。

kubectl.exe get svc redis-master-nodep
NAME                 CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
redis-master-nodep   10.0.0.62    <nodes>       6379:30277/TCP   16s

现在使用 minkikube ip:30277 端口可以连接到 redis。

希望对你有帮助

【讨论】:

  • apiVersion:v1 种类:服务元数据:名称:redis-0 标签:app:redis 节点:node0 规格:类型:LoadBalancer 端口:-名称:端口-7000 端口:7000-名称:端口- 17000 端口:17000 选择器:app:redis 节点:node0
  • 我的类型是 LoadBalancer 而不是 NodePort..这会导致问题吗?
  • 它在 docker 内部运行良好。我制作了简单的基于 java 的应用程序,能够从 docker 集群设置/获取键/值...
  • 是的,它可以在内部工作,要在外部访问我们需要将服务类型定义为 NodePort。
猜你喜欢
  • 2019-08-03
  • 2020-08-23
  • 2020-01-02
  • 1970-01-01
  • 2021-05-10
  • 2015-10-13
  • 2015-11-12
  • 1970-01-01
  • 2021-01-13
相关资源
最近更新 更多