Backstage Kubernetes 插件如何配置认证以访问集群?

发布时间:2026/9/12 2:09:30

Backstage Kubernetes 插件如何配置认证以访问集群? Backstage Kubernetes 插件如何配置认证以访问集群【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage在 Backstage 中接入了 Kubernetes 插件后常见的问题是前端实体页面看不到任何集群资源或者只看到集群名却加载不出对象。根本原因几乎都是插件的认证没有配好。本文的任务是完成 Kubernetes 插件的安装后在app-config.yaml中为集群选择并配置认证方式authProvider配合 RBAC 权限和实体关联标注最终让 Software Catalog 实体页面上的 Kubernetes 标签正常列出该实体对应的 pods、services、deployments 等资源。适用环境是已经按 Getting Started 指南搭建好的 Backstage 实例。先安装 Kubernetes 前端与后端插件认证配置依附于插件本身两步安装缺一不可。在 Backstage 根目录执行yarn --cwd packages/app add backstage/plugin-kubernetes前端插件安装后通过默认 feature discovery 自动生效会为关联了 Kubernetes 资源的实体页面添加 Kubernetes 标签。然后安装后端插件yarn --cwd packages/backend add backstage/plugin-kubernetes-backend并在packages/backend/src/index.ts中注册const backend createBackend(); // Other plugins... backend.add(import(backstage/plugin-kubernetes-backend)); backend.start();理解两类认证提供者选择你的 authProviderBackstage 的 Kubernetes 认证由KubernetesAuthProviders完成注意它和 Backstage 应用自身的登录认证不是同一套东西。文档把它们分为两类这决定了认证配置的写法Server Side Providers认证的是你的应用。任何登录了 Backstage 的用户包括 guest都获得同一套 Kubernetes 访问权限。可用值aws、azure、googleServiceAccount、localKubectlProxy、serviceAccount。Client Side Providers认证的是用户。每个用户会被要求提供凭据只能访问自己被授权的资源。可用值aks、google、oidc。如果集群已配置但用户无权限该集群会列出但看不到资源错误表现为401或类似错误。authProvider字段的完整取值与含义值说明aks使用用户的 AKS access token来自 Microsoft auth provider访问 AKS 集群aws使用 AWS 凭据访问 EKS 集群资源azure使用 Azure Identity 访问集群资源google使用用户的 Google access token 访问 GKE 集群googleServiceAccount使用 Google Cloud 服务账号凭据访问集群资源oidc使用 OIDC token 认证必须同时设置oidcTokenProvider且集群须支持 OIDC文档指出 AKS 集群当时不支持 OIDCserviceAccount使用 Kubernetes 服务账号访问 API须同时设置serviceAccountToken否则 Backstage 必须运行在集群内以下按文档给出三条主配置路径本地/自建集群的serviceAccount、AWS 的aws、以及oidc。路径一serviceAccount本地集群与自建集群在app-config.yaml中通过clusterLocatorMethods的config方法声明集群。完整示例本地 minikube来自 configuration 文档kubernetes: serviceLocatorMethod: type: multiTenant clusterLocatorMethods: - type: config clusters: - url: http://127.0.0.1:9999 name: minikube authProvider: serviceAccount skipTLSVerify: false skipMetricsLookup: true serviceAccountToken: ${K8S_MINIKUBE_TOKEN} caData: ${K8S_CONFIG_CA_DATA} caFile: # local path to CA file关键字段说明均以上下文文档为准urlKubernetes control plane 的 base URL可通过kubectl cluster-info的 Kubernetes master 结果获得。name集群在 Software Catalog Kubernetes 页面中显示的名称在clusters数组内必须唯一。serviceAccountTokenserviceAccount认证提供者使用的 token这里以环境变量注入。文档同时提醒除非你有有效的凭据轮换机制或只有一个同时运行 Backstage 与全部服务的集群否则该方式不太适合生产环境。caDatabase64 编码的 PEM 格式 CA bundle可从kubeconfig通常是~/.kube/config的clusters[*].cluster.certificate-authority-data字段获取。GKE 可用gcloud container clusters describe YOUR_CLUSTER_NAME --zoneYOUR_COMPUTE_ZONE --formatvalue(masterAuth.clusterCaCertificate)获取。skipTLSVerify是否跳过 API server 的 TLS 证书校验默认false。skipMetricsLookup是否跳过 pod 的 CPU/内存指标查询默认false。如果authProvider: serviceAccount的集群省略了serviceAccountToken字段Backstage 会忽略配置的 URL 和证书数据改用 in-cluster client 方式访问。获取 long-lived service account token假设你已在NAMESPACE命名空间创建了名为SERVICE_ACCOUNT_NAME的服务账号并授予足够权限。按 Kubernetes 版本获取 tokenNAMESPACE、SERVICE_ACCOUNT_NAME、SECRET_NAME替换为你的实际值Kubernetes 1.24 之前可以读取服务账号自动生成的 tokenkubectl -n NAMESPACE get secret $(kubectl -n NAMESPACE get sa SERVICE_ACCOUNT_NAME -ojson \ | jq -r .secrets[0].name) -ojson \ | jq -r .data[token] \ | base64 --decodeKubernetes 1.24 及以后先创建绑定服务账号的 Secret等待 token controller 填充后取回kubectl apply -f - EOF apiVersion: v1 kind: Secret metadata: name: SECRET_NAME namespace: NAMESPACE annotations: kubernetes.io/service-account.name: SERVICE_ACCOUNT_NAME type: kubernetes.io/service-account-token EOFkubectl -n NAMESPACE get secret SECRET_NAME -o go-template{{.data.token | base64decode}}集群侧 RBAC 权限插件所需的集群侧权限是 read-only cluster wide。以下 manifest 来自文档能确保插件正常工作--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: backstage-read-only rules: - apiGroups: - * resources: - pods - pods/log - configmaps - services - deployments - replicasets - horizontalpodautoscalers - ingresses - statefulsets - limitranges - resourcequotas - daemonsets verbs: - get - list - watch - apiGroups: - batch resources: - jobs - cronjobs verbs: - get - list - watch - apiGroups: - metrics.k8s.io resources: - pods verbs: - get - list将NAMESPACE等替换为实际值后把该 ClusterRole 绑定到你的服务账号再应用即可。路径二awsEKS 集群使用aws认证提供者时除 Kubernetes 配置外还必须配置 AWS 认证。它通过 AWS IAM 向目标账号认证支持三种凭据来源静态 Access keys、通过 assume role 生成的短期 Access keys或用于 OIDC federation如 GCP Workload Identity Federation的 web identity token 文件。前两种需要安装并配置 AWS CLI。静态密钥的 AWS 配置块aws: mainAccount: accounts: - accountId: account-number accessKeyId: ${AWS_ACCESS_KEY_ID} secretAccessKey: ${AWS_SECRET_ACCESS_KEY} region: region accountDefaults:Assume role 环境则改为aws: mainAccount: roleName: name-of-the-role-to-assume region: region accounts: accountDefaults:非 AWS 环境例如 GCP Workload Identity Federation可使用 web identity token 文件aws: accountDefaults: roleName: name-of-the-role-to-assume webIdentityTokenFile: path-to-token-file对应的 Kubernetes 配置authMetadata中的 key 即文档中的authMetadata注解项${...}为环境变量尖括号项替换为你的实际值kubernetes: serviceLocatorMethod: type: multiTenant clusterLocatorMethods: - type: config clusters: - url: https://unique-identifier.region.eks.amazonaws.com name: ${CLUSTER_NAME_TO_DISPLAY} authProvider: aws caData: ${EKS_CA_DATA} authMetadata: kubernetes.io/aws-assume-role: ${ROLE_ARN_TO_ASSUME} kubernetes.io/aws-external-id: ${ID_FROM_AWS_ADMIN} kubernetes.io/x-k8s-aws-id: ${CLUSTER_NAME_IN_AWS_CONSOLE}集群 URL 和 CA 直接从 AWS 控制台获取进入EKSYour clusterOverviewDetails分别在 API server endpoint 和 Certificate authority 下找到。kubernetes.io/aws-assume-role设置为要 assume 的角色 ARNkubernetes.io/aws-external-id对应 STSAssumeRoleAPI 的ExternalId参数。当设置了kubernetes.io/aws-assume-role时会用角色 ARN 中的 account ID 去匹配accounts或accountDefaults配置匹配到的凭据作为 assume role 的源凭据。注意上述两个 sectionAWS 配置块与 Kubernetes 配置块都需要存在aws认证提供者才生效。路径三oidc用户级认证可选分支oidc使用 OIDC token 向 Kubernetes API 认证oidcTokenProvider指定从哪个 Backstage auth provider 取 id token该 provider 必须已在auth下正确配置kubernetes: clusterLocatorMethods: - type: config clusters: - name: test-cluster url: http://localhost:8080 authProvider: oidc oidcTokenProvider: okta # This value needs to match a config under auth.providers auth: providers: okta: development: clientId: ${AUTH_OKTA_CLIENT_ID} clientSecret: ${AUTH_OKTA_CLIENT_SECRET} audience: ${AUTH_OKTA_AUDIENCE}前端开箱即支持的值gitlab对应应用需被授予openidscope、google、microsoft、okta、onelogin。文档特别提醒oidcTokenProvider只是 token 的 issuer例如可以用microsoft作为 EKS 集群的 issuer。AzureAKS配置说明azure提供者在服务端通过 Azure CLI 认证前提是集群已启用 Microsoft Entra authentication。步骤在 Backstage 运行的环境安装 Azure CLI在服务器终端执行az login登录在 Azure Console 进入 AKS 集群资源页按Connect标签的步骤设置订阅并获取kubectl集成凭据然后配置kubernetes: clusterLocatorMethods: - type: config clusters: - name: My AKS cluster url: ${AZURE_CLUSTER_API_SERVER_ADDRESS} authProvider: azure skipTLSVerify: trueAPI server 地址从 Azure 控制台的集群资源页OverviewPropertiesNetworking复制。将实体与集群资源关联认证配好后还要让 Backstage 知道哪些集群资源属于哪个实体。在实体的catalog-info.yaml中添加注解annotations: backstage.io/kubernetes-id: dice-roller可选地用backstage.io/kubernetes-namespace限定命名空间查找。对应的 Kubernetes 资源service、deployment、ingress 等需要带相同 key 的 labelmetadata: labels: backstage.io/kubernetes-id: BACKSTAGE_ENTITY_NAMEk8s-app-name与service-entity-name可以不同但文档建议保持一致。也可用backstage.io/kubernetes-label-selector写自定义 label selector 查询替代精确 id 匹配label selector 优先级高于 annotation/service id。验证配置是否生效用文档给出的 curl 命令检查集群是否已连通{{backstage-backend-url}}:{{backstage-backend-port}}替换为你的 Backstage 后端实际地址:service-entity-name与服务名替换为实际实体名curl --location --request POST http://backstage-backend-host:port/api/kubernetes/services/service-entity-name \ --header Content-Type: application/json \ --data-raw { entity: { metadata: { name: service-entity-name } } }成功的判断方式是响应items中包含对应cluster和resourcesservices、pods 等且errors为空。文档示例响应结构{ items: [ { cluster: { name: cluster-name }, resources: [ { type: services, resources: [ { metadata: { labels: { backstage.io/kubernetes-id: service-entity-name }, name: k8s-app-name, namespace: namespace } } ] } ], errors: [] } ] }以上尖括号均为占位符实际输出中的名称以你环境为准。最后到 Backstage 实体页面确认 Kubernetes 标签中能看到这些资源。排查与限制Kubernetes 标签什么都不显示先确认catalog-info.yaml注解与集群资源 label 是否匹配这是文档列出的最常见原因再用上面的 curl 命令区分是集群没连通还是实体没关联上。用户看不到资源但集群已列出这是 client side 提供者的正常行为——用户未被授权访问该集群时错误显示为401或类似需要为该用户配置集群侧授权。localKubectlProxy假定本地有kubectl proxy默认端口 8001在运行文档明确它只用于本地开发不应在生产环境使用。catalog cluster locator 不支持serviceAccount把 token 放在 catalog 实体注解里是不安全的因此 catalog 定位器会忽略使用serviceAccount策略的实体且serviceAccountToken等敏感 key 不能从 catalog 实体提供。多个定位器共存时可将clusterLocatorContinueOnError设为true这样单个定位器如某个 GKE 项目的权限错误失败时其余成功定位器返回的集群仍会返回默认false时任一失败会导致整个集群列表请求失败。完成认证配置、RBAC 授权与实体关联后实体页面的 Kubernetes 标签即可展示真实资源。如需进一步限制谁可以调用/clusters、/services/:serviceId、/resources、/proxy等端点可结合权限框架配置kubernetes.clusters.read、kubernetes.resources.read与kubernetes.proxy权限见 Permissions 文档。完整认证机制与自定义AuthenticationStrategy的说明见 Kubernetes Authentication 与 Authentication Strategies各配置字段的细节见 Configuring Kubernetes integration。【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/12 2:09:30

Windows系统盘空间优化与安全清理全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 2:04:30

热电联产经济调度:PSO与遗传算法的混合优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 3:39:41

会议海报设计全攻略:从信息层级到印刷输出的实用指南

1. 设计前的准备:先想清楚,再动手很多新手拿起软件就急着拖文本框、拉图片,结果做到一半发现信息塞不下、层次一团乱,最后只能推翻重来。做会议海报这件事,我用一句话总结:设计不是从打开软件开始的&#x…

2026/9/12 3:39:41

微信小程序汉堡点餐系统:前后端分离与MySQL订单状态机全解析

简介:一套基于Java SSM框架和微信小程序的汉堡点餐系统毕业设计源码,适合计算机类专业的毕业设计、课程设计,也可供小程序开发者参考学习;后端基于SSM分层设计,小程序端由uniapp构建,配合MySQL实现数据持久…

2026/9/12 3:34:41

MATLAB通信仿真实战:OFDM与数字信号处理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码