我试图从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”,它将无法解析主机名。
有人可以建议沮丧的新手吗?
答案 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 容器。