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

时间:2018-06-20 15:46:09

标签: kubernetes minikube

我试图从minikube容器内部访问托管在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内部卷曲地址“ mysql-db-svc”,它将无法解析主机名。

有人可以建议沮丧的新手吗?

5 个答案:

答案 0 :(得分: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}:32002来访问MySQL服务,将{minikube ip}替换为实际的minikube ip。

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

minikube service <SERVICE_NAME> --url

用服务的实际名称替换。您的情况是mysql-db-svc

答案 1 :(得分: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文档上的外部资源的信息。

答案 2 :(得分:1)

我在Minikube上使用ubuntu,我的数据库在docker容器内的minikube外部运行,可以从本地主机@ 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”和“ svc”

希望如此。

答案 3 :(得分:0)

以上解决方案不知何故对我不起作用。最后它在 terraform 下面工作

resource "kubernetes_service" "host" {
    metadata {
        name = "minikube-host"

        labels = {
            app = "minikube-host"
        }

        namespace = "default"
    }

    spec {
        port {
            name = "app"
            port = 8082
        }
        cluster_ip = "None"
    }
}

resource "kubernetes_endpoints" "host" {
    metadata {
        name = "minikube-host"
        namespace = "default"
    }
    subset {
        address {
            // This ip comes from command: minikube ssh 'grep host.minikube.internal /etc/hosts | cut -f1'
            ip = "192.168.65.2"
        }

        port {
            name     = "app"
            port     = 8082
        }
    }
}

然后我可以在我的 mac 中使用主机 minikube-host.default.svc.cluster.local 从 k8s pod 访问本地服务(例如 postgres 或 mysql)。

可以在 issue 找到纯 yaml 文件版本和更多详细信息。

minikube 主机访问 host.minikube.internal 详细信息可以 be found here

另一方面,来自命令 minikube ssh 'grep host.minikube.internal /etc/hosts | cut -f1'(e.,g "192.168.65.2") 的原始 IP 地址可以直接用作服务主机,而不是代码中的 127.0.0.1/localhost。并且不再需要以上配置。

答案 4 :(得分:0)

我也遇到了类似的问题,我需要将 minikube 内的 POD 与机器上的 SQL Server 容器连接起来。

我注意到 minikube 本身就是本地 docker 环境中的一个容器,并且在设置过程中它会创建一个本地 docker 网络 minikube。我使用 minikube 将我的本地 SQL Server 容器连接到这个 docker network connect minikube <SQL Server Container Name> --ip=<any valid IP on the minikube network subent> docker 网络。

我现在可以使用 minikube 网络上的 IP 地址访问本地 SQL Server 容器。