首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法通过Spring将Docker Desktop Kubernetes (Windows)服务连接到本地Postgres db

无法通过Spring将Docker Desktop Kubernetes (Windows)服务连接到本地Postgres db
EN

Stack Overflow用户
提问于 2020-07-05 21:15:12
回答 1查看 1.1K关注 0票数 2

我无法将由Kubernetes通过Desktop (Windows)管理的已停靠的Spring连接到Postgres的本地实例。错误如下:

postgres-db-svc.default.svc.cluster.local:5432 :拒绝连接到org.postgresql.util.PSQLException。检查主机名和端口是否正确,以及port主机是否接受TCP/IP连接。

直到试图连接到本地DB为止,一切都很正常(外部客户端可以通过Ingress连接到pods,pods可以彼此通信,等等)。

我想我的配置不在这里。

ConfigMap

代码语言:javascript
运行
复制
apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: 2017-12-27T18:38:34Z
  name: test-docker-config
  namespace: default
  resourceVersion: "810136"
  uid: 352c4572-eb35-11e7-887b-42010a8002b8
data:
  spring_datasource_platform: postgres
  spring_datasource_url: jdbc:postgresql://postgres-db-svc.default.svc.cluster.local/sandbox
  spring_datasource_username: postgres
  spring_datasource_password: password
  spring_jpa_properties_hibernate_dialect: org.hibernate.dialect.PostgreSQLDialect

服务

代码语言:javascript
运行
复制
kind: Service
apiVersion: v1
metadata:
  name: postgres-db-svc
spec: 
  type: ExternalName
  externalName: kubernetes.docker.internal
  ports:
  - port: 5432

在我的主机文件中,"kubernetes.docker.internal“映射为127.0.0.1

部署

代码语言:javascript
运行
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tester
spec:
  selector:
    matchLabels:
      app: tester
  template:
    metadata:
      labels:
        app: tester
    spec:
      containers:
      - name: tester
        imagePullPolicy: IfNotPresent
        image: test-spring-boot
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 8080
        env:
        - name: SPRING_DATASOURCE_PLATFORM
          valueFrom:
            configMapKeyRef:
              name: test-docker-config
              key: spring_datasource_platform
        - name: SPRING_DATASOURCE_URL
          valueFrom:
            configMapKeyRef:
              name: test-docker-config
              key: spring_datasource_url
        - name: SPRING_DATASOURCE_USERNAME
          valueFrom:
            configMapKeyRef:
              name: test-docker-config
              key: spring_datasource_username
        - name: SPRING_DATASOURCE_PASSWORD
          valueFrom:
            configMapKeyRef:
              name: test-docker-config
              key: spring_datasource_password
        - name: SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT
          valueFrom:
            configMapKeyRef:
              name: test-docker-config
              key: spring_jpa_properties_hibernate_dialect

Spring Boot application.properties

代码语言:javascript
运行
复制
spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:postgres}
spring.datasource.url=${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/sandbox}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME:postgres}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:password}
spring.jpa.properties.hibernate.dialect=${SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT:org.hibernate.dialect.PostgreSQLDialect}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-06 01:31:01

Kubernetes与Docker一起运行在同一个端口VM中,所以我假设您所指的/etc/hosts文件是在您的Windows机器上。

我还假设您运行Postgres时,使用如下内容公开了5432

代码语言:javascript
运行
复制
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

首先,127.0.0.1将无法工作,因为如果VM的话,docker只会公开IP地址上的端口。

其次,库伯内特斯将无法找到kubernetes.docker.internal,因为豆荚使用CoreDNS进行解析,而且它不知道这个域。

我建议你这样做:

  • 不要使用kubernetes.docker.internal,因为它已经被停靠者用于它自己的目的。使用类似于mypostgres.local的东西
  • 获取你的对接者VM的IP地址。运行ping docker.local或在C:\Windows\System32\drivers\etc\hosts for something like this: Added by Docker Desktop 10.xx.xx.xx host.docker.internal or look at the output fromipconfig /all`下查找,并从停靠桌面VM中找到IP。
  • 在您的hostAliases中使用podSpec,这样/etc/hosts文件实际上就在您的pod中被修改了。 apiVersion: app/v1类:部署元数据:名称:测试器规范:选择器: matchLabels: app: tester模板:元数据:标签: app: tester规范: hostAliases:- ip:"10.xx.xx.xx“# VM主机名的IP:- "mypostgres.local”容器:- name: tester : IfNotPresent映像:测试弹簧引导资源:限制:内存:“128 cpu”cpu:“500 m”
  • 不要使用ExternalName服务,因为这些服务只用于CoreDNS。如果希望ExternalName服务正常工作,则必须修改CoreDNS配置,以便对mypostgres.local条目进行硬编码。

注意:另一个选项是在Kubernetes中运行Postgresql并使用常规的ClusterIP服务公开它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62746410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档