如何远程访问本地的Kubernetes minikube仪表板?

43
Kubernetes新手(或者说是基础网络)问题: 在我的局域网上的Ubuntu盒子上安装了单节点minikube(0.23版本),使用VirtualBox,并且运行在IP地址192.168.0.20上。
minikube start命令也成功完成了。
minikube start
Starting local Kubernetes v1.8.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.

minikube仪表板也成功启动(运行在192.168.99.100:30000)。
我想做的是从我的MacBook(运行在192.168.0.11)在同一局域网中访问minikube仪表板。
同时,我还想从互联网访问相同的minikube仪表板。
对于局域网访问
现在据我所了解,我正在使用VirtualBox(默认的虚拟机选项),我可以使用vboxnet命令更改网络类型(到NAT并进行端口转发)。
VBoxManage modifyvm "VM name" --natpf1 "guestssh,tcp,,2222,,22"

如下所列 这里

在我的情况下会是这样的

VBoxManage modifyvm "VM name" --natpf1 "guesthttp,http,,30000,,8080"

我在这方面的思路是正确的吗?

另外,为了远程访问相同的minikube仪表板地址,我可以设置一个类似no-ip.com的服务。他们要求在Linux主机上安装他们的实用程序,并在路由器设置中设置端口转发,将主机端口转发到客户端端口。

这样对吗?我有什么遗漏吗?


1
我正在寻找这个问题的答案,如果您成功设置了它但忘记自我回答,请重新访问。 - Tomáš Hübelbauer
我尝试了kubectl proxy并将localhost替换为运行minikube的主机的本地网络IP,但似乎它没有在所有接口上侦听,只有在本地主机上。我不在该主机上运行图形界面,因此我真的希望能够从外部访问它。 - Tomáš Hübelbauer
10个回答

71

我能够使用简单的东西运行起来:

kubectl proxy --address='0.0.0.0' --disable-filter=true

1
为什么需要使用 --disable-filer=true - Murmel
请参考hao的答案进行解释。 - mit
1
文档链接已经移动,hao提供的。命令 kubectl proxy --help 显示如下内容:--disable-filter=false: 如果为 true,则在代理中禁用请求过滤器。这是危险的,如果与可访问端口一起使用,可能会使您容易受到 XSRF 攻击的威胁。 - Keehl

41

@Jeff提供了完美的答案,可以为新手提供更多提示。

  1. 使用@Jeff的脚本启动代理,它默认会在'0.0.0.0:8001'上打开一个代理。

    kubectl proxy --address='0.0.0.0' --disable-filter=true
    
  2. 通过以下链接访问仪表板:

    curl http://your_api_server_ip:8001/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/
    
请参考官方文档获取更多详细信息。

2
我不确定这是否是最近的更改,但对于我来说(使用Minikube v1.12.1,Kubernetes v1.18.3),仪表板命名空间是kubernetes-dashboard,因此URL将使用:.../api/v1/namespaces/kubernetes-dashboard/services... - Xeozim
1
@Xeozim,根据您的URL,您的仪表板是安装在命名空间kubernetes-dashboard下而不是kube-system下。 - hao
@hao 我使用了 minikube dashboard 来创建它,所以我认为这是默认设置? - Xeozim
和Jeff一样:为什么你需要使用--disable-filter=true标志? - Murmel
2
如果没有使用 --disable-filter=true,您将无法访问。在这种情况下,您应该设置类似于 --accept-hosts=^192\.168 的内容,以允许某些地址进行访问。 - Jess Chen
保留过滤器的设置,您可以使用 --accept-hosts='35.246.xx.xx' 并指定 GCE VM 实例的外部 IP。这里是外部的,因为 kube-proxy 通过 CE 堡垒主机进行通信。 - Dr. Alexander

39

我使用搜索关键词minikube dashboard remote访问了这个URL。 在我的情况下,minikube(和它的控制面板)是在远程运行的,我想从我的笔记本安全地访问它。

[my laptop] --ssh--> [remote server with minikube]

