LabHub
学习 学习路径 课程

CBA — Backstage 认证助理

编写软件目录实体

在 LabHub 中继续学习

目标

亲手编写 Backstage 软件目录中的八种实体,熟悉实体之间的关系声明与引用格式。最后,把同一份所有权信息呈现在真实的集群工作负载中,连接这两个世界。

为什么重要

目录不是清单,而是关系图。只需在一侧声明 spec.ownerspec.systemspec.providesApis,目录就会计算双向关系——因此,字段写在哪里会直接决定关系图的形态。如果目录中只能保证一项信息准确,那就应当是所有者。事故呼叫、漏洞工单、成本归属和废弃决策,全都由所有者决定。并且所有者必须是团队,而不是个人——人员会离职,团队则会被承接。本实验中创建的文件在实际运行环境中会与服务代码一起提交到仓库根目录,并通过发现机制自动注册。本环境中没有 Backstage,因此评分会读取文件和集群对象。

步骤

  1. /root/cba-catalog/catalog-info.yaml 中编写 Component——apiVersion: backstage.io/v1alpha1kind: Componentmetadata.name: checkout-servicemetadata.description 可填写任意句子;在 metadata.annotations 中加入 backstage.io/techdocs-ref: dir:.backstage.io/kubernetes-id: checkout-service;设置 spec.type: servicespec.lifecycle: productionspec.owner: group:team-checkoutspec.system: commerce,并让 spec.providesApis 的第一项为 checkout-api
  2. /root/cba-catalog/api-checkout.yaml 中编写 API——kind: APImetadata.name: checkout-apispec.type: openapispec.lifecycle: productionspec.owner: group:team-checkoutspec.system: commerce,并在 spec.definition 中写入以 openapi: 3.0.0 开头的多行字符串(块标量)。
  3. /root/cba-catalog/resource-db.yaml 中编写 Resource——kind: Resourcemetadata.name: checkout-dbspec.type: databasespec.owner: group:team-checkoutspec.system: commerce
  4. /root/cba-catalog/system-commerce.yaml 中编写 System——kind: Systemmetadata.name: commercespec.owner: group:team-checkoutspec.domain: retail。在 /root/cba-catalog/domain-retail.yaml 中编写 Domain——kind: Domainmetadata.name: retailspec.owner: group:team-checkout
  5. /root/cba-catalog/group-team-checkout.yaml 中编写 Group——kind: Groupmetadata.name: team-checkoutspec.type: teamspec.profile.displayName 可填写任意值、spec.children: []。在 /root/cba-catalog/user-youngju.yaml 中编写 User——kind: Usermetadata.name: youngju,并让 spec.memberOf 的第一项为 team-checkout
  6. /root/cba-catalog/all.yaml 中编写 Location——kind: Locationmetadata.name: cba-catalog-allspec.type: url,在 spec.targets 中用 ./catalog-info.yaml 这样的相对路径列出之前创建的七个实体文件(共 7 个)。
  7. 在集群中表示相同的所有权信息。创建命名空间 cba-commerce(标签为 app.kubernetes.io/part-of: commerce),并在其中创建 Deployment checkout-service——在元数据标签中加入 backstage.io/kubernetes-id: checkout-serviceapp.kubernetes.io/name: checkout-serviceapp.kubernetes.io/part-of: commerce,在 Pod 模板标签中也加入 backstage.io/kubernetes-id: checkout-service。镜像使用 nginx:1.27-alpine,replicas 为 1
  8. /root/cba-catalog/refs.txt 中逐行写入之前创建的所有实体(Component、API、Resource、System、Domain、Group、User——共 7 个)的规范化引用。格式为 <소문자 kind>:default/<이름>。例如:component:default/checkout-service。不包含 Location。

参考

Component 实体

/root/cba-catalog/catalog-info.yaml 中编写 Component——apiVersion: backstage.io/v1alpha1kind: Componentmetadata.name: checkout-servicemetadata.description 可填写任意句子;在 metadata.annotations 中加入 backstage.io/techdocs-ref: dir:.backstage.io/kubernetes-id: checkout-service;设置 spec.type: servicespec.lifecycle: productionspec.owner: group:team-checkoutspec.system: commerce,并让 spec.providesApis 的第一项为 checkout-api

Component 的必需 spec 是 type、lifecycle 和 owner。所有者应指向团队而不是个人,并明确写出引用格式的前缀。

API 实体

/root/cba-catalog/api-checkout.yaml 中编写 API——kind: APImetadata.name: checkout-apispec.type: openapispec.lifecycle: productionspec.owner: group:team-checkoutspec.system: commerce,并在 spec.definition 中写入以 openapi: 3.0.0 开头的多行字符串(块标量)。

API 实体将定义(definition)保存为字符串。使用 YAML 块标量可以原样保存多行内容。

Resource 实体

/root/cba-catalog/resource-db.yaml 中编写 Resource——kind: Resourcemetadata.name: checkout-dbspec.type: databasespec.owner: group:team-checkoutspec.system: commerce

Resource 是组件所需的基础设施。表示种类的字段名与 Component 相同。

System 与 Domain

/root/cba-catalog/system-commerce.yaml 中编写 System——kind: Systemmetadata.name: commercespec.owner: group:team-checkoutspec.domain: retail。在 /root/cba-catalog/domain-retail.yaml 中编写 Domain——kind: Domainmetadata.name: retailspec.owner: group:team-checkout

System 是一组协同工作的对象,Domain 是多个系统的上层领域。连接两者的字段位于 System 一侧。

Group 与 User

/root/cba-catalog/group-team-checkout.yaml 中编写 Group——kind: Groupmetadata.name: team-checkoutspec.type: teamspec.profile.displayName 可填写任意值、spec.children: []。在 /root/cba-catalog/user-youngju.yaml 中编写 User——kind: Usermetadata.name: youngju,并让 spec.memberOf 的第一项为 team-checkout

Group 代表团队,User 代表个人。表示个人所属团队的字段位于 User 一侧。

用 Location 汇总

/root/cba-catalog/all.yaml 中编写 Location——kind: Locationmetadata.name: cba-catalog-allspec.type: url,在 spec.targets 中用 ./catalog-info.yaml 这样的相对路径列出之前创建的七个实体文件(共 7 个)。

Location 是指向其他实体文件的路标。只有被指向的目标真实存在时,它才有意义。

用集群标签表示相同的所有权

在集群中表示相同的所有权信息。创建命名空间 cba-commerce(标签为 app.kubernetes.io/part-of: commerce),并在其中创建 Deployment checkout-service——在元数据标签中加入 backstage.io/kubernetes-id: checkout-serviceapp.kubernetes.io/name: checkout-serviceapp.kubernetes.io/part-of: commerce,在 Pod 模板标签中也加入 backstage.io/kubernetes-id: checkout-service。镜像使用 nginx:1.27-alpine,replicas 为 1

Kubernetes 插件会查找标签值与实体注解值相同的工作负载。请分清实体使用注解、工作负载使用标签。

规范化实体引用

/root/cba-catalog/refs.txt 中逐行写入之前创建的所有实体(Component、API、Resource、System、Domain、Group、User——共 7 个)的规范化引用。格式为 <소문자 kind>:default/<이름>。例如:component:default/checkout-service。不包含 Location。

规范化格式中,kind 使用小写,并且不能省略命名空间。之前创建的所有实体都是目标。