☰
Kubeapps实战:Kubernetes中Helm Release的Web可视化交付与运维
2026/10/21 13:42:30 网站建设 项目流程

1. 为什么我最终选择了Kubeapps作为Helm的Web UI管理方案

先说背景。我们团队内部维护着好几个Kubernetes集群,环境从测试到生产一应俱全。早期大家习惯了用helm install命令行敲命令,一套流程倒也跑得通。可一旦环境多了、服务多了、参与的同学也不再局限于一开始的那两三个人,问题就开始冒出来了——新同学要上手Helm,首先要啃一遍命令行文档;排查一个Release的状态,要在终端里反复切换上下文;想看看当前集群到底部署了哪些Chart、版本号是多少、有没有更新可用的,光靠helm list加helm search一个个敲,效率实在太低。

所以我开始留意Helm生态里的Web UI方案。市面上围绕Kubernetes的图形化管理工具不算少,有偏向集群资源管理的,也有偏向应用交付的。Kubeapps是其中比较特别的一个,它是专门冲着Helm来的:把Chart搜索、安装、升级、回滚、Release状态查看这些操作全部搬到了浏览器里。我当时的想法很简单——既然团队内部已经有一批非K8s专业背景的同事需要参与应用发布,与其逼着他们学命令行,不如铺一套界面化的工具,把Helm操作的认知门槛降下来。

实际用下来,Kubeapps确实解决了我们最痛的点。它本身不替代Helm,也不替代Kubernetes的权限体系,而是把Helm的常用操作翻译成了图形界面里的一次点击。平时我们用Helm命令行能完成的事情,在Kubeapps里基本都能找到对应的操作入口,而且它严格走Kubernetes自身的RBAC权限控制,和原有权限体系天然打通。这篇文章就围绕Kubeapps的部署方法、工作原理、核心功能以及我实际使用中踩过的坑展开,分享给和我一样想给团队铺一套Helm图形化管理界面的朋友。

2. 理解Kubeapps的工作原理:Chart仓库、Helm Release与权限模型

在动手安装之前,我建议先花十分钟搞清楚Kubeapps在Kubernetes集群里扮演的角色。否则后面配置起来很容易感觉是在照着文档盲敲,出了问题也不知道从哪个环节查起。

2.1 Kubeapps到底在Kubernetes里做了什么

Kubeapps不是一个独立的Helm实现,它是Helm的“前端翻译官”。它本身以一组Pod的形式运行在Kubernetes集群内部,访问你配置好的Chart仓库(比如Bitnami官方仓库、Harbor里自建的Chart仓库等),读取可用的Chart列表和版本信息。当你在界面上点击“安装”某个Chart时,Kubeapps会调用集群内的Helm运行时组件去执行一次标准的Helm install操作,最终结果就是生成一个Helm Release记录,这个Release和相关资源照常由Kubernetes集群管理。

换句话说,Kubeapps做的事情和你在终端里执行helm install几乎一模一样,区别只是操作入口从命令行换成了浏览器表单。所以我一直跟团队强调:不要在Kubeapps界面里去搞“绕过Helm”的手工资源部署,那不是它的设计目标。Kubeapps管理的是Helm Release,你手工创建的Deployment、Service这些东西在它界面上不会以Release的形式出现,这容易让人产生误解。

2.2 三个核心角色的分工

Kubeapps涉及的主要角色可以分成三块:Chart仓库、Helm Release存储、以及操作者。

Chart仓库负责提供应用模板。Kubeapps默认会尝试添加一些公共仓库,但我在公司内网环境里通常只保留内部Harbor仓库,公共仓库是否启用看团队需要。你需要确保Kubeapps所在的Pod能访问到这些仓库的HTTP接口,否则界面上会一直显示仓库同步失败。

Helm Release的存储很有意思。Kubernetes集群里其实没有一个叫“Release”的API资源,Helm Release记录默认是存在集群内的Secret里面的,以sh.helm.release.v1.<名称>.v<版本>这样的命名方式存在。Kubeapps界面显示出来的Release状态,本质上是获取这些Secret并解析出来的结果。所以当你用命令行helm list看到某些Release时,Kubeapps界面上能看到同样的列表,因为它们都基于同一份存储。