根据gmiretti的回答,我的解决方案是本地转发ssh隧道:

在minikube远程服务器上,运行以下命令:

minikube dashboard
kubectl proxy

并且在我的笔记本电脑上,运行这些程序(保留 localhost 不变):

ssh -L 12345:localhost:8001 myLogin@myRemoteServer

仪表板现在可通过我的笔记本电脑上的此URL访问:

http://localhost:12345/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/


3
太棒了!运行得很好。谢谢! - MeanwhileInHell
3
我尝试了数十个答案,到目前为止这一个像魔法一样有效!!! - Luchao Qi
8001端口是谁的?是容器还是虚拟机? - Caterina
端口8001是虚拟机上的端口。应该在防火墙中打开,以便能够使用上述命令工作。 - PravyNandas
minikube仪表板 --端口8001 - peyman
我创建了一个名为“天才回答”的书签文件夹,并将这个添加进去了,谢谢。 :-) - undefined

27

SSH的方式

假设在您的Ubuntu上安装了SSH。

首先运行kubectl proxy &以在http://localhost:8001上公开控制面板。

然后使用ssh的端口转发公开仪表板,执行:

ssh -R 30000:127.0.0.1:8001 $USER@192.168.0.20

现在,您可以从局域网中的Macbook上指向浏览器并访问仪表板,URL为http://192.168.0.20:30000

要从外部公开它,只需使用no-ip.com公开端口30000,可能将其更改为一些标准端口,如80。

请注意,这不是最简单的解决方案,但在某些地方可以在没有超级用户权限的情况下工作;您可以使用启动脚本自动登录Ubuntu盒子并设置公共密钥以进行连接。


能否请您详细说明一下?我在Ubuntu Server主机上运行了 kubectl proxy &,并在Mac上运行了 ssh -R … 并与其连接成功,但访问 {ubuntuServerHostLocalIp}:30000 却无法生效。这样正确吗? - Tomáš Hübelbauer
1
kubectlssh应在Ubuntu中运行,以便将localhost:8001路由到192.168.0.20:3000(如果192.168.0.20是Ubuntu框的IP地址)。在这种情况下,您正在将内部端口作为同一计算机上的开放端口打开。(是的,您正在计算机内部创建一个ssh连接,仅用于路由)有关ssh魔法的更多信息,请单击此处。这将是端口转发。 - Gabriel Miretti aka gmiretti
1
我最初误解了 kubectl proxy,结果发现应该在想要查看仪表板的主机上运行它。也就是说,在主节点上运行时,SSH代理确实是一种解决方案。https://github.com/kubernetes/dashboard/issues/692 对我非常有帮助。 - Tomáš Hübelbauer

8

我最近也遇到了同样的问题,并按照以下方法解决:

  1. Get your minikube VM onto the LAN by adding another network adapter in bridge network mode. For me, this was done through modifying the minikube VM in the VirtualBox UI and required VM stop/start. Not sure how this would work if you're using hyperkit. Don't muck with the default network adapters configured by minikube: minikube depends on these. https://github.com/kubernetes/minikube/issues/1471
  2. If you haven't already, install kubectl on your mac: https://kubernetes.io/docs/tasks/tools/install-kubectl/
  3. Add a cluster and associated config to the ~/.kube/config as below, modifying the server IP address to match your newly exposed VM IP. Names can also be modified if desired. Note that the insecure-skip-tls-verify: true is needed because the https certificate generated by minikube is only valid for the internal IP addresses of the VM.

    clusters:
    - cluster:
        insecure-skip-tls-verify: true
        server: https://192.168.0.101:8443
      name: mykubevm
    contexts:
    - context:
        cluster: mykubevm
        user: kubeuser
      name: mykubevm
    users:
    - name: kubeuser
      user:
        client-certificate: /Users/myname/.minikube/client.crt
        client-key: /Users/myname/.minikube/client.key
    
  4. Copy the ~/.minikube/client.* files referenced in the config from your linux minikube host. These are the security key files required for access.

  5. Set your kubectl context: kubectl config set-context mykubevm. At this point, your minikube cluster should be accessible (try kubectl cluster-info).

  6. Run kubectl proxy http://localhost:8000 to create a local proxy for access to the dashboard. Navigate to that address in your browser.

