Backstage 官方 Kubernetes Helm Chart 部署指南:App 前端与 Backend 全参数解析
导读
本文基于 Backstage 仓库中随附的官方基础 Kubernetes Helm 示例(位于 contrib/kubernetes/basic_kubernetes_example_with_helm),系统讲解使用 Helm 在 Kubernetes 上部署 Backstage 开发门户时所需的全部可配置参数、模板渲染原理与最小化部署实践。读完本文,你将掌握 App 前端与 Backend 两套组件的镜像、副本、Service、Ingress、资源配额、安全上下文等核心参数的取值与默认行为,并能直接基于仓库内的 values.yaml 与裸 YAML 示例完成一次可运行的 Backstage 部署。
一、示例整体结构与定位
仓库在 contrib/kubernetes/basic_kubernetes_example_with_helm 目录下提供了一套"基础 Kubernetes + Helm"的部署示例,其内部组织如下:
| 路径 | 作用 |
|---|---|
backstage/Chart.yaml |
Helm Chart 元数据,Chart 名为 backstage,版本 0.1.1-alpha.12 |
backstage/values.yaml |
全部默认值,App 前端与 Backend 两组配置的权威来源 |
backstage/templates/_helpers.tpl |
Helm 模板辅助函数,负责名称、标签、ServiceAccount 的生成规则 |
backstage/templates/deployment.yaml |
Deployment 模板,按 app.enabled / backend.enabled 条件渲染两组工作负载 |
backstage/templates/service.yaml |
Service 模板,为前后端分别暴露集群内访问入口 |
backstage/templates/ingress.yaml |
Ingress 模板,将外部流量按路径路由到前后端服务 |
app.yaml / backend.yaml / ingress.yaml / service.yaml |
不使用 Helm 时的手写裸 Kubernetes 清单,展示等价的最小配置 |
需要特别说明的是,该目录的 README.md 明确标注本示例 已被标记为废弃(deprecated),未来会从仓库移除;官方建议迁移到独立维护的 backstage/charts 仓库获取更完善的 Helm Chart。同时该 README 提醒:这些示例"旨在展示最小化配置,不包含生产级 Kubernetes 部署的最佳安全实践",生产环境的安全加固(网络策略、Secrets 管理、Pod 安全标准等)需要结合 Kubernetes 官方安全文档或组织自身规范另行落实。
二、App 前端(Frontend)Values 参数全表
backstage/README.md 将参数分为 App/Frontend 与 Backend 两大类。App 前端对应 Backstage 的前端应用容器,完整参数如下:
| 参数 | 说明 | 默认值 |
|---|---|---|
app.enabled |
是否渲染前端应用配置(生成 Deployment 等资源) | true |
app.nameOverride |
覆盖赋予 App 前端的名称 | "" |
app.fullnameOverride |
覆盖 App 前端的完整名称 | "" |
app.replicaCount |
App 前端 Pod 的副本数 | 1 |
app.image.repository |
App 前端容器镜像仓库 | spotify/backstage |
app.image.tag |
拉取的 App 前端镜像标签 | latest |
app.image.pullPolicy |
镜像拉取策略 | Always |
app.service.type |
App 前端 Service 类型 | ClusterIP |
app.service.port |
App 前端服务端口 | 80 |
app.ingress.enabled |
是否创建 Ingress | false |
app.ingress.annotations |
App 前端 Ingress 注解 | {} |
app.ingress.hosts[].host |
App 前端访问主机名 | backstage.local |
app.ingress.hosts[].paths[] |
App 前端提供服务的路径 | ["/"] |
app.imagePullSecrets[] |
拉取 app.image.repository 镜像所需的镜像密钥 |
[] |
app.podSecurityContext |
App 前端 Pod 级安全上下文 | {} |
app.securityContext |
Deployment 内容器级安全上下文设置 | {} |
app.resources |
Kubernetes Pod 资源 requests/limits | {} |
app.nodeSelector |
调度 App 前端 Pod 的节点选择器 | {} |
app.tolerations |
调度 App 前端 Pod 的容忍度(污点容忍) | {} |
app.affinity |
App 前端 Pod 的亲和性设置 | {} |
注意:原文档表格中
app.imagePullSecrets[]等行以app.为前缀书写,实际对应values.yaml中app:层级下的同名键;阅读时需结合层级上下文理解。
三、Backend Values 参数全表
Backend 对应 Backstage 的后端(含 catalog、scaffolder 等插件服务)容器,参数结构与应用端一一对应:
| 参数 | 说明 | 默认值 |
|---|---|---|
backend.enabled |
是否渲染后端配置 | true |
backend.nameOverride |
覆盖赋予后端的名称 | "" |
backend.fullnameOverride |
覆盖后端的完整名称 | "" |
backend.replicaCount |
后端 Pod 的副本数 | 1 |
backend.image.repository |
后端容器镜像仓库 | spotify/backstage |
backend.image.tag |
拉取的后端镜像标签 | latest |
backend.image.pullPolicy |
镜像拉取策略 | Always |
backend.service.type |
后端 Service 类型 | ClusterIP |
backend.service.port |
后端服务端口 | 80 |
backend.ingress.enabled |
是否创建后端 Ingress | false |
backend.ingress.annotations |
后端 Ingress 注解 | {} |
backend.ingress.hosts[].host |
后端访问主机名 | backstage.local |
backend.ingress.hosts[].paths[] |
后端提供服务的路径 | ["/"] |
backend.imagePullSecrets[] |
拉取 backend.image.repository 镜像所需的镜像密钥 |
[] |
backend.podSecurityContext |
后端 Pod 级安全上下文 | {} |
backend.securityContext |
后端容器级安全上下文设置 | {} |
backend.resources |
Kubernetes Pod 资源 requests/limits | {} |
backend.nodeSelector |
调度后端 Pod 的节点选择器 | {} |
backend.tolerations |
调度后端 Pod 的容忍度 | {} |
backend.affinity |
后端 Pod 的亲和性设置 | {} |
四、默认值源码解读:values.yaml 与模板行为
4.1 values.yaml 中的默认配置
backstage/values.yaml 是 Helm 渲染的实际输入,与 README 表格相比提供了更完整的默认细节,包括 README 中未展开的几个关键点:
- App 前端默认
enabled: true、replicaCount: 1、镜像spotify/backstage:latest、pullPolicy: Always、Service 端口80、Ingress 主机backstage.local且路径为/; - Backend 默认
enabled: false(与 README 表格中的true不同,以 values.yaml 为准)、镜像为spotify/backstage-backend:latest、pullPolicy: IfNotPresent、Service 端口7007、Ingress 路径为/backend; - 两组组件都预置了注释掉的常用配置示例,例如 Pod 安全上下文的
fsGroup: 2000、容器安全上下文的capabilities.drop: ALL、runAsNonRoot: true、runAsUser: 1000,以及资源配额示例cpu: 100m / memory: 128Mi,取消注释即可启用; - Ingress 的 TLS 配置(
tls: [])以及kubernetes.io/ingress.class: "nginx"注解同样以注释形式给出,便于按 Ingress Controller 类型启用。
4.2 名称与标签的模板规则
templates/_helpers.tpl 定义了名称生成规则:
backstage.name:默认取 Chart 名backstage,可用nameOverride覆盖;backstage.fullname:优先使用fullnameOverride;否则若 Release 名已包含 Chart 名则直接使用 Release 名,否则拼接为<releaseName>-<chartName>;所有名称统一trunc 63并去掉尾部-,以符合 Kubernetes DNS 命名规范对名称字段 63 字符的限制;backstage.app.labels/backstage.backend.labels:输出标准的app.kubernetes.io/name、helm.sh/chart、app.kubernetes.io/instance、app.kubernetes.io/version、app.kubernetes.io/managed-by标签,分别以-app、-backend后缀区分前后端;backstage.app.serviceAccountName/backstage.backend.serviceAccountName:当serviceAccount.create为true时使用serviceAccount.name,否则回退到default。
4.3 Deployment 的渲染条件与探针
templates/deployment.yaml 是最核心的渲染逻辑:
- 使用
{{- if .Values.app.enabled }}与{{- if .Values.backend.enabled }}分别包裹前后端 Deployment,通过开关控制是否生成资源; - Deployment 名称分别为
{{ fullname }}-app与{{ fullname }}-backend,与标签体系保持一致; - 容器名分别为
<chartName>-app与<chartName>-backend,镜像字符串为"{{ repository }}:{{ tag }}"拼接而成; - 前后端均配置了 livenessProbe 与 readinessProbe,通过
httpGet请求/路径检查存活与就绪状态;需要留意的是,模板中后端容器声明了containerPort: 80,但探针端口引用的是名为backend的端口,这与 values.yaml 中后端 Service 端口7007存在差异,实际部署时需按自身后端镜像暴露的端口校准; imagePullSecrets、podSecurityContext、securityContext、resources、nodeSelector、affinity、tolerations全部通过toYaml . | nindent原样注入,保证任意复杂结构都能透传。
4.4 Service 与 Ingress
templates/service.yaml 与 templates/ingress.yaml 分别渲染前后端 Service 与 Ingress:
- Service 使用
ClusterIP类型,App 前端端口为80、后端为7007(以 values.yaml 默认值为准),targetPort对应容器端口名app/backend; - Ingress 默认
enabled: false,启用后按hosts[].host与paths[]生成路由规则,TLS 通过tls[]配置。
五、不使用 Helm 的裸 Kubernetes 清单对照
对于希望直接 kubectl apply 而非使用 Helm 的场景,目录根级提供了等价的最小清单,是理解整套部署模型最直观的参考:
- app.yaml:前端 Deployment,副本数 1,镜像
spotify/backstage:latest,imagePullPolicy: IfNotPresent,容器端口80(命名app),标签app: backstage、component: frontend; - backend.yaml:后端 Deployment,镜像
spotify/backstage-backend:latest,容器端口7007(命名backend),标签component: backend; - service.yaml:一个文件内以
---分隔定义两个 ClusterIP Service——backstage(端口 80 → targetPortapp)与backstage-backend(端口 7007 → targetPortbackend),通过selector精确匹配各自的app+component标签; - ingress.yaml:演示了前后端路由共存的方式——同一主机名
<HOSTNAME>下,路径/转发到前端 Servicebackstage(端口frontend),路径/backend转发到后端 Servicebackstage-backend(端口backend)。注意该清单使用extensions/v1beta1API 版本,在现代 Kubernetes(v1.22+)中该版本已移除,应改用networking.k8s.io/v1,这也从侧面印证了该示例确属较早时期编写。
六、最小化部署实操要点
综合以上信息,完成一次基于本示例的 Backstage 部署,核心步骤如下:
- 准备镜像:确定前后端容器镜像。App 前端默认
spotify/backstage:latest,后端默认spotify/backstage-backend:latest;私有镜像仓库场景需通过app.imagePullSecrets/backend.imagePullSecrets注入拉取凭证; - 修改 values:在 backstage/values.yaml 中设置
app.enabled: true、backend.enabled: true,按需调整app.image.tag、backend.image.tag与replicaCount; - 安装 Chart:在
backstage/目录下执行helm install <release-name> .(可另加-f指定自定义 values 文件),或者先helm template预览渲染结果再落盘应用; - 暴露访问入口:开启
app.ingress.enabled并配置hosts与tls,或手动应用根级 ingress.yaml(注意先将<HOSTNAME>替换为真实域名,并把 API 版本升级为networking.k8s.io/v1); - 验证:通过 Service 端口或 Ingress 地址访问前端,确认
/返回前端页面、/backend能被后端正常响应。
七、结论与适用边界
本示例的价值在于:它以最小、可读的方式完整展示了 Backstage 前后端分离架构在 Kubernetes 上的映射关系——前端容器暴露 80、后端容器暴露 7007,通过 component: frontend / component: backend 标签区分两组资源,再由 Service 与 Ingress 按路径 / 与 /backend 完成流量路由。app.enabled / backend.enabled 的开关设计、统一的名称与标签辅助函数、以及 toYaml 透传机制,共同构成了这套 Chart 的骨架。
使用时务必注意三点边界:其一,该示例已在目录 README 中被官方标注为废弃,仅适合学习参考,生产环境请迁移到官方维护的 Backstage Helm Charts;其二,示例明确不包含生产级安全实践(如 Secret 管理、网络策略、非 root 运行等),需要在部署时自行补齐;其三,仓库与模板中的镜像默认值、API 版本(如 extensions/v1beta1)均为历史版本设定,实际部署应结合当前集群版本与镜像发布情况调整。
参考文件索引
- Chart 参数文档:本文核心依据,App/Backend 参数全表
- 示例目录总览与废弃声明
- 默认值配置
- Chart 元数据
- 名称与标签辅助函数
- Deployment 模板
- 裸清单示例、backend.yaml、service.yaml、ingress.yaml
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0632
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
video-shotcraftAI宣传片skill,使用 Remotion 制作电影级产品视频:提供106 张镜头配方卡和可复用的视频魔板。适用于 Claude Code 与 Codex以及所有其他智能体Markdown00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00