Home > Back-end >  Minikube Kubernetes, Postgres, Spring Boot Cluster - Postgres connection refused
Minikube Kubernetes, Postgres, Spring Boot Cluster - Postgres connection refused

Time:01-05

so I have a basic minikube cluster configuration for K8s cluster with only 2 pods for Postgres DB and my Spring app. However, I can't get my app to connect to my DB. I know that in Docker such issue could be solved with networking but after a lot of research I can't seem to find the problem and the solution to my issue.

Currently, given my configuration I get a Connection refused error by postgres whenever my Spring App tries to start:

Caused by: org.postgresql.util.PSQLException: Connection to postgres-service:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

So my spring-app is a basic REST API with some open endpoints where I query for some data. The app works completely fine and here is my application.properties:

spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
spring.datasource.username=${POSTGRES_USER}
spring.datasource.password=${POSTGRES_PASSWORD}
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update

The way I create my Postgres component is by creating a ConfigMap, a Secret and finally a Deployment with it's Service inside. They look like so:

postgres-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config
data:
  postgres-url: postgres-service
  postgres-port: "5432"
  postgres-db: "test"

postgres-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: postgres-secret
type: Opaque
data:
  postgres_user: cm9vdA== #already encoded in base64
  postgres_password: cm9vdA== #already encoded in base64

postgres.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
  labels:
    app: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgresdb
          image: postgres
          ports:
            - containerPort: 5432
          env:
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: postgres-secret
                  key: postgres_user
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgres-secret
                  key: postgres_password
            - name: POSTGRES_DB
              valueFrom:
                configMapKeyRef:
                  name: postgres-config
                  key: postgres-db
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  selector:
    app.kubernetes.io/name: postgres
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432

and finally here's my Deployment with it's Service for my spring app

spring-app.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-app-deployment
  labels:
    app: spring-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-app
  template:
    metadata:
      labels:
        app: spring-app
    spec:
      containers:
        - name: spring-app
          image: app #image is pulled from my docker hub
          ports:
            - containerPort: 8080
          env:
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: postgres-secret
                  key: postgres_user
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgres-secret
                  key: postgres_password
            - name: POSTGRES_HOST
              valueFrom:
                configMapKeyRef:
                  name: postgres-config
                  key: postgres-url
            - name: POSTGRES_PORT
              valueFrom:
                configMapKeyRef:
                  name: postgres-config
                  key: postgres-port
            - name: POSTGRES_DB
              valueFrom:
                configMapKeyRef:
                  name: postgres-config
                  key: postgres-db
---
apiVersion: v1
kind: Service
metadata:
  name: spring-app-service
spec:
  type: NodePort
  selector:
    app.kubernetes.io/name: spring-app
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 30001

CodePudding user response:

A connection refused means that the host you are connecting to, does not have the port you mentioned opened.

This leads me to think that the postgres pod isnt running correctly, or the service is not pointing to those pods correctly.

By checking the Yamls I can see that the service's pod selector isnt configured correctly:

The service is selecting pods with label: app.kubernetes.io/name: postgres

The deployment is configured with pods with label: app: postgres

The correct service manifest should look like:

apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  selector:
    app: postgres
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432

You can double check that by describing the service using kubectl describe service postgres-service.

The output should contain the postgres pods IPs for Endpoints.

  • Related