跳转到内容

实战演练:Headlamp 仪表盘与 Helm 初体验

🌱 创建: 2026/04/12 ⏱️ 更新: 2026/05/22

在上一篇的基建狂魔行动中,我们打造了一个坚不可摧的底层网络。但这就像建好了一座摩天大楼,里面却全是毛坯房。今天,我们要给这座大楼装上一个极具赛博朋克风格的“总控监控室” —— Headlamp

在正式敲命令之前,我们需要先认识一下今天的主角和作案工具。

Headlamp 官方的定义是:“一个易于使用且可扩展的 Kubernetes Web UI”。

包工头大白话:如果你玩过 Docker,肯定知道 Portainer。Headlamp 就是 Kubernetes 界的 Portainer,但颜值更高、反应更快。传统的 K8s 官方 Dashboard 又老又丑,而 Headlamp 不仅能让你在网页上直观地查看、修改、删除集群里的所有资源,还支持极其强大的“插件(Plugins)”机制。 (注:Headlamp 官方也提供了可以直接下载到 Mac/Win 的桌面客户端,但为了未来我们能通过公网随时随地用手机或 iPad 查看集群,我们将采用 In-cluster (集群内网页版) 的部署方式。)

包工头大白话Helm 就是 Kubernetes 界的“App Store”或者你 Linux 里的 apt / yum

在 K8s 里部署一个复杂的应用,通常需要写几十上百行的 YAML 配置文件。Helm 把这些配置文件打包成了一个叫做 Chart 的压缩包。你只需要敲一行 helm install,它就会自动帮你把所有需要的东西(包括容器、权限、网络分配)一次性建好。


在赛博工地,官方图纸永远是最高指示。遇到任何第三方教程里没写过的玄学报错,直接去下面这些官方文档里翻,永远比在搜索引擎里瞎逛管用。


🔨 施工前置:配置包工头的对讲机 (安装 Helm)

Section titled “🔨 施工前置:配置包工头的对讲机 (安装 Helm)”

既然我们要用 Helm 来下载 Headlamp,首先得装好这个包管理工具。

关于这把“对讲机”到底放在哪里,你有两个选择,当然两个方案也可以都安装(包工头强烈推荐方案二):

方案一:把对讲机留在机房(在主控节点安装)

Section titled “方案一:把对讲机留在机房(在主控节点安装)”

如果你习惯在服务器上敲代码,直接登录你的 Master 01 节点(10.0.10.10),执行官方提供的一步到位安装脚本(直接上最新的 Helm 4):

Terminal window
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4 | bash

方案二:坐在办公室遥控(在本地电脑安装,强烈推荐!)

Section titled “方案二:坐在办公室遥控(在本地电脑安装,强烈推荐!)”

既然上一篇我们已经把集群的指挥权(Kubeconfig)复制到了你的个人电脑上,你完全可以直接在自己的 Mac 或 Windows 上安装 Helm,直接给远端的集群下达施工指令。

  • 如果你是 Mac 用户,直接用 Homebrew 一秒搞定:
    Terminal window
    brew install helm
  • 如果你是 Windows (使用 Scoop/Chocolatey) 或其他系统,官方贴心地准备了全平台的详细图纸,请查阅:👉 Helm 官方安装指南

🔍 验收对讲机: 无论你选了哪种方案,安装完成后,在你对应的终端里敲入:

Terminal window
helm version

如果能看到包含 v4.x.x(或 v3.x.x,取决于你本地包管理器的收录进度)的输出字样,说明我们的对讲机已配置就位。

🏗️ 核心施工:Headlamp 规范化部署 (GitOps 预备)

Section titled “🏗️ 核心施工:Headlamp 规范化部署 (GitOps 预备)”

我们不再使用零散的命令行参数,而是将配置全部“文件化”,方便未来无缝迁移到 ArgoCD。

  1. 编写 Helm 施工图纸 headlamp-values.yaml

    在本地或 Master 节点创建此文件:

    headlamp-values.yaml
    config:
    # 开启插件自动发现
    watchPlugins: true
    service:
    # 基础模式,对外不暴露
    type: ClusterIP
    port: 80
    # 资源限制:保证监控室在高压测试下不被杀死
    resources:
    requests:
    cpu: 100m
    memory: 128Mi
    limits:
    cpu: 500m
    memory: 512Mi
  2. 编写权限图纸 headlamp-admin.yaml

    定义“上帝通行证”。新版 K8s 不再自动生成永久 Token,我们直接手搓一张:

    headlamp-admin.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: headlamp-admin
    namespace: kube-system
    ---
    apiVersion: v1
    kind: Secret
    metadata:
    name: headlamp-admin-token
    namespace: kube-system
    annotations:
    kubernetes.io/service-account.name: headlamp-admin
    type: kubernetes.io/service-account-token
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
    name: headlamp-admin
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: cluster-admin
    subjects:
    - kind: ServiceAccount
    name: headlamp-admin
    namespace: kube-system
  3. 照图施工:执行安装

    Terminal window
    # 添加仓库并更新
    helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/
    helm repo update
    # 应用 Helm 配置
    helm install my-headlamp headlamp/headlamp \
    --namespace kube-system \
    --create-namespace \
    -f headlamp-values.yaml
    # 应用权限配置清单
    kubectl apply -f headlamp-admin.yaml
  4. 提取通行证密钥 (Token)

    Terminal window
    kubectl get secret headlamp-admin-token -n kube-system -o jsonpath="{.data.token}" | base64 -d && echo

    ⚠️ 赶紧复制终端里输出的这串无规则乱码备用!这就是你登录面板的唯一凭证。


