如何将在minikube上部署的服务(Experssjs Api)暴露给同一网络中的其他设备以便访问?

52次阅读
没有评论

问题描述

在本地机器上使用minikube创建了一个服务(expressjs API),通过使用minikube service wedeliverapi --url命令启动服务后,可以在浏览器中使用localhost:port/api访问该服务。用户希望能够从其他设备访问该服务,以便在Flutter移动应用程序中使用该API。用户想知道如何实现这个目标。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

一种简单的方法是在您的机器外部使用代理。您可以使用Apache或类似的HA、Nginx等工具来实现代理。
以下是使用Nginx设置反向代理的详细步骤:
1. 在您的Windows机器上安装Nginx。
2. 打开Nginx的配置文件(通常位于/etc/nginx/nginx.conf)。
3. 在配置文件中添加以下内容:

server {
    listen       80;
    server_name  localhost;
    location / {
        proxy_pass http://localhost:port/api/;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
  1. 保存并关闭配置文件。
  2. 启动Nginx服务。
  3. 现在,您应该能够从其他设备访问您的API服务。

请注意,上述步骤中的port应替换为您API服务实际使用的端口号。

方案2

请注意以下操作注意版本差异及修改前做好备份。
另一种方法是使用Kubernetes的NodePortIngress来将minikube服务外部暴露出来。
对于minikube,主机和minikube VM之间还有一个网络层。您需要在主机和VM之间启用端口转发。要将整个默认的minikube NodePort范围转发到主机,请执行以下命令:

for port in {30000..32767}; do VBoxManage controlvm minikube natpf1 "NodePort$port,tcp,,$port,,$port"; done

当您完成后,要禁用端口转发,请执行以下命令:

for port in {30000..32767}; do VBoxManage controlvm minikube natpf1 delete "NodePort$port"; done

请注意,上述命令中的端口范围{30000..32767}是minikube默认的NodePort范围。如果您在minikube中使用了不同的范围,请相应地修改命令。

使用上述方法,您应该能够将minikube服务外部暴露给同一网络中的其他设备。

方案3

请注意以下操作注意版本差异及修改前做好备份。
如果您使用的是minikube--driver选项,请根据具体情况选择合适的方法。以下是使用--driver=none选项的方法:
1. 预先安装cri-docker服务,例如在Ubuntu 20上执行以下命令:

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpgecho "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.listsudo apt-get update -ysudo apt-get install -y kubelet kubeadm kubectlsudo apt-mark hold kubelet kubeadm kubectlwget https://github.com/Mirantis/cri-dockerd/releases/download/v${VER}/cri-dockerd-${VER}.amd64.tgztar xvf cri-dockerd-${VER}.amd64.tgzsudo mv cri-dockerd/cri-dockerd /usr/local/bin/tar xvf cri-dockerd-${VER}.amd64.tgzsudo mv cri-dockerd/cri-dockerd /usr/bin/wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.servicewget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socketsudo mv cri-docker.socket cri-docker.service /etc/systemd/system/sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.servicesudo systemctl daemon-reloadsudo systemctl enable cri-docker.servicesudo systemctl start cri-docker.socket
  1. 启动minikube,例如:minikube start --driver=none --container-runtime=docker,并检查minikube的IP地址。
  2. 部署您的应用程序,启动服务。
  3. 暴露服务。
  4. 启动Ingress(如上所述,使用minikube addons enable ingress命令)。
  5. 现在,您应该能够从外部访问它。

请注意,上述步骤中的具体命令可能因您的操作系统和minikube配置而有所不同。

以上是几种将minikube服务暴露给同一网络中的其他设备的方法。您可以根据您的具体需求选择适合您的方法。

正文完