从minikube集群内部连接到本地数据库

问题描述 投票:5回答:3

我正在尝试从minikube pod中访问localhost上docker容器内托管的MySQL数据库,但收效甚微。我尝试了Minikube expose MySQL running on localhost as service描述的解决方案,但没有效果。我已经在我们在AWS上使用的服务建模了我的解决方案,但它似乎不适用于minikube。我的服务内容如下

apiVersion: v1

kind: Service

metadata: 

  name: mysql-db-svc

  namespace: external

spec: 
  type: ExternalName
  ExternalName: 172.17.0.2

...我尝试使用端口3306上的“mysql-db-svc”从pod内部连接到我的数据库,但无济于事。如果我尝试从pod内部CURL地址“mysql-db-svc”,它无法解析主机名。

任何人都可以建议一个沮丧的新手?

kubernetes minikube
3个回答
1
投票

这是因为您的服务类型是ExternalName,它只适用于AWS和GKE等云环境。要在本地运行您的服务,请将服务类型更改为NodePort,它将在30000-32767之间分配一个静态NodePort。如果您需要自己分配一个静态端口,以便minikube不会选择随机端口,您可以在端口部分的服务定义中定义该端口,如nodePort: 32002

而且我也没有在服务定义中看到任何指向MySQL部署的选择器。因此,在app: mysql-server部分的服务定义中包含相应的选择器密钥对(例如spec)。该选择器应与您在MySQL部署定义中定义的选择器匹配。

所以你的服务定义应该是这样的:

kind: Service
apiVersion: v1
metadata:
  name: mysql-db-svc
  namespace: external
spec:
  selector:
    app: mysql-server
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306
    nodePort: 32002
  type: NodePort

部署服务后,您可以通过http:// {minikube ip}命中MySQL服务:32002用实际的minikube ip替换{minikube ip}。

否则,您可以使用以下命令获取服务的访问URL

minikube service <SERVICE_NAME> --url

替换为服务的实际名称。在你的情况下,它是mysql-db-svc


1
投票

如果我没有弄错的话,你也应该为这项服务创建一个端点,因为它是外部的。

在您的情况下,端点定义应如下所示:

kind: "Endpoints"
apiVersion: "v1"
metadata:
  name: mysql-db-svc
  namespace: external
subsets: 
- addresses:
  - ip: "10.10.1.1"
  ports:
    port: 3306

您可以在Kubernetes Defining a service文档上阅读有关外部资源的信息。


1
投票

我正在使用ubuntu和Minikube,我的数据库在docker容器内的minikube之外运行,可以从localhost @ 172.17.0.2访问。我的外部mysql容器的Kubernetes服务如下:

kind: Service
apiVersion: v1
metadata:
  name: mysql-db-svc
  namespace: external
spec: 
  type: ExternalName
  externalName: 10.0.2.2

然后在我的.env项目中,我的DB_HOST被定义为

mysql-db-svc.external.svc

...服务名称“mysql-db-svc”后跟其名称空间“external”with“svc”

希望有道理。

© www.soinside.com 2019 - 2024. All rights reserved.