操作者则是通过Kubernetes的RBAC权限模型来控制的。Kubeapps支持在界面上以不同身份登录,最终落到Kubernetes里就是你拿着一个ServiceAccount或OIDC用户身份在做操作。比如给某个命名空间的运维同学配一个edit角色,他登录Kubeapps后只能管理这个命名空间下的应用;而集群管理员可以看到所有命名空间。

2.3 理解Kubeapps的权限模型非常关键

很多初次上手Kubeapps的人会有一个错觉:既然我能访问Kubeapps界面,那我是不是什么都能干?其实不是。Kubeapps做了一个很聪明的设计——它把你在Kubernetes集群里的RBAC身份通过“插件化”的方式映射到界面上,界面本身只负责展示和调用,最终能否安装Chart、能否删除Release,全部以RBAC鉴权结果为准。

这个特性在生产环境里非常重要。因为这意味着你不需要单独给Kubeapps维护一套账号体系,而是完全复用Kubernetes已有的权限模型。具体到部署时,Kubeapps官方推荐的Credentials Plugin有几种,我们团队用的是serviceaccount插件,也就是通过Kubernetes的ServiceAccount Token登录。用户拿到的Token权限多大,Kubeapps界面里能看到的Release范围、能执行的安装操作范围就多大。

3. 环境准备与安装落地:从Ingress Controller到Kubeapps

搞清楚原理之后,就可以进入实际操作阶段了。这里我以一套测试环境作为演示:Kubernetes版本,这个环境之前已经装好了Nginx Ingress Controller,并且有可用的StorageClass。我会带你过一遍完整的安装过程,包括一些容易忽略的前置条件。

3.1 前置条件:确认集群里已经有哪些基础设施

在装Kubeapps之前,建议先确认三件事。第一是Ingress Controller是否存在,Kubeapps自带的安装模板会创建一个Ingress对象,如果你集群里没有对应的Ingress Controller,就算创建了Ingress也没有流量能进来。第二是准备一个可用的StorageClass,Kubeapps需要持久化存储来保存一些本地数据,虽然核心数据大部分在Kubernetes的Secret里,但部分缓存和配置还是依赖持久卷的。第三是确认Kubernetes集群版本,Kubeapps对Kubernetes版本有兼容性要求,如果版本太老,建议先升个级,避免装到一半出现API不兼容的问题。

你可以用下面的命令快速检查这些前置条件:

kubectl get ingressclass kubectl get sc kubectl version --short

输出结果要能看到一个或多个IngressClass、一个状态为Available的StorageClass。如果没有IngressClass,后面安装完Kubeapps后需要额外处理网络入口的问题,会比较麻烦。

3.2 使用Helm安装Kubeapps:一步步来

Kubeapps官方提供了一套Helm Chart,我们按常规方式安装即可。首先添加官方Chart仓库并更新:

helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update

然后创建一个用于部署Kubeapps的命名空间,并执行安装:

kubectl create namespace kubeapps helm install kubeapps bitnami/kubeapps -n kubeapps

这里顺带说一下命名空间的选择逻辑。Kubeapps的Pod属于基础设施组件,我习惯把它放在一个独立的kubeapps命名空间里,而不是直接塞到default或其他业务命名空间,这样权限边界清晰,后面前端Ingress的转发规则也容易配。

安装完成后等Pod全部Running,这个过程一般需要一两分钟,取决于集群拉镜像的速度和资源情况:

kubectl get pods -n kubeapps

如果一切正常,你会看到类似下面的输出:

NAME READY STATUS RESTARTS AGE kubeapps-6b7f5d49b6-xxxxx 1/1 Running 0 2m kubeapps-internal-dashboard-xxxxx 1/1 Running 0 2m kubeapps-internal-kubeops-xxxxx 1/1 Running 0 2m

看到kubeapps-internal-kubeops这个Pod的时候,你可以理解为Kubeapps的核心操作组件已经就绪了,它就是那个真正和Helm运行时打交道的服务。

3.3 配置Ingress:让团队通过浏览器访问

