访问 K8S 仪表板的正确方法是啥?

Posted

技术标签:

【中文标题】访问 K8S 仪表板的正确方法是啥?【英文标题】:What is the correct way to access the K8S dashboard?访问 K8S 仪表板的正确方法是什么? 【发布时间】:2018-06-09 14:51:16 【问题描述】:

问题

不清楚如何使用 HTTPS 访问仪表板,也找不到清晰的文档(它只是告诉使用 kubectl 代理)。那么使用 HTTPS 访问仪表板的方法是什么?

Kubernetes Dashboard GitHub 告诉:

不推荐使用快捷方式http://localhost:8001/ui。使用上面显示的完整代理 URL。

K8S Dashboard Recommended Setup 或 K8S Dashboard FAQ 不告诉如何在没有代理的情况下访问仪表板。

我正在通过 HTTPS 访问仪表板 /ui 重定向对 HTTPS 不起作用的原因是它尚未在核心存储库中更新。您可以跟踪https://github.com/kubernetes/kubernetes/pull/53046#discussion_r145338754 以了解何时合并。可能要到 K8S 1.8.3+ 才能使用。 可用于访问仪表板的正确链接在我们的文档中。检查访问仪表板以了解更多信息。


但是,kubernetes-dashboard.yaml 清单将服务端点定义到仪表板,如下所示:

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

分配的集群IP(在我的环境中)如下。

# kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   ClusterIP   10.101.199.14   <none>        443/TCP         4h

只需创建一个到 10.101.199.14:443 的 SSH 隧道并访问它 (https://localhost:8001) 即可显示仪表板。

那么,基本上不需要使用kubectl代理直接访问clusterIP:443是用HTTPS访问dashboard的方式吗?

请建议哪里有关于如何使用 K8S 仪表板的最新且准确的文档。

环境

# kubectl version
Client Version: version.InfoMajor:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"
Server Version: version.InfoMajor:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T20:55:30Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"

【问题讨论】:

【参考方案1】:

据我所知,您不会希望将您的 k8s 仪表板暴露给外部世界,因为这是一种访问您的 k8s 集群的图形方式,这就是为什么 k8s-dashboard 的服务类型是 clusterIP 而不是 LoadBalancer 或 NodePort( Minikube 使用它)。

现在,如果您想访问仪表板而不将其暴露给外部世界。您在问题中描述了两种方式。

Kubectl 代理(它为 kube-api 服务器创建 HTTP 代理) Kubectl 端口转发(它为 k8s-dashboard pod 创建 TCP 代理)

【讨论】:

感谢您的更新。只能从强制***访问的内网进行访问,因此不会暴露给外部世界,但是我们必须使用HTTPS。 如果你可以使用内部LoadBalancer,那么你只需要在k8s-dashboard服务文件中使用type=LoadBalancer。它可能会解决问题。 谢谢苏雷什。由于我没有时间测试您的建议,请原谅我暂时不接受它作为答案。等我有时间再测试。 感谢 Suresh,在解决了 AWS 问题 ***.com/questions/48039953 之后,我可以使用 LoadBalancer 来公开服务。【参考方案2】:

由于没有时间测试 Suresh 的建议,暂时在下面使用。

获取 kubernetes-dashboard 服务帐户令牌(给定集群管理员角色)。

$ kubectl get secret -n kube-system | grep kubernetes-dashboard
kubernetes-dashboard-token-42b78                 kubernetes.io/service-account-token   3         1h

$ kubectl describe secret kubernetes-dashboard-token-42b78 -n kube-system
Name:         kubernetes-dashboard-token-42b78
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=kubernetes-dashboard
              kubernetes.io/service-account.uid=36347792-ecdf-11e7-9ca8-06bb783bb15c

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:    <TOKEN>

启动 SSH 隧道。

ssh -L localhost:8001:172.31.4.117:6443 centos@<K8SServer>

使用 Chrome ModHeader 扩展程序发送 Bearer 令牌。

通过 SSH 隧道(本地端口 8001)访问 API 服务器端点。

https://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy

【讨论】:

按照您的指示,收到了status-code 403 (forbidden) - 回复... @Markus 同样的情况。 @KarimManaouil:在我的例子中,web-dashboard 的容器创建卡住了,因为 coredns 容器在创建过程中也卡住了。解决问题后,我可以访问仪表板。我写下了解决方案here。 @Markus 感谢您的链接。在我的情况下,仪表板和 coredns 正在运行。实际上所有容器都运行良好(我使用 Kubespray 来设置集群)。我确保 clusterrolebinding 是正确的,它是正确的。对我来说,我收到 404 错误,找不到资源! @KarimManaouil:您是否尝试过将 url 中的 kube-system 更改为 kubernetes-dashboard?我的仪表板在不同的命名空间下运行【参考方案3】:

对于那些在创建过程中卡住 status-code 403coredns- 容器的人,请尝试为您的集群安装一个 pod 网络插件:

例如印花布:

kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml

来源:https://kubernetes.io/fr/docs/setup/independent/create-cluster-kubeadm/

【讨论】:

以上是关于访问 K8S 仪表板的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用来自浏览器的入口访问我在 k8s 集群上的 grafana 仪表板

Kubernetes 仪表板 - 如何锁定 8080 访问

远程访问 EC2 上的 Kubernetes 仪表板

在 Azure 中使用 .Net 为大数据创建实时仪表板的最有效方法是啥?

k8s仪表板:指标客户端健康检查失败

Kubernetes Dashboard 设置用户密码登陆