【问题标题】:redis, jedis, kubernetes, connection refusedredis,jedis,kubernetes,连接被拒绝
【发布时间】:2021-10-22 01:42:53
【问题描述】:

我无法理解问题所在。我在 Spring Boot 2 中的应用程序尝试连接到 Redis,但连接被拒绝。该应用程序作为 Pod 在 Kubernetes 中运行。我不明白为什么在进入运行我的应用程序进程的容器后,我尝试使用 redis-cli 连接到 Redis 并且它可以工作。

看这里:

/opt/transformer # redis-cli -h redis-master-service.default.svc.cluster.local -p 6379 ping
PONG

但我的应用程序在连接到 Redis 时仍然抛出异常。

org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:292) ~[spring-data-redis-2.5.2.jar!/:2.5.2]
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:511) ~[spring-data-redis-2.5.2.jar!/:2.5.2]
    at org.springframework.data.redis.core.RedisConnectionUtils.fetchConnection(RedisConnectionUtils.java:193) ~[spring-data-redis-2.5.2.jar!/:2.5.2]
    at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:144) ~[spring-data-redis-2.5.2.jar!/:2.5.2]
    at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:105) ~[spring-data-redis-2.5.2.jar!/:2.5.2]
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:209) ~[spring-data-redis-2.5.2.jar!/:2.5.2]
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:189) ~[spring-data-redis-2.5.2.jar!/:2.5.2]
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:176) ~[spring-data-redis-2.5.2.jar!/:2.5.2]
    at org.springframework.data.redis.core.RedisKeyValueAdapter.contains(RedisKeyValueAdapter.java:281) ~[spring-data-redis-2.5.2.jar!/:2.5.2]
    at org.springframework.data.keyvalue.core.KeyValueTemplate.lambda$insert$0(KeyValueTemplate.java:176) ~[spring-data-keyvalue-2.5.2.jar!/:2.5.2]
    at org.springframework.data.keyvalue.core.KeyValueTemplate.execute(KeyValueTemplate.java:362) ~[spring-data-keyvalue-2.5.2.jar!/:2.5.2]
    at org.springframework.data.keyvalue.core.KeyValueTemplate.insert(KeyValueTemplate.java:174) ~[spring-data-keyvalue-2.5.2.jar!/:2.5.2]
    at org.springframework.data.redis.core.RedisKeyValueTemplate.insert(RedisKeyValueTemplate.java:158) ~[spring-data-redis-2.5.2.jar!/:2.5.2]
    at org.springframework.data.keyvalue.core.KeyValueTemplate.insert(KeyValueTemplate.java:157) ~[spring-data-keyvalue-2.5.2.jar!/:2.5.2]
    at org.springframework.data.keyvalue.repository.support.SimpleKeyValueRepository.save(SimpleKeyValueRepository.java:77) ~[spring-data-keyvalue-2.5.2.jar!/:2.5.2]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:529) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:599) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar!/:5.3.8]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:163) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar!/:5.3.8]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.8.jar!/:5.3.8]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar!/:5.3.8]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.8.jar!/:5.3.8]
    at com.sun.proxy.$Proxy58.save(Unknown Source) ~[na:na]
    at io.meksula.transformer.config.RequestFilter.doFilter(RequestFilter.java:29) ~[classes!/:0.0.1-SNAPSHOT]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.8.jar!/:5.3.8]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.8.jar!/:5.3.8]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.8.jar!/:5.3.8]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.8.jar!/:5.3.8]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.8.jar!/:5.3.8]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.8.jar!/:5.3.8]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:764) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1723) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.48.jar!/:na]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
    at redis.clients.jedis.util.Pool.getResource(Pool.java:84) ~[jedis-3.6.2.jar!/:na]
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:370) ~[jedis-3.6.2.jar!/:na]
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:15) ~[jedis-3.6.2.jar!/:na]
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:283) ~[spring-data-redis-2.5.2.jar!/:2.5.2]
    ... 64 common frames omitted
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket.
    at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) ~[jedis-3.6.2.jar!/:na]
    at redis.clients.jedis.Connection.connect(Connection.java:226) ~[jedis-3.6.2.jar!/:na]
    at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:135) ~[jedis-3.6.2.jar!/:na]
    at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:309) ~[jedis-3.6.2.jar!/:na]
    at redis.clients.jedis.BinaryJedis.initializeFromClientConfig(BinaryJedis.java:87) ~[jedis-3.6.2.jar!/:na]
    at redis.clients.jedis.BinaryJedis.<init>(BinaryJedis.java:292) ~[jedis-3.6.2.jar!/:na]
    at redis.clients.jedis.Jedis.<init>(Jedis.java:167) ~[jedis-3.6.2.jar!/:na]
    at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:177) ~[jedis-3.6.2.jar!/:na]
    at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:918) ~[commons-pool2-2.9.0.jar!/:2.9.0]
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:431) ~[commons-pool2-2.9.0.jar!/:2.9.0]
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:356) ~[commons-pool2-2.9.0.jar!/:2.9.0]
    at redis.clients.jedis.util.Pool.getResource(Pool.java:75) ~[jedis-3.6.2.jar!/:na]
    ... 67 common frames omitted
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[na:na]
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[na:na]
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[na:na]
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) ~[na:na]
    at java.base/java.net.Socket.connect(Socket.java:609) ~[na:na]
    at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:80) ~[jedis-3.6.2.jar!/:na]
    ... 78 common frames omitted