你也可以通过ssh连接到minikube虚拟机。复制ssh密钥对从~/.minikube/machines/minikube/id_rsa*到你的.ssh目录(重命名以避免覆盖其他密钥,例如mykubevm & mykubevm.pub)。然后执行ssh -i ~/.ssh/mykubevm docker@<kubevm-IP>


对于这行代码中的"insecure-skip-tls-verify: true",如果我仍然想要使用验证,有没有解决方案可以基于新的IP重新生成ca.crt呢? - MarcuX
1
这应该是可能的,但你需要找到minikube的私钥来创建一个新的证书。我还没有尝试过。 - AndyB

3

非常感谢您宝贵的回答。如果您必须使用kubectl代理命令无法永久查看,请使用下面的YAML文件中的“服务”对象,能够远程查看直到停止它。创建一个新的yaml文件minikube-dashboard.yaml,并手动编写代码,不建议复制粘贴。

apiVersion : v1
kind: Service
metadata:
  labels:
    app: kubernetes-dashboard
  name: kubernetes-dashboard-test
  namespace: kube-system
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 9090
    nodePort: 30000
  selector:
    app: kubernetes-dashboard
  type: NodePort

执行以下命令:
$ sudo kubectl apply -f minikube-dashboard.yaml

最后,打开以下网址:http://your-public-ip-address:30000/#!/persistentvolume?namespace=default


1
稍有不同的方法如下所述。 我有一个带有NodePort 30003的HTTP Web服务。 我通过运行以下命令将其在外部端口80上提供:
sudo ssh -v -i ~/.ssh/id_rsa -N -L 0.0.0.0:80:localhost:30003 ${USER}@$(hostname)

1

Jeff Prouty提供了有用的答案:

我能够运行以下简单命令:

kubectl proxy --address='0.0.0.0' --disable-filter=true

但最初对我来说不起作用。

我在运行kubectl的CentOS 7机器上运行此命令(本地IP:192.168.0.20)。

当我尝试从另一台计算机(显然在局域网中)访问仪表板时:

http://192.168.0.20:8001/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy/

那时,唯一的问题是我的网络浏览器超时。

对于我的情况,解决方案是在CentOS 7(以及可能其他发行版)中需要在操作系统防火墙中打开端口8001

所以,在我的情况下,我需要在CentOS 7终端中运行:

 sudo firewall-cmd --zone=public --add-port=8001/tcp --permanent
 sudo firewall-cmd --reload

之后。它工作了! :)

当然,你需要意识到这不是一个安全的解决方案,因为任何人现在都可以访问你的仪表盘。但我认为对于本地实验室测试而言,这已经足够了。

在其他Linux发行版中,打开防火墙端口的命令可能会有所不同。请使用谷歌进行搜索。


0

仅供学习目的,我使用了nginx proxy_pass解决了这个问题。例如,如果仪表板绑定到一个端口,比如43587。那么我的本地URL就是

http://127.0.0.1:43587/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

然后我安装了nginx并进入了开箱即用的配置文件。
sudo nano /etc/nginx/sites-available/default

并编辑位置指令,使其看起来像这样:

    location / {
        proxy_set_header Host "localhost";
        proxy_pass http://127.0.0.1:43587;
    }

然后我做了

sudo service nginx restart

然后仪表板可以从外部访问:

http://my_server_ip/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/cronjob?namespace=default

0

想要链接iamnat的这个答案。

https://dev59.com/0lkR5IYBdhLWcg3w1wch#40773822

  1. 使用 minikube ip 命令在主机上获取 minikube 的 IP 地址
  2. 创建 NodePort 服务
  3. 你应该能够通过 < minikubeip >:< nodeport > 访问配置的 NodePort ID

只要防火墙开放,这应该在局域网中也可以工作,如果我没记错的话。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接