首页 > 解决方案 > 访问 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

数据库服务.yaml

apiVersion: v1
kind: Service
metadata:
  name: service-database
spec:
  type: ExternalName
  externalName: host.minikube.internal
  ports:
    - port: 5432
      targetPort: 5432

吊舱部署.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环境变量指向SpringBootspring.datasource.url中的application.properties

然后当我试图打印日志时,我得到了这个异常:

Caused by: java.net.UnknownHostException: service-database

标签: postgresqlspring-bootkubernetesminikube

解决方案


我已经通过 minikube ssh 访问了 Minikube 集群中的 /etc/hosts 并返回

这可能是真的,但出于同样的原因,kubernetes 不会公开/etc/hosts其节点,minikube 也不会做同样的事情。Kubernetes 有自己的 DNS 解析器,因此有自己的想法/etc/hosts(docker 做同样的事情——它同样不只是暴露主机的/etc,而是允许用户在容器启动时自定义该行为)

有一种正式的机制可以告诉 kubernetes 您希望手动管理 DNS 解析端点——这就是无头服务所做的,尽管通常“手动”部分由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 记录


推荐阅读