
一、Dashboard介绍
1. Kubernetes Dashboard概述
Kubernetes Dashboard是Kubernetes官方提供的Web图形化管理界面,替代纯命令行kubectl,可视化管理集群所有资源。能够直观查看和管理节点Pod、存储、服务等各类集群资源,支持日志查看、容器终端、应用扩缩容等运维操作。部署后通过Token认证登录,支持多种方式对外访问,降低k8s集群运维操作门槛。
2. 登录权限
Dashboard支持两种身份认证登录方式:Token令牌登录、kubeconfig文件认证。
2.1 Token令牌认证
先创建ServiceAccount服务账号,再根据运维权限范围,通过RoleBinding或ClusterRoleBinding将账号绑定对应Role/ClusterRole权限。随后提取该ServiceAccount管理Secret内的Token字符串,在Dashboard登录页面选择令牌登录,粘贴Token即可完成登录。
2.2 kubeconfig文件认证
将ServiceAccount对应Token信息封装写入kubeconfig配置文件,登录时直接上传该配置文件实现身份校验。
3. 安全风险
在企业正式生产集群环境中,运维人员通常采用账号密码、CA证书等具备完善权限管控与安全审计机制的方式接入Kubernetes集群,而Kubernetes Dashboard可视化面板仅支持两种登录凭证,分别为静态Token令牌与kubeconfig配置文件。
Token属于长期有效静态凭证,在浏览器页面存储、前后端网络传输过程中极易出现泄露风险,一旦令牌被窃取,攻击者可凭借该凭证获取对应服务账号的全部集群操作权限,带来集群资源篡改、业务数据泄露等严重安全隐患。
kubeconfig文件内置集群API地址、身份Token与CA证书,完整承载集群访问权限,若文件随意下载、本地留存、转发传输,极易出现文件外泄,攻击者拿到完整配置后可直接绕过管控接入集群,造成同等高危安全事故。
两类登录凭证均缺乏完善的动态失效、细粒度风控能力,整体安全防护薄弱,存在极高集群入侵风险。综合安全合规、权限管控、风险防控等多维度考量,生产环境不建议部署、对外开放并常态化使用Kubernetes Dashboard可视化面板,日常集群运维优先使用kubectl命令行、企业级统一容器运维平台等安全可控的操作途径。
二、Dashboard界面介绍
1. 界面结构
Kubernetes Dashboard可视化页面整体分为顶部操作栏、左侧导航菜单栏、中间内容展示区三部分:
顶部操作栏:可以用户切换命名空间、检索集群各类资源、创建资源、退出登录。
左侧导航菜单栏:集中管理集群各类资源,涵盖Cluster资源、Namespace资源。面板默认加载default命名空间,用户可通过顶部操作栏自由切换目标命名空间。
中间内容展示区:作为资源详情载体,当在左侧导航选中某一类资源后,该区域会同步展示该资源下全部实例及配套详细信息。

2. 切换Namespace
[Step1] 在顶部操作栏中点击Namespace下拉框,选中指定Namespace,即可看到该Namespace下所有的资源情况。


3. Overview
[Step1] 集群管理员与命名空间管理员可以通过Dashboard查看节点、命名空间、持久化存储卷三类核心资源,并调度各资源的详细可视化页面。节点列表页展示集群全部节点的Node、内存实时资源占用指标。节点详情页呈现节点运行指标、硬件配置规格、已分配资源配额等信息。

4. Workload(工作负载)
[Step1] 页面会展示当前选定命名空间内,所有基于工作负载类型(如Deployments、ReplicaSets等)部署的业务应用,各类工作负载支持分类独立查看。


[Step2] Workload的详细视图显示了对象的状态、规格信息以及各个对象之间的关系。

5. Config and Storage(配置与存储)
[Step1] Config and Storage用于可视化管理当前命名空间下所有配置、存储资源,包含ConfigMap、Secret、PVC、StorageClass四类资源。


