当前位置: 首页 > web >正文

Kubernetes Dashboard 安装部署、访问与管理实战实验

本次实验旨在完成 Kubernetes Dashboard 的部署、配置及访问,掌握通过 Helm 安装 Dashboard、创建访问权限、配置端口转发及 NodePort 访问方式,并实现基于令牌的安全登录,最终通过 Web 界面管理 Kubernetes 集群资源。

实验环境

  • 单节点 Kubernetes 集群(master 节点)
  • 操作系统:CentOS/RHEL
  • Kubernetes 版本:v1.24+
  • Helm 版本:v3.12.3

Dashboard 是基于网页的 Kubernetes 用户界面。

你可以使用 Dashboard 将容器应用部署到Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源 (如 Deployment、Job、DaemonSet 等等)。 例如,你可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
Dashboard 同时展示了 Kubernetes 集群中的资源状态信息和所有报错信息。
https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/web-ui-dashboard/ 官方解释
 
Kubernetes Dashboard 目前仅支持基于 Helm 的安装,因为它速度更快, 并且可以让我们更好地控制
Dashboard 运行所需的所有依赖项。
https://cloud.tencent.com/developer/article/2497939  Kubernetes 包管理工具之 Helm 简介

注意:要在有k8s的虚拟机中完成

1.手动下载安装Helm (适用于内网/离线环境)

也可以使用官方脚本一键安装,二选一即可,我选择手动安装

# 官方脚本一键安装helm
# 原理:脚本会自动下载最新版本的 Helm 二进制文件并安装到系统路径。
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3  
chmod 700 get_helm.sh  
sudo ./get_helm.sh  
helm version
手动安装helm
# 下载wget工具
yum install -y wget# 下载 Helm v3.12.3(根据系统架构,如 `linux-amd64`,选择版本)
wget https://get.helm.sh/helm-v3.12.3-linux-amd64.tar.gz# 解压后将 `helm` 文件移动到系统 PATH 目录(如 `/usr/local/bin`)
tar -zxvf helm-v3.12.3-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm# 验证安装
helm version

 2.默认情况下不会部署 Dashboard,可以通过以下命令部署

# 进入目录
cd /etc/yum.repos.d/# 添加 kubernetes-dashboard 仓库
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/# 使用 kubernetes-dashboard Chart 部署名为 kubernetes-dashboard 的 Helm Release
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard# 多了一个命名空间kubernetes-dashboard
kubectl get namespaces# 查看kubernetes-dashboard 产生的pod
kubectl get pod -n kubernetes-dashboard# 查看service,其中 kubernetes-dashboard-kong-proxy 是我们访问的主要pod;
kubectl get svc -A

 

错误情况处理:

从输出来看,Kubernetes Dashboard 已经成功部署,但所有 Pod 都处于 Pending 状态,这表示它们无法被调度到节点上运行。 

 进行诊断,定位问题出现在哪,可以将以下命令的输出导入ai询问解决办法

# 检查 Pod 的 Pending 原因
kubectl describe pods -n kubernetes-dashboard重点关注 Events 部分的错误信息,常见原因包括:
资源不足(CPU/内存不够)。
节点选择器/污点不匹配。
PV/PVC 问题(如果 Dashboard 需要持久化存储)。# 检查节点资源状态
kubectl get nodes# 定位具体原因
kubectl describe pods
kubectl describe nodes

从你的诊断信息来看,Kubernetes Dashboard 的 Pod 处于 Pending 状态的主要原因是 节点调度问题。具体表现为:

核心问题分析

  1. 节点状态异常

    • master 节点:Ready,但有污点 node-role.kubernetes.io/control-plane:NoSchedule(默认不允许调度普通 Pod)。

    • node1 和 node2NotReady,且有污点 node.kubernetes.io/unreachable:NoSchedule(节点失联导致不可调度)。

  2. 调度失败的直接原因

    • 所有 Dashboard Pod 因节点污点无法调度到任何节点:

      0/3 nodes are available:
        1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: },
        2 node(s) had untolerated taint {node.kubernetes.io/unreachable: }.

由于本实验仅使用一台k8s的master节点的机子,可采用临时的解决办法,不需要将node1和node2变成ready,只需要临时允许 Pod 调度到 master

# 1. 删除 master 的 NoSchedule 污点
kubectl taint nodes master node-role.kubernetes.io/control-plane:NoSchedule-# 2. 重新部署 Dashboard(触发重新调度)
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \--namespace kubernetes-dashboard

 https://localhost:8443

验证修复结果

# 查看kubernetes-dashboard 产生的pod
kubectl get pod -n kubernetes-dashboard# 查看service,其中 kubernetes-dashboard-kong-proxy 是我们访问的主要pod;
kubectl get svc -A

 