我的应用程序在具有本地 Redis 容器的本地计算机上运行良好。

我不明白为什么 nmap 返回该主机已关闭:

/opt/transformer # nmap redis-master-service.default.svc.cluster.local
Starting Nmap 7.80 ( https://nmap.org ) at 2021-08-20 13:39 UTC
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.06 seconds

毕竟,redis-cli 连接正确。为什么会这样?

[编辑]

Redis Pod 定义:

apiVersion: v1
kind: Pod
metadata:
  name: redis
  labels:
    app: redis
spec:
  containers:
  - name: redis
    image: redis:5.0.4
    command:
      - redis-server
      - "/redis-master/redis.conf"
    env:
    - name: MASTER
      value: "true"
    ports:
    - containerPort: 6379
    resources:
      limits:
        cpu: "0.1"
    volumeMounts:
    - mountPath: /redis-master-data
      name: data
    - mountPath: /redis-master
      name: config
  volumes:
    - name: data
      emptyDir: {}
    - name: config
      configMap:
        name: redis-config
        items:
        - key: redis-config
          path: redis.conf

Redis 服务定义:

apiVersion: v1
kind: Service
metadata:
  name: redis-master-service
  labels:
    app: redis
spec:
  ports:
    - port: 6379
      targetPort: 6379
  selector:
    app: redis

Spring Boot 应用程序.yaml:

server:
  port: 8080

spring:
  rabbitmq:
    host: ${MESSAGE_BROKER_HOST}
  redis:
    host: ${CACHE_HOST}
    port: 6379

环境变量在 Spring 应用程序中正确解析,我检查了这一点。

我尝试使用 telnet 连接到服务,并且效果也很好。

/opt/transformer # telnet redis-master-service.default.svc.cluster.local 6379
Connected to redis-master-service.default.svc.cluster.local

【问题讨论】:

  • 能否提供指定redis连接的spring boot属性文件? kubernetes 配置也很有趣,您使用的是服务/副本集/pod 吗?端口配置相关。
  • @usuario 感谢您的回复。我刚刚编辑了我的帖子并添加了一些配置文件。我被卡住了:(
  • 恕我直言,我相信环境变量是这里的关键,因为我找不到问题所在。 application.yml 中的${CACHE_HOST} 解析为什么? Spring Boot 应用程序是在 kubernetes 集群内部还是外部运行?你从哪里执行redis-clinmap
  • redis-clinmap 我从运行 Java 进程的容器运行。 ${CACHE_HOST} 是来自 ConfigMap 的变量,并正确解析为 redis-master-service.default.svc.cluster.local

标签: java kubernetes redis connection


【解决方案1】:

我不知道问题出在哪里,但我通过将jedis 替换为lettuce redis 连接库来解决它。

//        <dependency>
//            <groupId>redis.clients</groupId>
//            <artifactId>jedis</artifactId>
//            <version>3.6.2</version>
//        </dependency>
        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
            <version>6.1.4.RELEASE</version>
        </dependency>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 2021-01-24
    • 2018-05-15
    • 2019-04-04
    • 2017-07-10
    • 2016-02-14
    • 2020-11-06
    • 2019-01-22
    相关资源
    最近更新 更多