mysql - 从 minikube 访问在本地主机上运行的 mysql

标签 mysql kubernetes database-connection minikube

我在 minikube 中运行一些服务,并尝试连接到 3306 端口上运行在 localhost(127.0.0.1) 上的 mysql。

我读了this并尝试创建 serviceEndpoints。但是,当我将 127.0.0.1 指定为 IP 时,它会抛出如下错误:

端点“mysql-service”无效:子集[0].addresses[0].ip:无效值:“127.0.0.1”:可能不在环回范围内(127.0.0.0/8 )

我的部署如下:

---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  ports:
  - protocol: TCP
    port: 1443
    targetPort: mysql

---
apiVersion: v1
kind: Endpoints
metadata:
  name: mysql-service
subsets:
  - addresses:
    - ip: 127.0.0.1
    ports:
    - name: mysql
      port: 3306

请帮助我了解如何从 minikube 连接到 mysql 数据库。

我也尝试过用我电脑的公共(public) IP 替换 127.0.0.1(虽然不知道为什么)但连接超时。

感谢任何朝着正确方向提供的帮助或指导。

最佳答案

由于未提及操作系统和 minikube vm-driver,我假设它是 --vm-driver=virtualbox 因为它可能是最常见的情况。如果您使用不同的东西,则需要根据您的配置调整此解决方案。

说明:

127.0.0.1 是一个 localhost(lo0) 接口(interface) IP 地址。节点、主机和 Pod 有自己的本地主机接口(interface),并且它们之间没有连接。

您的 mysql-server 正在主机上运行,​​无法使用 localhost(或其 IP 范围)从 minikube 集群 pod 内部或从 minikube 内部访问虚拟机。

解决方案:

  1. 您应该在 minikube VM 和主机之间有一个网络。 Virtualbox 中的默认 NAT 网络对此不利,因此最好创建另一个仅供主机使用的网络。让我们create Virtualbox UI 中的附加仅主机网络,名称为 vmnet2,IP 范围为 192.168.77.1/24。您不需要为该网络启用 DHCP。

  2. 您必须将 mysql 配置为在默认情况下用于主机的接口(interface) vmnet2 或 ip 192.168.77.1 上监听。检查它是否可以从主机访问:

mysql -h 192.168.77.1 -u root -p 
  1. 要将此网络连接到 minikube 虚拟机,应使用 --host-only-cidr key 。为此,不同类型的 vm-driver 使用不同的 cli 选项。检查 minikube start --help 输出。因此,对于 virtualbox,它将如下所示:

    minikube start --cpus 2 \
                   --memory 2048 \
                   --disk-size 20g \
                   --vm-driver virtualbox \
                   --network-plugin flannel \
                   --kubernetes-version v1.12.2 \
                   --host-only-cidr 192.168.77.1/24
    

    为了方便起见,我编写了其他最常见的 cli 选项。

    MinikubeVM 将获得以下 IP 地址:192.168.77.100 ( at least the first time. ) 您可以使用 minikube ssh 检查它,然后使用 ifconfig 命令。

  2. 最后一部分 - 我们需要在 minikube 集群中为其创建服务和端点:

kubectl apply -f mysql-service.yaml

这是 mysql-service.yaml 文件的内容:

---
apiVersion: v1
kind: Service
metadata:
   name: mysql-service
spec:
   type: ClusterIP
   ports:
   - protocol: TCP
     port: 3306
     targetPort: 3306
---
apiVersion: v1
kind: Endpoints
metadata:
  name: mysql-service
subsets:
  - addresses:
      - ip: 192.168.77.1
    ports:
      - port: 3306
  1. 现在我们可以使用此集群的任何 pod 内的 mysql-service 名称和端口 3306 作为目标点。

关于mysql - 从 minikube 访问在本地主机上运行的 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55164223/

相关文章:

java - Spring Boot无法连接MySql

具有多个表和 SUMS 的 MySQL JOIN

MySQL 时间戳

MySQL 日期时间问题

c# - 读取 MySQL JSON 数据类型并将其转换为 C# 中的 List<Int>

java - c3p0 maxIdleTime 和 mysql 的 wait_timeout 一样吗?

kubernetes - 普罗米修斯数据源: client_error: client error: 403

logging - 是否可以对fluentd收集的kubernetes pod日志进行分类?

kubernetes - 如何在 Kubernetes 中使用 nginx-ingress 正确重定向

asp.net - 通过我的vip算法加密和解密web.config中的ConnectionSting