如何解决在 Minikube 中访问本地 PostgreSQL 实例
我尝试以 pod 可以访问同一台机器内的 PostgreSQL 实例的方式配置我的 Minikube 集群有什么问题吗?
我已通过 /etc/hosts
访问 Minikube 集群中的 minikube ssh
并返回:
127.0.0.1 localhost
127.0.1.1 minikube
192.168.99.1 host.minikube.internal
192.168.99.110 control-plane.minikube.internal
database-service.yaml
apiVersion: v1
kind: Service
metadata:
name: service-database
spec:
type: ExternalName
externalName: host.minikube.internal
ports:
- port: 5432
targetPort: 5432
pod-deployment.yaml
apiVersion: apps/v1
kind: Deployment
spec:
...
template:
...
spec:
containers:
- name: <container_alias>
image: <container_name>
env:
- name: DB_URL
value: "jdbc:postgresql://service-database/<database_name>"
ports:
- containerPort: 8080
注意:DB_URL
环境变量指向 SpringBoot 中 spring.datasource.url
中的 application.properties
。
然后,当我尝试打印日志时,出现此异常:
Caused by: java.net.UnknownHostException: service-database
解决方法
我已经通过 minikube ssh 访问了 Minikube 集群中的 /etc/hosts 并返回
这可能是真的,但出于同样的原因,kubernetes 不会公开其节点的 /etc/hosts
,minikube 也不会做同样的事情。 Kubernetes 有自己的 DNS 解析器,因此它有自己的想法 /etc/hosts
中应该包含什么(docker 做同样的事情——它同样不仅公开主机的 /etc
,还允许用户自定义容器启动时的行为)
有一个正式的机制告诉 kubernetes 您希望手动管理 DNS 解析端点——这就是 a Headless Service 所做的,尽管通常“手动”部分是由StatefulSet
控制器,但没有什么可以阻止其他机制整理该列表:
apiVersion: v1
kind: Service
metadata:
name: service-database
spec:
type: ClusterIP
# yes,literally the word "None"
clusterIP: None
ports:
- name: 5432-5432
port: 5432
targetPort: 5432
---
apiVersion: v1
kind: Endpoints
metadata:
name: service-database
subsets:
- addresses:
- ip: 192.168.99.1
ports:
- name: 5432-5432
port: 5432
protocol: TCP
现在内部 DNS 会将 service-database
解析为答案 192.168.99.1
并像平常一样填充 SRV 记录