最基础的方式是通过kubectl port-forward临时访问:

kubectl port-forward -n kubeapps svc/kubeapps 8080:80

然后浏览器打开http://127.0.0.1:8080,页面上会要求输入API Token,也就是ServiceAccount Token。这种方式适合个人快速验证,不适合团队日常使用。

我建议直接配好Ingress,让团队成员通过域名访问。修改之前安装的Kubeapps Chart配置,打开values.yaml,重点关注ingress、authProxy、service这几块。我最终的配置是这样一段:

ingress: enabled: true className: nginx hostname: kubeapps.example.internal annotations: nginx.ingress.kubernetes.io/proxy-body-size: "0"

注意proxy-body-size这个注解。Kubeapps在界面上支持上传自定义Chart包,如果Ingress默认限制请求体大小,上传一个稍微大点的Chart压缩包就可能触发413错误。这个坑我后面会细说,这里先提前埋个伏笔。

改完配置后执行Helm升级:

helm upgrade kubeapps bitnami/kubeapps -n kubeapps -f values.yaml

3.4 创建管理员ServiceAccount:入口通了,还要有钥匙

Kubeapps界面的登录方式是输入Kubernetes的ServiceAccount Token。理论上你可以直接用集群管理员的Token登录,但那种Token权限太大,存在泄漏风险。正规做法是创建专用的ServiceAccount,并授予合适的RBAC权限。

我提供了一个用于登录Kubeapps的集群管理员账户,这里以“某测试集群管理员”为例,创建一个只归Kubeapps登录用的ServiceAccount,然后把它绑定到cluster-admin角色上。在生产环境请务必按最小权限原则拆分:

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

保存为kubeapps-admin-sa.yaml,然后执行:

kubectl apply -f kubeapps-admin-sa.yaml kubectl get secret -n kubeapps -o jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name=="kubeapps-admin")].data.token}' | base64 -d

最后一条命令会打印出Token,把它粘贴到Kubeapps登录页面的Token输入框里就能进去了。每次拿到Token后记得妥善保管,因为Kubeapps默认没有提供Token自动刷新机制,ServiceAccount Token过期后需要重新生成。如果你的集群启用了TokenRequest功能,也可以通过kubectl create token来获取有时效性的Token,这样安全性更高:

kubectl create token kubeapps-admin -n kubeapps --duration=24h

4. 核心功能实操:可视化安装Chart、升级与回滚Release

Kubeapps界面结构不复杂,左侧菜单主要就是几个页面:应用目录(Catalog)、应用实例(Applications)、Chart仓库、以及配置中心。下面我挑几个团队日常用得最多的功能讲一讲,每个功能都会说清楚操作流程和背后的Helm逻辑。

4.1 应用目录:搜索、筛选、查看Chart详情

进入“应用目录”页面,你会看到Kubeapps同步过来的一批Chart仓库里的全部Chart包。界面左侧可以按仓库、分类、维护者筛选,右上角是搜索框。这个页面和helm search repo命令做的事情一样,但可视化的好处在于你能直接看到Chart的简介、图标、版本号、依赖关系、以及README。

点进任意一个Chart详情页,你会看到完整的配置表单。这里就是Kubeapps最有价值的地方之一——它把Chart的values.yaml参数渲染成表单,你不需要打开终端去编YAML文件,直接在浏览器里填写参数就行。

以部署一个常见的Web应用为例,详情页会让你填写:

  • Release名称:相当于helm install <release-name>里的名称
  • 命名空间:选择要部署到哪个命名空间
  • 版本号:默认是最新版本,你也可以选择历史版本
  • Values配置:这里有两种模式,一种是表单模式,按字段填写;另一种是YAML模式,直接编辑原始values内容

填完之后点“部署”,Kubeapps会调用Helm执行安装。如果安装失败,界面上会直接给出Helm渲染或安装失败的报错信息,排查起来比命令行稍微友好一些。

4.2 应用实例:查看Helm Release状态、升级和回滚

“应用实例”页面展示的是当前集群里所有Helm Release的列表,包含Release名称、命名空间、Chart名称、版本状态、最近更新时间等信息。点进任意一个Release详情页,你会看到类似helm status命令输出的完整信息。

