访问K8s Dashboard的几种方式

一. 背景知识

Kubernetes Dashboard 是 Kubernetes 的官方 Web UI. 通过Kubernetes Dashboard, 我们可以方便地管理资源和部署应用. 从 dashboard-1.7.x 起, 只允许 localhost 访问. 那么如何方便从本地访问dashboard呢? 本文介绍几种方案.

二. 安装

2.1 安装Dashboard

参考官方文档, 执行下面的命令可以快速安装dashboard v2.0.0:

kubectl apply -f "https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml"

以上文件在国内因为众所周知的原因可能无法正常下载. 简单的解决方案就是在 github 上打开 recommended.yaml, 然后复制代码保存到本地, 然后再执行:

kubectl apply -f ./recommended.yaml

输出类似于:

namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

查看状态:

$ kubectl get deployment --namespace=kubernetes-dashboard kubernetes-dashboard
# 或
$ kubectl describe deployment --namespace=kubernetes-dashboard kubernetes-dashboard

# 查看service
$ kubectl get service --namespace=kubernetes-dashboard kubernetes-dashboard

# 另外查看pod状态
$ kubectl --namespace=kubernetes-dashboard get pod -o wide | grep dashboard

$ kubectl --namespace=kubernetes-dashboard get pod -o wide | grep dashboard
# 输出
dashboard-metrics-scraper-6b4884c9d5-czx9f   1/1     Running             1          11h     10.244.0.12   ttg12   <none>           <none>
kubernetes-dashboard-7b544877d5-cd2b7        0/1     ContainerCreating   0          8m28s   <none>        ttg12   <none>           <none>

# 如果状态一直是, 使用describe查看具体过程
$ kubectl describe pod --namespace=kubernetes-dashboard
# 输出
...
Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned kubernetes-dashboard/kubernetes-dashboard-7b544877d5-cd2b7 to ttg12
  Normal  Pulling    9m36s      kubelet, ttg12     Pulling image "kubernetesui/dashboard:v2.0.0"

如果image一直pull不下来, 可以用dao先pull下来:

dao pull kubernetesui/dashboard:v2.0.0

如果 pod 状态都为 Running, 表示安装已经成功:

kubectl --namespace=kubernetes-dashboard get pod -o wide | grep dashboard

输出类似于:

dashboard-metrics-scraper-6b4884c9d5-czx9f   1/1     Running   1          11h   10.244.0.12   ttg12   <none>           <none>
kubernetes-dashboard-7b544877d5-cd2b7        1/1     Running   0          27m   10.244.0.14   ttg12   <none>           <none>

2.2 添加用户和 Token

Dashboard支持 KubeconfigToken 两种认证方式. 本文是Demo演示, 所以通过配置文件 dashboard-admin.yaml 为Dashboard默认用户赋予 admin 权限. 具体可参考官方文档.

2.2.1 添加用户和绑定角色

新建 dash-admin-user.yml:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

应用新建的配置:

$ kubectl apply -f dash-admin-user.yaml
# 输出
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

2.2.2 生成登录token

执行下面的命令, 生成登录用的token:

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

输出类似于:

