如何远程访问本地 kubernetes minikube 仪表板

Posted

技术标签:

【中文标题】如何远程访问本地 kubernetes minikube 仪表板【英文标题】:how to access local kubernetes minikube dashboard remotely 【发布时间】:2018-04-20 18:31:09 【问题描述】:

Kubernetes 新手(或者更确切地说是基本网络)问题: 使用 virtualbox 在我的局域网(IP 地址 192.168.0.20)上运行的 ubuntu 机器上安装了单节点 minikube(0.23 版本)。

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)

我想要做的是在同一个 LAN 中从我的 macbook(在 192.168.0.11 上运行)访问 minikube 仪表板。

我还想从 Internet 访问同一个 minikube 仪表板。

对于局域网访问: 现在据我了解,我正在使用 virtualbox(默认 vm 选项),我可以使用 vboxnet 命令更改网络类型(使用端口转发的 NAT)

VBoxManage modifyvm "VM name" --natpf1 "guestssh,tcp,,2222,,22"

如所列here

在我的情况下,它会是这样的

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

我的想法是否正确?

也可以远程访问同一个 minikube 仪表板地址,我可以设置一个 no-ip.com 之类的服务。他们要求在 linux 机器上安装他们的实用程序,并在路由器设置中设置端口转发,这将从主机端口转发到访客端口。这对吗?我在这里错过了什么吗?

【问题讨论】:

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

我可以通过以下简单的方式开始跑步:

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

【讨论】:

为什么需要使用--disable-filer=true 查看hao的答案以获得解释 hao 提供的文档链接已移动。命令kubectl proxy --help 显示以下内容: --disable-filter=false:如果为 true,则禁用代理中的请求过滤。这很危险,并且当与可访问端口一起使用时,可能会使您容易受到 XSRF 攻击。【参考方案2】:

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

    使用@Jeff 的脚本启动代理,默认情况下它将在“0.0.0.0:8001”上打开代理。

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

    通过以下链接访问仪表板:

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

更多详情请参考officially doc。

【讨论】:

我不确定这是否是最近的更改,但对我来说(使用 Minikube v1.12.1、Kubernetes v1.18.3)仪表板命名空间是 kubernetes-dashboard,因此 url 将使用:.. . /api/v1/namespaces/kubernetes-dashboard/services ... @Xeozim,根据您的 url,您的仪表板安装在命名空间 kubernetes-dashboard 但不是 kube-system @hao 我使用minikube dashboard 创建它,所以我认为这就是它现在的默认值? 和 Jeff 一样:为什么需要 --disable-filter=true 标志? 没有--disable-filter=true,你无法访问。到那时,您应该设置类似--accept-hosts=^192\.168 的内容以允许某些地址访问。【参考方案3】:

ssh 方式

假设您的 ubuntu 机器上有 ssh。

首先运行kubectl proxy & 以在http://localhost:8001 上显示仪表板

然后使用ssh的端口转发暴露dashboard,执行:

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

现在您应该从局域网中的 macbook 访问仪表板,将浏览器指向 http://192.168.0.20:30000

要从外部公开它,只需使用 no-ip.com 公开端口 30000,也可以将其更改为某个标准端口,例如 80。

请注意,这不是最简单的解决方案,但在某些地方没有超级用户权限也可以工作;) 您可以在重新启动 ubuntu 机器后使用初始化脚本并设置连接公钥来自动登录。

【讨论】:

你能充实这个答案吗?我在 Ubuntu 服务器主机上运行 kubectl proxy & 并在 Mac 上运行 ssh -R … 并连接到它,但访问 ubuntuServerHostLocalIp:30000 不起作用。我说的对吗? kubectlssh 应该在 Ubuntu 中运行,以便将 localhost:8001 路由到 192.168.0.20:3000(如果 192.168.0.20 是 ubuntu 框 IP 地址)。在这种情况下,您将打开一个内部端口作为同一台计算机上的一个开放端口。 (是的,您正在计算机内创建 ssh 连接,仅用于路由)更多关于 ssh 魔术here。这将是端口转发。 我最初误解了kubectl proxy,原来应该在他们想要查看仪表板的主机上运行它。也就是说,在主节点上运行时,SSH 代理确实是一种解决方案。 github.com/kubernetes/dashboard/issues/692 对我很有帮助。【参考方案4】:

