【问题标题】:Can't connect Docker Desktop Kubernetes (Windows) services to local Postgres db via Spring Boot无法通过 Spring Boot 将 Docker Desktop Kubernetes (Windows) 服务连接到本地 Postgres db
【发布时间】:2020-10-26 00:11:39
【问题描述】:

我无法通过 Docker Desktop (Windows) 将 Kubernetes 管理的 dockerized Spring Boot API 连接到 Postgres 的本地实例。错误如下:

org.postgresql.util.PSQLException: Connection to postgres-db-svc.default.svc.cluster.local:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

在尝试连接到本地数据库之前,一切正常(外部客户端可以通过 Ingress 连接到 Pod,Pod 可以相互通信,等等)。

我认为我的配置在此处关闭。

配置映射

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

服务

kind: Service
apiVersion: v1
metadata:
  name: postgres-db-svc
spec: 
  type: ExternalName
  externalName: kubernetes.docker.internal
  ports:
  - port: 5432

在我的 hosts 文件中,“kubernetes.docker.internal”映射到 127.0.0.1

部署

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 应用程序.properties

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}

【问题讨论】:

    标签: postgresql spring-boot docker kubernetes


    【解决方案1】:

    带有 Docker 的 Kubernetes 在同一个 docker VM 中运行,因此我假设您所指的 /etc/hosts 文件是您的 Windows 机器上的文件。

    我还假设您运行 Postgres 时会使用类似这样的方式暴露 5432

    docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
    

    首先,127.0.0.1 不起作用,因为 docker 只是在虚拟机的情况下公开 IP 地址上的端口。

    其次,Kubernetes 将无法找到 kubernetes.docker.internal,因为 pod 使用 CoreDNS 来解析并且它不知道该域。

    我建议你这样做:

    • 不要使用kubernetes.docker.internal,因为它已经被 docker 用于自己的目的。使用类似mypostgres.local

    • 获取 docker 虚拟机的 IP 地址。运行 ping docker.local 或在 `C:\Windows\System32\drivers\etc\hosts 下查找类似内容:

      Added by Docker Desktop
      10.xx.xx.xx host.docker.internal
      

      或查看ipconfig /all 的输出并从 docker 桌面 VM 中找到 IP。

    • 在您的 podSpec 中使用 hostAliases,以便在您的 pod 中实际修改 /etc/hosts 文件。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tester
      spec:
        selector:
          matchLabels:
            app: tester
        template:
          metadata:
            labels:
              app: tester
          spec:
            hostAliases:
            - ip: "10.xx.xx.xx" # The IP of your VM
              hostnames:
              - "mypostgres.local"
            containers:
            - name: tester
              imagePullPolicy: IfNotPresent
              image: test-spring-boot
              resources:
                limits:
                  memory: "128Mi"
                  cpu: "500m"
      
    • 不要使用 ExternalName 服务,因为这些服务仅适用于 CoreDNS。如果您希望ExternalName 服务正常工作,您必须修改您的CoreDNS 配置,以便它硬编码mypostgres.local 的条目

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

    【讨论】:

    • 不确定这些其他操作的关联程度,但我还必须将“host all 0.0.0.0/0 md5”添加到我的 pg_hba.conf 中,并将部署中的内存增加到 300Mi。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2020-07-29
    • 2020-04-23
    • 1970-01-01
    • 2020-11-14
    • 2017-10-07
    相关资源
    最近更新 更多