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.1
docker는 VM이 IP 주소의 포트를 노출하기 때문에 작동하지 않습니다.
둘째, kubernetes.docker.internal
pod 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 /all
Docker 데스크톱 VM에서 IP를 찾습니다.
hostAliases
podSpec에서 사용 하여 /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"
ExternalName
CoreDNS에서만 작동 하므로 서비스를 사용하지 마십시오 . 당신이 원하는 경우 ExternalName
서비스를 당신이 수정해야합니다 작동하는 CoreDNS
가에 대한 항목을 하드 코드하도록 설정을mypostgres.local
참고 : 또 다른 옵션은 Kubernetes에서 Postgresql을 실행하고 일반 ClusterIP 서비스를 사용하여 노출하는 것 입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다