三、Dashboard安装与管理
1. 安装Dashboard
如果无法正常拉取资源,可以访问我的百度云链接进行下载后导入。
Dashboard组件包链接: https://pan.baidu.com/s/15wHn56QbNr7Tk78IFcADSQ?pwd=6jvf
提取码: 6jvf
[Step1] 下载官方提供的YAML清单文件,下载后修改关于镜像的拉取策略,默认情况下dashboard的镜像拉取策略为Always,无论本地有无镜像,每次启动都远程拉取镜像。为了避免因为网络问题导致无法拉取镜像,这里已提前导入到工作节点,因此需要修改镜像拉取策略为IfNotPresent。
root@k8s-master:~# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
root@k8s-master:~# vim recommended.yaml
# 修改下列内容
imagePullPolicy: IfNotPresent
[Step2] 使用官方提供的YAML清单文件一键部署Dashboard所需的全部资源,包含命名空间、Deployment、Service、RBAC等。
root@k8s-master:~# kubectl create -f recommended.yaml
[Step3] 验证:查看命名空间是否创建成功,Dashboard资源默认部署在kubernetes-dashboard命名空间。
root@k8s-master:~# kubectl get ns | grep dashboard
[Step4] 验证:查看kubernetes-dashboard命名空间内的Pod运行状态,能够看到两个Pod均为Running状态。kubernetes-dashboard提供Web可视化管理界面,dashboard-metrics-scraper负责采集集群监控指标供面板展示。
root@k8s-master:~# kubectl get -n kubernetes-dashboard pods
[Step5] 验证:查看后端服务端点信息,服务类型为ClusterIP,仅集群内部可访问。
root@k8s-master:~# kubectl get service -n kubernetes-dashboard
[Step6] 如果需要在集群外访问Dashboard,需要修改Service类型,将默认的ClusterIP修改为NodePort。
root@k8s-master:~# kubectl edit service -n kubernetes-dashboard kubernetes-dashboard
# 修改下列内容
type: NodePort
[Step7] 验证:查看kubernetes-dashboard命名空间下所有Service服务资源信息,可以看到kubernetes-dashboard已修改为NodePort。
root@k8s-master:~# kubectl get service -n kubernetes-dashboard
[Step8] 验证:此时可以通过节点IP+NodePort分配的端口号访问Kubernetes Dashboard。
https://192.168.8.3:30212/
2. Token方式登录Dashboard
采用Token方式登录Dashboard,需要依次创建ServiceAccount服务账号,绑定ClusterRoleBinding,最后提取账号关联Secret内的令牌完成登录。
[Step1] 本地新建YAML清单,定义ServiceAccount资源描述模板。
root@k8s-master:~# vim dashboard-service-account.yml
# 写入下列内容
apiVersion: v1 # 固定配置
kind: ServiceAccount # 资源类型
metadata:
name: token-dashboard
namespace: kubernetes-dashboard # 命名空间需和Dashboard相同[Step2] 基于YAML清单向Kubernetes集群声明式地创建ServiceAccount资源。
root@k8s-master:~# kubectl create -f dashboard-service-account.yml[Step3] 验证:基于文件内定义的资源清单,查询集群中该资源的运行状态与基础信息。
root@k8s-master:~# kubectl get -f dashboard-service-account.yml
[Step4] 本地新建YAML清单,定义ClusterRoleBinding资源描述模板。
root@k8s-master:~# vim dashboard-cluster-role-binding.yml
# 写入下列内容
apiVersion: rbac.authorization.k8s.io/v1 # 版本信息
kind: ClusterRoleBinding # 资源类型
metadata:
name: token-dashboard-cluster-admin
roleRef:
apiGroup: rbac.authorization.k8s.io # RBAC授权组
kind: ClusterRole # 引用ClusterRole
name: cluster-admin # 关联角色cluster-admin(超级管理员)
subjects: # 主体
- kind: ServiceAccount # 主体类型为ServiceAccount
name: token-dashboard # 服务账号名称
namespace: kubernetes-dashboard # 命名空间,需要和Dashboard同一命名空间[Step5] 基于YAML清单向Kubernetes集群声明式地创建ClusterRoleBinding资源。
root@k8s-master:~# kubectl create -f dashboard-cluster-role-binding.yml[Step6] 验证:基于文件内定义的资源清单,查询集群中该资源的运行状态与基础信息。
root@k8s-master:~# kubectl get -f dashboard-cluster-role-binding.yml
[Step7] 本地新建YAML清单,定义Secret资源描述模板。
root@k8s-master:~# vim dashboard-secret.yml
# 写入下列内容
apiVersion: v1 # 版本信息
kind: Secret # 资源类型
metadata:
name: token-dashboard-secret
namespace: kubernetes-dashboard
annotations: # 资源注解,用于添加自定义标识信息
# 绑定名为"token-dashboard"的ServiceAccount,该Secret会自动生成对应服务账号的Token
kubernetes.io/service-account.name: "token-dashboard"
# 指定Secret类型为服务账号令牌类型,k8s会自动生成并存储Base64编码的登录Token
type: kubernetes.io/service-account-token[Step8] 基于YAML清单向Kubernetes集群声明式地创建Secret资源。
root@k8s-master:~# kubectl create -f dashboard-secret.yml[Step9] 验证:基于文件内定义的资源清单,查询集群中该资源的运行状态与基础信息。
root@k8s-master:~# kubectl get -f dashboard-secret.yml[Step10] 查询kubernetes-dashboard命名空间内的token-dashboard-secret,提取并解码Token。
root@k8s-master:~# kubectl get secrets token-dashboard-secret \
> -n kubernetes-dashboard \
> -o jsonpath={".data.token"} | base64 -d
[Step11] 访问Kubernetes Dashboard网页,输入Token即可登录。