get secret | grep admin-user | awk '{print $1}')ashboard describe secret $(kubectl -n kubernetes-dashboard g
Name:         admin-user-token-795sl
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: c628f987-abdc-4ef3-a237-ff47ec177a31

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6I.................f8zqqH7Q

最后这一行的token, 复制下来, 下一步登录要用.

三. 访问Dashboard

3.1 本地安装了 kubectl, 并且可以直接访问到 master 的 IP

如果本地(工作电脑)上安装了 kubectl, 并且可以直接访问到 master 的 IP, 那么就很简单, 可以直接在本地启动 k8s proxy:

# 前台启动, 注意会占用终端窗口
kubectl proxy

然后访问: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

3.2 本地没有安装 kubectl, 但是可以直接访问到 master 的 IP

如果本地没有安装 kubectl, 但是可以直接访问到 master 的 IP, 那么可以在 master (假设 hostname 为 ttg12, 当然也可以是集群内任意一台安装了 kubectl 的机器, 这里为了简便就简化到 master 上, 下同) 上开启 k8s proxy:

kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &

这时候我们可以访问到 Dashboard 的登录页面, http://ttg12:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/, 但是如果我们选择 "Token" 模式, 并输入上面记录的token, 点击"Sign in", 心里默数三下, 等待进入期待已久的主页面...

然后事实却是, 你数了10遍1-2-3, 页面还是没有任何反应.

于是你想到按下F12, 打开浏览器的调试窗口"Networking". 发现登录是登录成功了, 但是config接口却返回了状态401.
image.png

原因是, 即便 proxy 允许外网访问, 但是从 dashboard-1.7.x 起, 只允许 localhost 访问. Github 有人提过 issue, 但是回复说这是 feature, 不是 bug, 怪只怪初学者不懂的太多.

所以, 我们需要通过端口转发来访问localhost. 有如下2种方法.

3.2.1 方法一: kubectl port-forward

注意: 这种方法适合有正式ssl证书的情况. 如果没有, 先用方法二进行访问.

In an environment where one needs to access the dashboard from another host than the kubectl proxy's localhost, one can run: kubectl port-forward --namespace kubernetes-dashboard service/kubernetes-dashboard 10443:443 --address 0.0.0.0 to access the dashboard through HTTPS

然后访问: https://ttg12:10443.

不过因为测试环境没有正式的ssl证书, 所以浏览器会拒绝访问. 需要采用方法二.

3.2.2 方法二: ssh端口转发

在工作电脑(需要能 ssh 连接 k8s master)上, 使用以下命令转发端口:

$ ssh -L localhost:8001:localhost:8001 -NT faceless@ttg12
faceless@ttg12's password:

输入master机器faceless账号的登录密码后, 转发成功.

然后通过如下本地地址访问:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/.

终于见到 Dashboard 主页本尊.
image.png

3.3 本地没有安装 kubectl, 且不可直接访问到 master 的 IP

这种情况一般是 k8s 集群完全在内网, 日常访问通过跳板机进行, 这也是生产环境正常的状态. 这种情况下, 我们有2种方案.

3.3.1 在跳板机启动 kube-proxy, 然后本地 ssh 端口转发

首先在跳板机上启动 kube-proxy (假设跳板机的 hostname 是 ttg11):

kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &

然后本地 ssh 端口转发到跳板机:

ssh -L localhost:8001:localhost:8001 -NT weiping@ttg11

然后通过如下本地地址访问:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/.

3.3.2 本地直接通过跳板机 ssh 端口转发到 k8s master

首先在 k8s master (或内网上的其他机器) 上启动 kube-proxy (假定 k8s master的 hostname 是 ttg12):

kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &

然后本地端口通过跳板机 (假设跳板机的 hostname 是 ttg11) ssh 转发到 k8s master 上:

# 格式为: ssh -L localhost:<本地使用端口>:<k8s-master-IP或域名>:<k8s-master-port> -NT <跳板机登录账户>@<跳板机IP或域名>
ssh -L localhost:8001:ttg12:8001 -NT weiping@ttg11

然后通过如下本地地址访问:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/.

四. 参考

Valar Morghulis

86 声望
4 粉丝
0 条评论
推荐阅读
Seata 分布式事务系列二: Dubbo分布式事务
在前面一篇我们介绍了Seata 分布式事务系列一: Seata 服务端搭建.这一篇我们使用Seata 进行一个 Dubbo 微服务分布式事务的示例. 本示例包含 4 个项目:API Rest服务, 统一对外的业务模块, 这里示例一个购物服务 pu...

facelessman阅读 1.7k

Kubernetes v1.26 新特性一览
我每期的 「k8s生态周报」都有一个叫上游进展的部分,所以很多值得关注的内容在之前的文章中已经发过了。这篇中我会再额外介绍一些之前未涵盖的,和之前介绍过的值得关注的内容。

张晋涛2阅读 660评论 1

封面图
深入剖析容器网络和 iptables
Docker 能为我们提供很强大和灵活的网络能力,很大程度上要归功于与 iptables 的结合。在使用时,你可能没有太关注到 iptables 的作用,这是因为 Docker 已经帮我们自动完成了相关的配置。

张晋涛3阅读 1.3k

封面图
使用kubeasz部署高可用kubernetes集群
本实验采用kubeasz作为kubernetes环境部署工具,它是一个基于二进制方式部署和利用ansible-playbook实现自动化来快速部署高可用kubernetes集群的工具,详细介绍请查看kubeasz官方。本实验用到的所有虚拟机默认软...

李朝阳2阅读 462

Kubernetes 证书管理系列(一)
大家好,我是张晋涛。这是一个系列文章,将会通过七篇内容和大家一起聊聊 Kubernetes 中的证书管理。以下是内容概览:如上所示,在第一篇中,我们将从原理出发,来理解 Kubernetes 中的证书及其相关的作用,然后...

张晋涛2阅读 845

封面图
CodeGalaxy 推出轻量集群,可在云主机上一键搭建 K8s
CodeGalaxy 是 Swoole 官方推出的 ServerLess 平台,底层基于 Docker 和 K8s,帮助开发者更简单方便地管理云上的 Web 应用/服务。CodeGalaxy 是完全免费的,用户不需要付费即可使用。

韩天峰2阅读 438

vivo 云原生容器探索和落地实践
作者:vivo 互联网容器团队- Pan Liangbiao本文根据潘良彪老师在“2022 vivo开发者大会"现场演讲内容整理而成。公众号回复【2022 VDC】获取互联网技术分会场议题相关资料。

vivo互联网技术2阅读 681

Valar Morghulis

86 声望
4 粉丝
宣传栏