这里我重点说一下升级操作。假设你现在部署的是my-app这个Release,版本是1.0.0,某研发团队更新了Chart包并推送到Harbor仓库,Kubeapps仓库同步后界面上的应用详情会显示新版本1.1.0。你不需要重新卸载再安装,直接点“升级”按钮,选择新版本,填写需要调整的Values,然后确认。

这一步本质上是执行helm upgrade,所以理论上它支持热更新。但我要提醒一点:不是所有应用都适合直接升级。比如某些有状态应用,如果Chart里没有做好StatefulSet的滚动更新策略,升级过程可能会导致Pod重建。建议升级前先看一下Chart的文档,确认它支持平滑升级,再点按钮。

回滚操作也值得说一说。Kubeapps的Release详情页会显示当前Release修订版本,你可以选择回滚到上一个或多个版本。这个能力背后对应的是helm rollback命令。我们团队有一次在生产环境误操作,把某个服务的副本数从3改成1,结果业务直接降级。幸好Kubeapps里保留了上一版本记录,点两下就回滚了,整个过程不到十秒钟。从那以后我要求团队在Kubeapps上做任何变更前,先看一眼Release版本列表,确认有可回滚的记录。

4.3 自定义Chart包上传:从Harbor到Kubeapps的完整链路

Kubeapps还支持直接上传本地的Chart包文件(.tgz格式)到内置的ChartMuseum或OCI仓库。这个功能非常实用,特别是当某些应用还没有纳入CI/CD流程,需要人工发布时。

具体路径是:在“应用目录”页面上有一个“上传”按钮,点击后选择本地的my-app-1.0.0.tgz文件,Kubeapps会把它推送到底层的Chart仓库,并自动触发同步。同步完成后,这个Chart就会出现在应用目录里,团队成员都可以看到并安装。

我们实际使用中发现,上传自定义Chart包经常需要配合Harbor仓库使用。Harbor在Helm配置里把Chart仓库和镜像仓库拆开管理,Kubeapps默认内置了一个轻量级的ChartMuseum,如果你的团队已经有了Harbor,建议让Kubeapps直接对接Harbor的Chart仓库,而不是使用内置的那个。

4.4 命名空间与权限:给团队划分独立的操作空间

Kubeapps界面的权限边界完全跟着RBAC走。给A同学只授予web命名空间的edit权限,他登录后只能看到web命名空间下的Release,也只能对这个命名空间执行安装和升级操作。如果你希望某个同学能跨命名空间管理,有两条路径:一是直接给他授予多个命名空间的RBAC权限;二是给他配一个拥有这些命名空间权限的ServiceAccount。

这就引出一个实际使用建议:不要给所有人都创建cluster-admin级别的Kubeapps登录账户。团队里如果有人只需要管理web和api两个命名空间,就创建对应的ServiceAccount并绑定admin或edit角色。这样即使某个Token泄露了,攻击者能影响的范围也是可控的。

5. 实操踩坑记录:Kubeapps使用中的三个典型问题与排查思路

这部分我必须坦诚说,Kubeapps部署和日常使用过程中不是一帆风顺的,踩过几个典型的坑。把这些经历写出来,是想让后来者少走一些弯路。

5.1 问题一:Ingress的proxy-body-size限制导致Chart上传失败

前面我提到在Ingress配置里加了proxy-body-size: "0"这个注解,原因就在这里。第一次给团队开放Kubeapps时,有个同事尝试上传一个包含大量依赖的Chart包,大约十几MB,结果传了半天界面一直转圈,最后报了一个413 Request Entity Too Large错误。

排查思路很清晰:先确认前端能正常访问,排除网络问题;再看Kubeapps后台上传组件的日志,发现请求根本没有到达应用层;然后用curl直接测试上传接口,果然返回413。最终锁定是Nginx Ingress默认限制了客户端请求体大小。解决办法就是加上那个注解,或者明确设一个足够大的数值。

这里也提醒一下,这个限制不仅仅是Kubeapps会遇到,任何通过Nginx Ingress上传大文件的应用都需要提前考虑这个参数。

5.2 问题二:Harbor仓库同步失败但集群却正常

另一个高频问题是,Kubeapps配置Harbor仓库后,界面上一直显示“同步失败”,但你在Harbor页面确认Chart包确实存在,curl访问Harbor的API也是通的。

我当时的排查过程是这样的:第一,确认Harbor的API版本和Kubeapps要求的是否匹配,因为不同版本的Harbor API接口路径差异很大;第二,确认Kubeapps调用的认证方式,Harbor支持用户名密码和Robot Account两种方式,Robot Account的权限需要显式勾选“读Chart”权限;第三,检查Kubeapps所在的命名空间下有没有涉及出网访问的NetworkPolicy。

最后定位到是Robot Account权限没配好导致的。在Harbor里创建一个新的Robot Account,权限范围选择读取Chart仓库,把生成的用户名密码填到Kubeapps仓库配置里,问题立刻解决。

这类问题给我的教训是:界面同步失败时,第一件事永远不是怀疑网络或Kubeapps本身,而是先看仓库服务端返回的具体错误信息。Kubeapps界面上其实能看到同步错误详情,只是很多人忽略了。

5.3 问题三:Token过期导致的“可以登录但看不到任何Release”

Kubeapps登录后理论上会展示你有权限查看的所有Release,但有时候会出现一个诡异的现象:能登录,但界面上“应用实例”和“应用目录”都是空的。

第一次遇到这个问题,我差点以为Kubeapps的组件挂了。后来检查Kubeops Pod日志,发现它在请求Kubernetes API时返回了大量Unauthorized错误。问题出在Kubeapps后端组件用于访问Kubernetes API的令牌已经过期,而Kubeapps界面前端却还在正常运行。

解决办法是重启Kubeops相关Pod,让它重新初始化Token绑定。具体命令是:

kubectl rollout restart deployment kubeapps-internal-kubeops -n kubeapps

这类问题在采用短期Token的集群里更容易发生,所以如果你习惯用kubectl create token --duration=24h这种方式给成员发登录凭证,建议在文档里写清楚Token需要定期更新,避免某天早上大家突然都看不了Release列表了。

6. 从Kubeapps延伸的思考:Helm的图形化管理到底解决什么问题

写到这里,文章差不多接近尾声了。但我想跳出Kubeapps本身,聊聊我在Helm使用过程中的一些更细的体会。Kubeapps的价值不只在“界面好看”,它背后其实改变了团队使用Helm的方式。

以前用命令行时,每个成员都会形成自己的操作习惯,有的喜欢helm install,有的喜欢先helm template渲染再kubectl apply,还有的一上来就顺手helm uninstall导致线上事故。而Kubeapps在一定程度上把流程标准化了。你需要先在应用目录找到Chart,然后填写参数,点部署,整个过程界面都给了清晰的引导。

更重要的一点是,Kubeapps让Helm的使用过程变得更“可见”。命令行操作的每一步是没有留痕的,除了集群的RBAC审计日志,很多人根本不知道哪个Release在什么时间被谁改动过。Kubeapps自身虽然没有完整的审计报表功能,但它的操作都走Kubernetes API,配合集群审计日志,管理员能还原出谁在什么时候对哪个Release做了什么操作。这一点在生产环境里价值非常大。

如果你团队规模很小,只有两三个人、且都是资深K8s玩家,那也许命令行已经够用。但如果团队里已经有非技术背景的同学,或者你需要给多个业务线提供自助式发布平台的入口,Kubeapps确实是一个值得认真考虑的选择。它是Helm生态里相对成熟的开源方案,安装成本不算高,日常工作带来的便利和权限边界上的可控性,都让我觉得这是一笔划算的投入。

最后再分享一个我个人的建议:正式推广Kubeapps前,先花半天时间把你能想到的常见操作在测试环境全部走一遍。不只是安装和卸载,还要包括升级失败后的回滚、仓库同步失败时的处理、Token过期后的更新、以及Ingress访问异常时的常见排查。把这些问题提前演一遍,团队在实际使用时会顺畅很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询