簡體   English   中英

Minikube Kube.netes、Postgres、Spring 啟動集群 - Postgres 連接被拒絕

[英]Minikube Kubernetes, Postgres, Spring Boot Cluster - Postgres connection refused

所以我有一個基本的 minikube 集群配置,用於 K8s 集群,只有 2 個 pod 用於 Postgres DB 和我的 Spring 應用程序。 但是,我無法讓我的應用程序連接到我的數據庫。 我知道在Docker中可以使用 .networking 解決此類問題,但經過大量研究后,我似乎無法找到問題所在和解決方案。

目前,根據我的配置,每當我的 Spring 應用程序嘗試啟動時,我都會收到 postgres 拒絕連接的錯誤:

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.

所以我的 spring-app 是一個基本的 REST API,有一些開放端點,我可以在其中查詢一些數據。 該應用程序運行良好,這是我的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

我創建我的 Postgres 組件的方法是創建一個ConfigMap ,一個Secret ,最后是一個Deployment ,里面有它的Service 他們看起來像這樣:

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

最后這是我的Deployment ,它是我的 spring 應用程序的Service

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

拒絕連接意味着您要連接的主機沒有打開您提到的端口。

這讓我認為 postgres pod 沒有正確運行,或者服務沒有正確指向這些 pod。

通過檢查 Yamls,我可以看到服務的 pod 選擇器配置不正確:

該服務正在選擇 label 的 pod: app.kube.netes.io/name: postgres

部署配置了帶有 label 的 pod: app: postgres

正確的服務清單應如下所示:

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

您可以通過使用 kubectl describe service postgres-service 描述服務來仔細檢查。

output 應該包含端點的 postgres pod IP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM