我无法通过Docker桌面(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可以彼此通信,等等)。
我认为我的配置在这里不可用。
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
Spring Boot 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计算机上的文件。
我还假设您运行的Postgres5432
带有以下内容:
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
首先,127.0.0.1
它将无法正常工作,因为Docker仅在VM上公开IP地址上的端口。
其次,Kubernetes将无法找到,kubernetes.docker.internal
因为Pod用于CoreDNS
解析,并且不了解该域。
我建议你这样做:
不要使用kubernetes.docker.internal
它,因为docker已经将其用于自己的用途。使用类似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] 删除。
我来说两句