3.访问 Dashboard 用户界面

访问方式原理优势常见问题
NodePort(10.1.1.85:30083)通过集群节点的物理端口访问,无需本地进程可远程访问防火墙限制、证书验证
端口转发(localhost:8443)通过 kubectl 进程将本地端口映射到集群 Service,仅本地可用无需开放节点防火墙进程终止、端口占用、浏览器限制
(1)执行如下指令:启动dashboard(本地开发访问方式)
# 启动命令进行端口转发
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443 --address 0.0.0.0  &kubectl 会使得 Dashboard 可以通过 [https://localhost:8443](https://localhost:8443/)
访问。
UI **只能**通过执行这条命令的机器进行访问。# 验证端口已绑定
ss -tulnp | grep 8443# 若返回 HTML 内容,说明端口转发正常
curl -k https://localhost:8443

 

此时正常情况可以通过访问Kubernetes 仪表板(本地访问)

注意:登录需要token,且token有时效性,获得令牌的步骤在下面

https://10.1.1.85:8443/

​ 

(2)创建 ServiceAccount 及ClusterRoleBinding角色绑定

K8S有两种用户:User 和 Service Account,User 给人用,Service Account 给进程用,让进程有相关权限,Dashboard 是一个进程,我们就可以创建一个Service Account 给它 

通过命令方式创建用户和绑定角色(也可以通过yaml 文件创建)

创建 ServiceAccount 和 ClusterRoleBinding(授予管理员权限)# 创建 ServiceAccount(管理员账户)
kubectl create serviceaccount admin01 -n kubernetes-dashboard# 绑定 ClusterRoleBinding(授予集群管理员权限)
kubectl create clusterrolebinding admin01 --clusterrole=cluster-admin \--serviceaccount=kubernetes-dashboard:admin01

(3)创建对应服务账号的token,我选择自定义token有效期为24h
生成访问令牌(Token)正常来说时间不用太长# 生成默认有效期(1小时)的令牌
kubectl -n kubernetes-dashboard create token admin01# 生成自定义有效期(24小时)的令牌
kubectl -n kubernetes-dashboard create token admin01 --duration 24heyJhbGciOiJSUzI1NiIsImtpZCI6ImxTR3lxNnE3UlI2em9qLUM0d3JMWHFOcG5MOUllWDZRY1ZYOU5MRGs3NTQifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzQ4NDIzMjk1LCJpYXQiOjE3NDgzMzY4OTUsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbjAxIiwidWlkIjoiNTM2ZjZjODYtMDQ1Mi00MTA2LTg4MzYtNmZkZDFlYzY4OTc3In19LCJuYmYiOjE3NDgzMzY4OTUsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbjAxIn0.Uh55Iqr1gWlcCXrEFMhQcB2gmNDSiqNkJPv4b_m7kQqKxL59sSOgPTNov4PCgrP9mmYgb-hahBarMJ0JRPelYPA3vFt20sT1MAQR3V-xNpRITUUkqEY3UZ_5D7UTSYjP9624r5-vsZ_cQj60Kfcm9zsmZTXD67nAX_MB8RtYBwWvg-fEcvRDYpSugTQz8TePmcGTFUyOxClGDby4n9N6SKFtoSJFaBJVa7neKeFE6DWA3L3Xlc1S9HObzbo2_BZct4LJnqHoIcjv2uQoRy2goiVJzuRU_fqnZaJkKjQDxmp8IBfkQScSpBQwECNvqeP3wLwPR34CshwjrBjzRMWneg
​ (4)修改端口类型,可以实现外部访问
修改 Service 类型为 NodePort(外部访问)# 修改 Service 类型为 NodePort
kubectl patch svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard \--type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"}]'# 指定固定 NodePort(例如 30083)
kubectl patch svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard \--type='json' -p '[{"op":"add","path":"/spec/ports/0/nodePort","value":30083}]'

测试访问:https://10.1.1.85:30083/

由于 Dashboard 使用的是自签名证书,浏览器会显示安全警告。不同浏览器的处理方式如下:

  • Chrome/Edge
    输入地址后可能会看到 “此站点不安全” 的提示,点击 “高级” → “继续前往 localhost(不安全)”
  • Firefox
    点击 “高级” → “接受风险并继续”
  • Safari
    可能需要先在 “系统偏好设置” → “安全性与隐私” 中允许访问该证书。

输入令牌点击登录 

出现以下页面即可

4. k8s dashboard 的基本使用

(1)点击pods,创建pod(三种方式)

直接编写yaml或json 文件;导入已经写好的yaml或json;通过表单创建

点击部署,刷新状态查看

点击对应的pod 能看到详细信息;类似与  kubectl describe  pod xx 

​ (2)pod具体操作——点击 如下图标,看看作用

1为查看日志

2为在pod中运行  

3为编辑资源 

4为删除资源 

5.扩展内容

(1)权限查询
role: 名称空间的系统权限
clusterrole:全局权限
(2)系统权限
查询某一个名称空间内的所有系统权限
kubectl -n kube-system get role
查询名称空间内的系统权限的详细信息
kubectl -n kube-system describe role kube-proxy


(3)全局权限
查看所有全局权限
kubectl -n kube-system get clusterrole


指定查看某一个权限的详细信息
kubectl -n kube-system describe clusterrole admin


(4)查看用户
kubectl get serviceaccounts  [用户名]  -n kubernetes-dashboard 

示例:

# 查询 kubernetes-dashboard 命名空间下的所有 ServiceAccount

kubectl get serviceaccounts -n kubernetes-dashboard

6.验证内容

  1. 部署验证

    • Dashboard 相关 Pod 均处于 Running 状态,包括 API、Auth、Kong 代理和 Web 组件
    • Service 配置正确,kubernetes-dashboard-kong-proxy 暴露目标端口
  2. 访问验证

    • 本地端口转发访问 https://localhost:8443 成功返回 Dashboard 页面
    • NodePort 方式访问 https://10.1.1.85:30083 可正常登录
    • 令牌验证通过,可进入集群管理界面
  3. 功能验证

    • 成功通过 Web 界面创建 Pod、查看资源状态
    • 实现 Pod 日志查看、在线编辑、删除等操作
    • 验证 RBAC 权限查询功能,可查看 Role、ClusterRole 及 ServiceAccount 信息

7.关键问题与解决方案

  1. Pod 调度失败

    • 原因:master 节点默认禁止调度普通 Pod(NoSchedule 污点)
    • 解决:移除污点 kubectl taint nodes master node-role.kubernetes.io/control-plane:NoSchedule-
  2. 端口占用问题

    • 原因port-forward 进程未正确终止导致端口残留
    • 解决:强制终止进程 pkill -9 -f "kubectl port-forward",重新启动转发
  3. 证书验证失败

    • 原因:自签名证书未被浏览器信任
    • 解决:Chrome 中输入 thisisunsafe 强制跳过,或导入证书到浏览器信任列表
  4. 令牌失效问题

    • 原因:默认令牌有效期仅 1 小时
    • 解决:使用 --duration 参数生成长期令牌(如 24h

本次实验完整实现了 Kubernetes Dashboard 的部署与访问,验证了从环境准备、组件部署、权限配置到界面操作的全流程。通过解决节点调度、端口占用、证书验证等典型问题,掌握了 Dashboard 在单节点集群中的实用部署方案。Dashboard 作为 Kubernetes 的图形化管理工具,有效降低了集群操作门槛,但其安全配置和性能优化仍需在实际应用中持续关注。

http://www.xdnf.cn/news/9586.html

相关文章:

  • 深入浅出Nacos:微服务架构中的服务发现与配置管理利器
  • 软件包管理系统的架构与生态机制
  • 【Pandas】pandas DataFrame between_time
  • Python 字典渲染字符串
  • 【 ai-safety-gridworlds】介绍和使用(未完)
  • 从零到一选择AI自动化平台:深度解析n8n、Dify与Coze
  • 通过阿里云服务发送邮件
  • 具身智能专题(2)-主从臂零位校准及摄像头数据获取与检验
  • XCTF-web-fileclude
  • IP地址基础知识
  • opengl - 在本地搭建API的文档说明网站
  • Zsh/Bash Conda设置延迟启动,启动速度优化
  • Vue之使用Vue-cli创建Webpack工程化项目
  • DDS通信中间件——DDS-TSN规范
  • 大模型-高通平台性能测试示例-2
  • Error Swap_arc198c分析与解答
  • docker容器间服务访问的问题
  • 最终章:终焉之塔 · 前端之道
  • WinServer2016安装Docker
  • ResizeObserver 解决 echarts渲染不出来,内容宽度为 0的问题
  • 无法发布到PowerBI?试试拆分它
  • 回头看,FPGA+RK3576方案的功耗性能优势
  • 设计模式-单例模式
  • 理解 C++ 多态:概念、实现方式与实战示例
  • 密钥管理系统在存储加密场景中的深度实践:以TDE透明加密守护文件服务器安全
  • VC++和python从哪一年开始支持split(字符串)非单个字符
  • 【深度学习-pytorch篇】1. Pytorch矩阵操作与DataSet创建
  • LiveGBS国标视频平台收流模式:UDP、TCP被动与TCP主动传输模式之差异剖析
  • 【系统架构设计师】2025年上半年真题论文回忆版: 论多模型数据库及应用(包括解题思路和参考素材)
  • python--=的用法