我通过搜索关键字到达了这个网址:minikube 仪表板远程。 就我而言,minikube(及其仪表板)是远程运行的,我想从我的笔记本电脑上安全地访问它。

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

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

在 minikube 远程服务器上,运行这些:

minikube dashboard
kubectl proxy

在我的笔记本电脑上,运行这些(保持本地主机不变):

ssh -L 12345:localhost:8001 myLogin@myRemoteServer

然后仪表板在我的笔记本电脑上的这个 url 上可用:

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

【讨论】:

太棒了!很有魅力。谢谢! 我已经尝试了几十个答案,到目前为止,这个答案就像一个魅力!!! 8001是谁的端口?是来自容器还是虚拟机?【参考方案5】:

我最近遇到了同样的问题,解决方法如下:

    通过在bridge 网络模式下添加另一个网络适配器,将您的 minikube VM 连接到 LAN。对我来说,这是通过在 VirtualBox UI 中修改 minikube VM 并要求 VM 停止/启动来完成的。如果您使用的是 hyperkit,不确定这将如何工作。不要乱用 minikube 配置的默认网络适配器:minikube 依赖于这些。 https://github.com/kubernetes/minikube/issues/1471 如果您还没有安装 kubectl,请在您的 Mac 上安装:https://kubernetes.io/docs/tasks/tools/install-kubectl/

    将集群和相关配置添加到~/.kube/config,如下所示,修改服务器 IP 地址以匹配您新公开的 VM IP。如果需要,也可以修改名称。请注意,insecure-skip-tls-verify: true 是必需的,因为 minikube 生成的 https 证书仅对 VM 的内部 IP 地址有效。

    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
    

    从您的 linux minikube 主机复制配置中引用的 ~/.minikube/client.* 文件。这些是访问所需的安全密钥文件。

    设置您的 kubectl 上下文:kubectl config set-context mykubevm。此时,您的 minikube 集群应该可以访问(尝试kubectl cluster-info)。

    运行 kubectl proxy http://localhost:8000 以创建本地代理以访问仪表板。在浏览器中导航到该地址。

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

【讨论】:

对于这一行,“insecure-skip-tls-verify: true”,如果我还想使用验证怎么办?有什么解决方案可以让我根据新的 ip 重新生成 ca.crt 吗? 应该可以,但是您需要找到 minikube 私钥来创建新证书。我还没试过。【参考方案6】:

感谢您的宝贵回答,如果您必须使用无法永久查看的 kubectl proxy 命令,请使用 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

【讨论】:

【参考方案7】:

上述方法略有不同。

我有一个带有 NodePort 30003 的 http Web 服务。我通过运行使其在外部端口 80 上可用:

sudo ssh -v -i ~/.ssh/id_rsa -N -L 0.0.0.0:80:localhost:30003 $USER@$(hostname)

【讨论】:

【参考方案8】:

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 发行版中,在防火墙中打开端口的命令可能不同。请为此使用谷歌。

【讨论】:

【参考方案9】:

想通过 iamnat 链接这个答案。

https://***.com/a/40773822

    使用 minikube ip 在主机上获取您的 minikube ip 创建 NodePort 服务 您应该可以通过 : 访问配置的 NodePort id

如果我没记错的话,只要防火墙打开,这应该可以在 LAN 上运行。

【讨论】:

【参考方案10】:

出于学习目的,我使用 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

【讨论】:

以上是关于如何远程访问本地 kubernetes minikube 仪表板的主要内容,如果未能解决你的问题,请参考以下文章

在windows电脑上配置kubectl远程操作kubernetes

如何使用我的 IP 地址或本地 DN 在本地网络中访问我的 kubernetes 仪表板

远程访问运行在 kubernetes 中的 Kafka

使用 grafana 访问远程 kubernetes 集群

远程访问 EC2 上的 Kubernetes 仪表板

Service Mesh - gRPC 本地联调远程服务