我正在尝试从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”,它无法解析主机名。
任何人都可以建议一个沮丧的新手?
这是因为您的服务类型是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
如果我没有弄错的话,你也应该为这项服务创建一个端点,因为它是外部的。
在您的情况下,端点定义应如下所示:
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文档上阅读有关外部资源的信息。
我正在使用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”
希望有道理。