
Kubernetes Dashboard 不想裸奔Headlamp 本地管理集群用 cpolar 临时给同事看只读面板有些 K8s 问题自己在终端里kubectl get pod -A看半天同事一句“我能不能也看一下页面”就尴尬了。给 kubeconfig太危险。把 Kubernetes API Server 暴露出去更别想。给一个 cluster-admin Token这基本等于把测试集群钥匙递出去了。这篇就按更稳的方式来本地 k3s、minikube 或测试 Kubernetes 集群里跑 Headlamp只用它看 Namespace、Pod、Service 和日志需要协作验收时用低权限 ServiceAccount 登录再用 cpolar 短时开放 Headlamp 面板。划重点这里开放的是 Headlamp 的临时 Web 入口不是 Kubernetes API Server也不是 kubeconfig。1 什么是 Headlamp这篇里它负责看集群状态Headlamp 是 Kubernetes SIG UI 下的一个 Kubernetes Web UI官方定位很直接既可以部署到集群里也可以作为桌面应用本地使用。这篇不把它当“生产集群运维平台”来写只用它解决一个很常见的小场景测试集群跑起来后需要有人远程看一眼资源状态、Pod 日志和 Service 信息。Headlamp 比较适合这个场景是因为它会跟 Kubernetes RBAC 结合。你用什么权限的 Token 登录它就按什么权限展示和操作。只读账号看不到或点不了的东西就不会因为页面好看而突然变成管理员。不过这也带来一个提醒不要偷懒直接用cluster-admin。官方文档里为了演示会给 admin 示例但我们做协作验收时应该换成只读或低权限账号。2 环境准备先有一个本地测试集群这篇默认你已经有一个本地或测试用 Kubernetes 集群k3s、minikube、kind 都可以。不要拿生产集群直接做演示入口尤其不要为了方便把公网访问、管理员 Token、真实业务 Namespace 混在一起。先确认当前 kubectl 能连上集群kubectl cluster-info kubectl get nodes kubectl get ns能看到节点和 Namespace就说明本机 kubeconfig 已经指向目标集群。如果你用的是 minikube可以先启动一个本地集群minikube start kubectl get nodes如果你用的是 k3s通常 kubeconfig 在服务器上需要确认本机kubectl已经能正常访问测试集群。这里别把生产 kubeconfig 拿来顺手演示后面同事看的页面也会基于这套集群状态。建议先创建一个专门演示用的 Namespace后面页面里更清楚kubectl create namespace demo-headlamp kubectl -n demo-headlamp create deployment nginx-demo --imagenginx:1.27 kubectl -n demo-headlamp expose deployment nginx-demo --port80 --target-port80 kubectl -n demo-headlamp get pod,svc这一步不是为了凑命令而是让 Headlamp 打开后有东西可看Namespace、Deployment、Pod、Service 都能对上。3 安装 Headlamp部署到测试集群里Headlamp 官方提供 Helm Chart也提供简单 YAML。这里用 Helm回滚和清理都更顺手。helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/ helm repo update helm upgrade --install my-headlamp headlamp/headlamp --namespace kube-system --create-namespace装完先看 Pod 和 Servicekubectl -n kube-system get pods,svc | grep -i headlamp正常情况下能看到 Headlamp 的 Pod 处于 RunningService 也已经创建出来。如果 Pod 一直不是 Running先看事件和日志不要急着开公网入口kubectl -n kube-system describe pod -l app.kubernetes.io/nameheadlamp kubectl -n kube-system logs -l app.kubernetes.io/nameheadlamp --tail100这一步做完你已经有了集群内的 Headlamp 服务但它还没有对外开放。我们先用kubectl port-forward在本机访问确认页面和登录都正常。HEADLAMP_SVC$(kubectl -n kube-system get svc -l app.kubernetes.io/nameheadlamp -o jsonpath{.items[0].metadata.name}) echo Headlamp service: ${HEADLAMP_SVC} kubectl -n kube-system port-forward svc/${HEADLAMP_SVC} 8080:80终端保持不要关浏览器打开http://127.0.0.1:8080看到 Headlamp 登录页就对了。如果打不开优先检查三件事Headlamp Pod 是否 Running、Service 名字是否取到、8080 端口有没有被本机其他程序占用。4 创建只读 Token只看资源不给管理员钥匙现在到了最容易犯错的一步。很多人为了快会直接创建cluster-admin账号然后把 Token 发给同事。这在测试环境也不推荐因为页面里一旦具备写权限误删 Deployment、改 Service、查看敏感资源都挡不住。这里我们创建一个专门给 Headlamp 验收用的 ServiceAccount并绑定自定义只读 ClusterRole。它能看 Namespace、Pod、Service、Deployment、ReplicaSet、事件和 Pod 日志但不授予创建、修改、删除权限也不开放 Secret 读取。新建文件headlamp-readonly-rbac.yamlapiVersion: v1 kind: ServiceAccount metadata: name: headlamp-readonly namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: headlamp-readonly rules: - apiGroups: [] resources: [namespaces, pods, services, endpoints, events, nodes] verbs: [get, list, watch] - apiGroups: [] resources: [pods/log] verbs: [get] - apiGroups: [apps] resources: [deployments, replicasets, statefulsets, daemonsets] verbs: [get, list, watch] - apiGroups: [batch] resources: [jobs, cronjobs] verbs: [get, list, watch] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: headlamp-readonly roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: headlamp-readonly subjects: - kind: ServiceAccount name: headlamp-readonly namespace: kube-system应用它kubectl apply -f headlamp-readonly-rbac.yaml生成登录 Headlamp 用的 Tokenkubectl -n kube-system create token headlamp-readonly --duration2h把输出的 Token 复制到 Headlamp 登录页。这里建议设置一个短一点的有效期比如 2 小时刚好够同事看页面、验收问题、截图反馈。如果登录后资源列表为空先别怀疑 Headlamp。用下面的命令验证权限kubectl auth can-i list pods --all-namespaces --assystem:serviceaccount:kube-system:headlamp-readonly kubectl auth can-i get pods/log --namespace demo-headlamp --assystem:serviceaccount:kube-system:headlamp-readonly kubectl auth can-i delete pods --namespace demo-headlamp --assystem:serviceaccount:kube-system:headlamp-readonly前两条应该返回yes最后一条应该返回no。这才是我们要的协作边界能看不能乱改。5 在 Headlamp 里检查 Namespace、Pod、Service 和日志登录后先看左侧资源菜单不要急着把链接发出去。自己先走一遍验收路径避免同事打开后只看到空页面。建议按这个顺序看Namespaces确认能看到demo-headlamp。Pods确认nginx-demo对应 Pod 是 Running。Services确认nginx-demoService 存在端口是 80。Logs进入 Pod 详情页看日志入口是否能打开。这一步的目的不是为了测试而测试而是确认“页面展示、RBAC 权限、日志读取”这条链路已经打通。如果 Namespace 能看到但日志打不开多半是pods/log权限没配对。回头检查 ClusterRole 里有没有这一段- apiGroups: [] resources: [pods/log] verbs: [get]如果页面里出现删除、编辑等高风险按钮也要停下来检查登录 Token。优先核对当前登录的是否是管理员 kubeconfig 或 cluster-admin Token。6 用 cpolar 短时 HTTPS 给同事看 Headlamp本机http://127.0.0.1:8080只能自己看。现在要给远程同事临时验收就用 cpolar 建一个 HTTP 隧道指向本机 8080。注意这里映射的是 Headlamp 面板端口不是 Kubernetes API Server 的6443也不是任何 kubeconfig 文件。如果还没安装 cpolar可以从官网下载安装官网https://www.cpolar.com/下载页https://www.cpolar.com/download文档https://www.cpolar.com/docs/Linux 可以使用官方一键安装脚本curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bashmacOS 可以用 Homebrewbrew tap probezy/core brew install cpolar sudo cpolar service install sudo cpolar service start安装后打开本地控制台http://127.0.0.1:9200登录账号纯命令行环境也可以使用后台里的 Authtoken 手动绑定cpolar authtoken xxxxx确认 Headlamp 的 port-forward 还在运行后新开一个终端cpolar http 8080cpolar 会生成一个公网 HTTPS 地址。把这个地址发给同事再把前面生成的只读 Token 通过团队内部安全渠道单独发送不要把链接和 Token 一起丢到公开群里。免费随机地址适合临时演示官方规则里随机公网地址会在 24 小时内变化。如果后续要固定地址可以再看固定二级子域名方案但这篇的建议很明确K8s 面板验收按需开启验收完就关不要长期挂在公网。7 安全边界这几条别省K8s 面板一旦能被远程打开安全边界就要写在前面而不是出事后补救。这套方案里我建议坚持下面几条不暴露 Kubernetes API Server不映射6443。不发送 kubeconfig不把本机管理员凭据交给别人。不给cluster-admin只用测试或低权限 ServiceAccount。不长期公网开放 Headlamp验收结束就关闭 cpolar 和 port-forward。不在页面里展示生产 Secret、真实业务数据和敏感 Namespace。关闭临时入口很简单停掉两个前台进程就行# 关闭 cpolar http 8080 所在终端进程Ctrl C # 关闭 kubectl port-forward 所在终端进程Ctrl C验收结束后也可以清理只读账号和演示应用kubectl delete -f headlamp-readonly-rbac.yaml kubectl delete namespace demo-headlamp helm uninstall my-headlamp --namespace kube-system如果只是下一轮还要继续演示可以保留 Headlamp但建议重新生成短时 Token。别把旧 Token 当长期密码用。8 总结现在这条链路已经比较清楚了本地 k3s、minikube 或测试 Kubernetes 集群里部署 Headlamp用只读 ServiceAccount 登录查看资源状态需要同事远程协作时只把 Headlamp 面板通过 cpolar 短时开放出去。关键步骤就三件事Headlamp 只负责看 Namespace、Pod、Service 和日志不替代完整运维平台。登录账号用低权限 ServiceAccount验证list pods是 yes、delete pods是 no。cpolar 只映射本机 Headlamp 页面端口验收结束立刻关闭临时入口。如果你只是自己在局域网里排查问题cpolar 这一步可以先跳过如果需要远程同事一起看页面它就很适合做短时 HTTPS 入口。重点不是“把 K8s 面板放到公网”而是在不暴露 API Server、不交出 kubeconfig、不授予管理员权限的前提下把一次协作验收做完。