3. kubeconfig方式登录Dashboard
[Step1] 使用命令创建ServiceAccount,指定命名空间为kubernetes-dashboard。
root@k8s-master:~# kubectl create serviceaccount kubeconfig-dashboard -n kubernetes-dashboard[Step2] 创建集群角色绑定,将kubernetes-dashboard命名空间下kubeconfig-dashboard服务账号授予集群管理员全部权限。
root@k8s-master:~# kubectl create clusterrolebinding kubeconfig-dashboard-cluster-admin \
> --clusterrole=cluster-admin \
> --serviceaccount=kubernetes-dashboard:kubeconfig-dashboard[Step3] 本地新建YAML清单,定义Secret资源描述模板。
root@k8s-master:~# vim kubeconfig-dashboard-secret.yml
# 写入下列内容
apiVersion: v1 # 版本信息
kind: Secret # 资源类型
metadata:
name: kubeconfig-dashboard-secret
namespace: kubernetes-dashboard
annotations: # 资源注解,用于添加自定义标识信息
# 绑定名为"kubeconfig-dashboard"的ServiceAccount,该Secret会自动生成对应服务账号的Token
kubernetes.io/service-account.name: "kubeconfig-dashboard"
# 指定Secret类型为服务账号令牌类型,k8s会自动生成并存储Base64编码的登录Token
type: kubernetes.io/service-account-token[Step4] 基于YAML清单向Kubernetes集群声明式地创建Secret资源。
root@k8s-master:~# kubectl create -f kubeconfig-dashboard-secret.yml[Step5] 验证:基于文件内定义的资源清单,查询集群中该资源的运行状态与基础信息。
root@k8s-master:~# kubectl get -f kubeconfig-dashboard-secret.yml
[Step6] 查询kubernetes-dashboard命名空间内的kubeconfig-dashboard-secret,提取并解码Token。
root@k8s-master:~# kubectl get secrets kubeconfig-dashboard-secret \
> -n kubernetes-dashboard \
> -o jsonpath={".data.token"} | base64 -d
[Step7] 在本地kubeconfig配置文件中创建名为k8s-dashboard的集群配置,定义集群API服务地址为Master节点6443端口HTTPS地址,并加载集群根CA证书用于API服务身份验证。
root@k8s-master:~# kubectl config set-cluster k8s-dashboard --server=https://192.168.8.3:6443 \
> --certificate-authority=/etc/kubernetes/pki/ca.crtkubectl config:操作/修改本地“~/.kube/config”集群配置文件,管理集群地址、证书、用户等上下文连接信息。
set-cluster:新增/修改一条集群信息配置项。
k8s-dashboard:自定义集群名称,后续上下文会通过该名称关联此集群。
--server=https://192.168.8.3:6443:指定Kubernetes APIServer访问地址
192.168.8.3:控制平面主节点的IP
6443:Kubernetes APIServer默认标准端口
--certificate-authority=/etc/kubernetes/pki/ca.crt:集群根CA证书路径
[Step8] 在kubeconfig配置中创建名为dashboard-admin的用户,将提前解码好的Dashboard管理员Token设置为该用户的登录身份凭证。
root@k8s-master:~# kubectl config set-credentials dashboard-admin --token="输入Token"
[Step9] 在kubeconfig中新建上下文dashboard-context,管理集群k8s-cluster与管理员凭证dashboard-admin,实现集群地址和登录账户的绑定。
root@k8s-master:~# kubectl config set-context dashboard-context \
> --cluster=k8s-dashboard \
> --user=dashboard-adminset-context dashboard-context:创建一条上下文,名为dashboard-context
--cluster=k8s-dashboard:绑定上述定义的集群配置
--user=dashboard-admin:绑定上述创建的用户
[Step10] 切换当前使用的集群登录上下文,后续所有kubectl指令都会采用该上下文绑定的集群地址和用户凭证访问k8s集群。
root@k8s-master:~# kubectl config use-context dashboard-context[Step11] 导出独立的kubeconfig文件,用于后续浏览器登录使用。
root@k8s-master:~# kubectl config view --minify --flatten > kubeconfig.yamlkubectl config view:查看当前kubeconfig的完整内容
--minify:仅保留当前正在使用的上下文对应的集群、用户、证书信息,过滤无关配置
--flatten:将证书、Token等外部文件内容直接嵌入到输出文本,不再引用本地文件路径。
[Step12] 验证:将生成的文件下载到本地,在Dashboard登录页中选择“kubeconfig文件”后上传登录。