🧪 Service 四大天王:全维度网络压测

Section titled “🧪 Service 四大天王:全维度网络压测”

现在 Headlamp 已经被包裹在 K8s 深处(ClusterIP)。接下来,我们要施展 Kubernetes 最核心的网络魔法,手写另外 3 个不同类型的 Service,加上原有的 1 个,从 4 个完全不同的维度去打通网络!

创建并应用 all-services.yaml 图纸:

# 1. 节点开洞 (NodePort) - 修复版
apiVersion: v1
kind: Service
metadata:
name: headlamp-nodeport
namespace: kube-system
spec:
type: NodePort
selector:
app.kubernetes.io/name: headlamp
app.kubernetes.io/instance: my-headlamp # 加上这个标签,定位更精准
ports:
- port: 80
targetPort: 4466 # ⚠️ 修复关键:指向真实的容器端口
nodePort: 32000
---
# 2. 榨干发牌员 (LoadBalancer) - 修复版
apiVersion: v1
kind: Service
metadata:
name: headlamp-loadbalancer
namespace: kube-system
spec:
type: LoadBalancer
selector:
app.kubernetes.io/name: headlamp
app.kubernetes.io/instance: my-headlamp
ports:
- port: 80
targetPort: 4466 # ⚠️ 修复关键:指向真实的容器端口
---
# 3. 赛博任意门 (ExternalName)
# 作用:让集群内部把 baidu.com 映射为 fake-headlamp-ext
apiVersion: v1
kind: Service
metadata:
name: fake-headlamp-ext
namespace: kube-system
spec:
type: ExternalName
externalName: baidu.com

执行应用:kubectl apply -f all-services.yaml

在开始压测前,请看下面的赛博流量拓扑图,直观理解这四大天王的流量走向:

🛡️ 维度一:ClusterIP (内网直通车)

Section titled “🛡️ 维度一:ClusterIP (内网直通车)”
  • 原理:只提供一个 10.61.x.x 的虚拟 IP,外部绝对无法访问。
  • 验收:我们在集群里拉起一个临时的“侦察兵”去探测它:
    Terminal window
    kubectl run -it --rm test-pod --image=curlimages/curl -- sh
    # 进入 Pod 后执行:
    curl -I http://my-headlamp.kube-system.svc.cluster.local
    (看到 HTTP/1.1 200 OK 说明内网 DNS 和 Cilium 基础路由完美!按 exit 退出)
  • 原理:在所有的物理宿主机上强行开一个 32000 端口。不论你访问哪台机器,Cilium 都会帮你把流量引到 Headlamp Pod 上。
  • 验收:打开你的浏览器,依次访问 http://10.0.10.10:32000http://10.0.10.20:32000(如果都能打开面板,说明 Cilium eBPF 的跨节点流量转发大成!)

🃏 维度三:LoadBalancer (榨干发牌员)

Section titled “🃏 维度三:LoadBalancer (榨干发牌员)”
  • 原理:最优雅的局域网暴露方式。直接向 Cilium L2 申请一个独立的内网 IP。
  • 验收:执行 kubectl get svc headlamp-loadbalancer -n kube-system(记下分配的 EXTERNAL-IP10.0.10.50,在浏览器直接访问 http://10.0.10.50。秒开说明二层 ARP 广播成功接管!)

🌀 维度四:ExternalName (赛博别名)

Section titled “🌀 维度四:ExternalName (赛博别名)”
  • 原理:很多人误以为它是用来对外暴露的,其实相反!它是把外网的地址拉进 K8s 内部,伪装成一个内部服务!
  • 验收:再次拉起内部侦察兵:
    Terminal window
    kubectl run -it --rm test-pod --image=curlimages/curl -- sh
    # 进入 Pod 后,我们查一下这个内部服务名的 DNS 指向:
    nslookup fake-headlamp-ext.kube-system.svc.cluster.local
    (你会惊奇地发现,K8s 的 DNS 直接返回了 baidu.com 的解析地址!这就是 ExternalName 的威力:让微服务调用外部数据库时,代码里只需要写内部服务名,无需修改代码即可随时切换外部真实地址。)

🚇 维度五:Port-Forward (战术地道)

Section titled “🚇 维度五:Port-Forward (战术地道)”
  • 原理:这是架构师的“终极保底神技”。它完全绕过底层的 Cilium 和 Service 暴露机制,直接借助 Kubernetes API Server,在你的本地电脑和集群内部的 Pod 之间挖一条加密的直连地道。
  • 验收:在你自己的电脑终端(配置了 Kubeconfig 的地方)执行:
    Terminal window
    kubectl port-forward -n kube-system service/my-headlamp 8080:80
    (终端会挂起并提示 Forwarding from 127.0.0.1:8080。此时,直接打开你电脑的浏览器访问 http://localhost:8080,面板秒开!测试完毕后,在终端按 Ctrl+C 即可销毁地道。这在网络彻底瘫痪、急需进后台排错时,是唯一能救命的招数。)

恭喜你完成了这场“一鱼四吃”的硬核网络压测!现在:

  1. 选一个你最喜欢的访问方式(建议用 LoadBalancer IP)在浏览器打开 Headlamp。
  2. 将你刚才提取的永久 Token 粘贴进去,点击 Authenticate

享受你的赛博总控室吧!在这里,你可以点开左侧的 Nodes 查看三台 Master 的状态,完全摆脱了令人头秃的命令行。