【问题标题】:Redis & Spring Boot integration with K8S errorRedis 和 Spring Boot 集成与 K8S 错误
【发布时间】:2020-02-22 18:30:45
【问题描述】:

我有以下 docker 文件:

FROM openjdk:8-jdk-alpine
ENV PORT 8094
EXPOSE 8094
RUN mkdir -p /app/
COPY build/libs/fqdn-cache-service.jar /app/fqdn-cache-service.jar
WORKDIR /build
ENTRYPOINT [ "sh" "-c", "java -jar /app/fqdn-cache-service.jar" ]

docker-compose.yaml 文件:

version: '3'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: fqdn-cache-service
    ports:
      - "8094:8094"
    links:
      - "db:redis"
  db:
    image: "redis:alpine"
    #hostname: redis
    ports:
      - "6378:6378"

deployment.yaml 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fqdn-cache-service
spec:
  selector:
    matchLabels:
      run: spike
  replicas: 1
  template:
    metadata:
      labels:
        app: redis
        run: spike
    spec:
      containers:
        - name: fqdn-cache-service
          imagePullPolicy: Never
          image: fqdn-cache-service:latest
          ports:
            - containerPort: 8094
              protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  selector:
    matchLabels:
      run: spike
  replicas: 1
  template:
    metadata:
      labels:
        run: spike
    spec:
      hostname: redis
      containers:
        - name: redis
          image: redis:alpine
          ports:
            - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: fqdn-cache-service
  labels:
    run: spike
spec:
  type: NodePort
  ports:
    - port: 8094
      nodePort: 30001
  selector:
    run: spike
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  labels:
    run: spike
    app: redis
spec:
  type: NodePort
  ports:
    - port: 6379
      nodePort: 30002
  selector:
    run: spike

并且集群信息 ip 是 127.0.0.1。 我在 ubuntu 操作系统上使用 microk8s。 如果我请求获取方式和 ID (127.0.0.1/webapi/users/1),我会收到错误:

Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

虽然在带有 redis 的常规 java 应用程序或带有 redis 的 dockerize spring boot 上它正在工作。

任何帮助为什么会发生这种情况?

这是spring boot的配置:

@Configuration
public class ApplicationConfig {
    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName("127.0.0.1");
        factory.setPort(30001);
        factory.setUsePool(true);
        return factory;
    }

    @Bean
    RedisTemplate redisTemplate() {
        RedisTemplate<String, FqdnMapping> redisTemplate = new RedisTemplate<String, FqdnMapping>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        return redisTemplate;
    }
}

如果主机名是 localhost 并且\或端口是 6379,也会出现此问题...

谢谢!

【问题讨论】:

    标签: spring-boot docker kubernetes redis


    【解决方案1】:

    当您在容器中运行时,127.0.0.1 通常指的是容器本身,而不是容器运行所在的主机。如果您尝试连接到服务,请尝试使用其名称和端口:端口 6379 上的“redis”和 8094 上的“fqdn-cache-service”。

    【讨论】:

    • 感谢@Burak,当主机是redis 和fqdn-cache-service 时,仍然无法正常工作。此外,如果我在浏览器中导航到 fqdn-cache-service:8094 什么也不会发生。
    • 这些名称仅在 k8s 集群内有效,在集群外无效,因此不要期望它们在加载浏览器时起作用。 k8s 服务的重点是能够使用它们的 DNS 名称定位这些服务,因此名称访问应该在容器之间工作。我从来没有使用过 microk8s,它有 DNS 支持吗?如果没有,那么我的建议将不起作用。
    • 谢谢!我必须使用microk8s.enable dashboard dns 启用 DNS。现在主机是redis,端口为6379