4. 设置中文
[Step1] 在菜单栏中往下滑,点击“Settings”,然后在最底下选择简体中文。


四、Dashboard的增删改查
1. 创建容器化应用
[Step1] 点击右上角的加号创建容器化应用,后续创建的容器化应用需要和当前选择的命名空间一致。

[Step2] 此时一共有三种新建方式,分别是YAML文件、上传文件、表单创建。这里我们基于busybox创建一个Deployment,名为dashboard-deployment,命名空间指定为kubernetes-dashboard。
apiVersion: apps/v1
kind: Deployment
metadata:
name: dashboard-deployment
labels:
app: dashboard
spec:
replicas: 2
selector:
matchLabels:
app: dashboard
template:
metadata:
labels:
app: dashboard
spec:
containers:
- name: dash-pod
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["sleep","1000"]
[Step3] 可以在左侧“工作负载-Deployments”中查看到我们创建Deployment。

2. 查询容器化应用信息
[Step1] 在右侧菜单栏中点击“Deployment”,然后点击“dashboard-deployment”,即可查看详细信息。



[Step2] 通过看容器化应用的日志进行故障排查。


3. 修改容器化应用
[Step1] 修改Kubernetes集群资源,如Deployments、Jobs、DaemonSets等。对上述创建的Deployment进行扩容,将Pod数量修改为5个。


[Step2] 稍微等待一会,即可看到Deployment扩容至5个Pod。

[Step3] 也可以对Kubernetes集群资源进行编辑,效果等同于“kubectl apply -f xxx.yml”命令。


4. 删除容器化应用
[Step1] 对不使用或有问题的Kubernetes集群资源进行删除,释放资源。

五、Dashboard部署应用
Dashboard部署应用其实就创建Kubernetes集群中的第三种方式:Create from form(表单创建)。
1. 必填项
1.1 App name
资源名称必须在当前选定命名空间内保持唯一,命名规则约束:名称首尾字符仅允许小写英文字母,中间内容仅可使用小写字母、数字与短横线“-”。整体字符长度上限为24位,输入时首尾多余空格会自动剔除。系统会将该名称作为标签值,为Replication Controller与Service自动创建对应标签。同时为部署Deployment和Service附加键为“app”,值为该名称的标签。
1.2 Container image
容器镜像来源可选用镜像仓库Registry中的公有镜像或托管在DockerHub、GoogleContainerRegistry的私有镜像,填写镜像地址时,镜像标识格式必须携带版本号冒号后缀。
若集群无法连通外部镜像仓库、计划使用本地已缓存镜像时,面板新建容器的镜像拉取策略默认固定为“Always”且创建阶段无法调整;该策略会强制每次启动Pod都从远端仓库拉取镜像,一旦网络不通就会出现拉取失败、Pod无法正常运行的故障。
该限制仅能在Pod资源创建完成后,手动编辑Pod配置,将镜像拉取策略修改为“IfNotPresent”,优先使用本地存量镜像规避网络拉取异常问题。
1.3 Number of pods
用于指定应用部署的目标Pod实例数,参数取值要求为大于0的正整数。
2. 选填项(Services)
Service分为外部服务与内部服务两类,无论创建哪一类Service,均需要配置容器监听端口参数(Service端口Port与容器目标端口targetPort)。
Service会将外部访问端口映射至容器内部业务端口,并自动为已部署Pod配置访问路由。通信协议支持TCP、UDP两种,同时会以填写的应用名称作为Service集群内部DNS域名。
外部Service:适用于前端需要对外提供访问的业务组件,可分配集群公网IP地址,通过开放指定端口将服务暴露至集群外部网络。
内部Service:仅允许集群内部Pod相互访问,外部网络无法连通该服务资源。

