Spring Boot를 통해 Docker Desktop Kubernetes (Windows) 서비스를 로컬 Postgres DB에 연결할 수 없습니다.

앤서니 팜

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.

로컬 DB에 연결을 시도 할 때까지 모든 것이 정상적으로 작동했습니다 (외부 클라이언트는 Ingress를 통해 포드에 연결할 수 있고 포드는 서로 통신 할 수 있음).

내 구성이 여기 어딘가에 있다고 생각합니다.

ConfigMap

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

내 호스트 파일에서 "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

스프링 부트 application.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}
리코

Docker가있는 Kubernetes는 동일한 Docker VM에서 실행되므로 /etc/hosts참조 하는 파일이 Windows 시스템에 있는 파일 이라고 가정합니다 .

또한 5432다음과 같이 노출 된 Postgres를 실행했다고 가정합니다 .

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

첫째, 127.0.0.1docker는 VM이 ​​IP 주소의 포트를 노출하기 때문에 작동하지 않습니다.

둘째, kubernetes.docker.internalpod CoreDNS가 해결에 사용 하고 해당 도메인에 대해 알지 하기 때문에 Kubernetes가 찾을 수 없습니다.

다음과 같이하는 것이 좋습니다.

  • kubernetes.docker.internal자체 목적으로 도커에서 이미 사용하고 있으므로 사용 하지 마십시오 . 다음과 같은 것을 사용하십시오.mypostgres.local

  • Docker VM의 IP 주소를 가져옵니다. 실행 ping docker.local하거나`C : \ Windows \ System32 \ drivers \ etc \ hosts에서 다음과 같은 내용을 찾습니다.

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

    또는 출력을보고 ipconfig /allDocker 데스크톱 VM에서 IP를 찾습니다.

  • hostAliasespodSpec에서 사용 하여 /etc/hosts파일이 실제로 pod에서 수정되도록합니다.

    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"
    
  • ExternalNameCoreDNS에서만 작동 하므로 서비스를 사용하지 마십시오 . 당신이 원하는 경우 ExternalName서비스를 당신이 수정해야합니다 작동하는 CoreDNS가에 대한 항목을 하드 코드하도록 설정을mypostgres.local

참고 : 또 다른 옵션은 Kubernetes에서 Postgresql을 실행하고 일반 ClusterIP 서비스를 사용하여 노출하는 것 입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관