3. 高级选项
3.1 列出高级选项
高级选项默认不显示,需要点击“Show advanced options”展开。

3.2 Description
此处输入的文本将作为注释添加到部署中,并在应用程序的详细信息中显示。
3.3 Labels
支持自定义新增附加标签,如发布版本、运行环境标识等,自定义标签将同步绑定至Replication Controller、Service、Pod资源对象中。

3.4 Namespace
下拉列表中会展示当前集群内所有可用Namespace,同时支持新建Namespace。命名空间名称仅允许使用小写字母、数字和短横线“-”,字符长度上限为63位。如果命名空间创建成功,系统会自动切换至该命名空间。如果创建失败,则默认选中下拉列表中第一项。
3.5 Image Pull Secret
如果采用私有Docker容器镜像,拉取镜像时需要配置镜像拉取密钥Pull Secret完成身份校验。
Dashboard会展示集群内全部可用Secret资源,同时支持新建Secret。
Secret名称必须遵循DNS域名格式规范,如“my.image-pull.secret”,字符长度上限为253。
Secret内部存储内容需要经过Base64编码,数据格式与“.dockercfg”配置文件规范保持一致。
3.6 CPU requirement(cores)和Memory requirement(MiB)
为容器设置最低资源配额,系统默认状态下,Pod在运行时不会配置CPU、内存资源约束,无资源预留与上限限制。
3.7 Run command和Run arguments
容器默认会采用Docker镜像内置的入口指令启动运行,用户可通过自定义启动命令与参数覆盖原有入口配置,该配置逻辑类似资源YAML文件中的“command”与“args”字段。
3.8 Run as privileged
该配置项用于控制特权容器内进程的权限等级,开启特权模式后,容器内部进程将等同于宿主机上以root身份运行的进程,具备操控主机网络协议栈、访问底层硬件设备等高权限操作能力。
3.9 Environment variables
Kubernetes会自动将集群内Service信息注入容器环境变量,用户可直接引用环境变量值配置应用环境参数,或是将其作为启动命令入参传入;借助这类环境变量,业务程序能够实现集群内Service的自动寻址。配置时可采用“$(VAR_NAME)”语法,引用已定义的其他环境变量完成参数拼接。
4. 部署应用
[Step1] 基于busybox创建一个Deployment,名为dashboard-app,命名空间指定为kubernetes-dashboard。

[Step2] 部署busybox容器需要配置持续运行的常驻指令,展开高级配置面板,在对应输入框填写运行命令与参数。

[Step3] 当前集群无法连通外网镜像仓库,而Dashboard新建容器时镜像拉取策略默认固定为Always,该策略会强制每次启动Pod都从远端仓库拉取镜像,最终因网络不通触发镜像拉取失败报错。

[Step4] 手动编辑该Deployment,将镜像拉取策略修改为“IfNotPresent”。


[Step5] 对该Deployment执行滚动重启操作,分批重建Pod。重启过程中保留原有镜像、配置、资源参数,仅刷新容器运行实例,服务不会出现完全中断。


[Step6] 等待滚动重启结束后,能够看到Deployment正常运行。

[Step7] 通过查询Deployment关联的资源日志,可查看该工作负载执行滚动重启过程产生的完整操作记录,清晰追踪滚动重建Pod、版本切换等执行流程。
