【DevOps】Backstage介绍及如何在Azure Kubernetes Service上进行部署
推荐超级课程:
目录
- [【DevOps】Backstage介绍及如何在Azure Kubernetes Service上进行部署](#【DevOps】Backstage介绍及如何在Azure Kubernetes Service上进行部署)
Backstage 介绍
Backstage 是一个开源的软件开发平台,由 Spotify 开发并维护。它旨在帮助开发者更高效地构建、部署和管理软件服务。Backstage 提供了一系列工具和集成,以简化软件开发流程,并促进开发团队之间的协作。
Backstage 特性:
- 软件目录:Backstage 的软件目录向开发者展示了可用的服务,包括连接的仓库、服务所有者、最新构建和暴露的 API 等关键信息。
- 软件模板:软件模板允许用户在 Backstage 中创建组件,允许加载、设置变量和将模板发布到 GitHub。
- TechDocs:Backstage 在 "TechDocs" 下集中文档,允许工程师并行开发,将 markdown 文件与代码一起存储。
- 集成:Backstage 允许创建集成,以便从外部源拉取或发布数据,GitHub 和 Azure 作为受支持的标识提供者。
- 插件:Backstage 的开源插件库是它的最佳特性之一,允许您扩展 Backstage 的核心功能集。一些值得注意的插件包括 Azure 资源插件,用于查看与组件相关的服务的状态,以及 ArgoCD 插件,用于查看您服务的 GitOps 部署状态。
- 搜索 :最后,Backstage 的搜索功能将这些功能结合起来,允许在整个平台上搜索文档和服务。
这意味着部署、文档和搜索都集成在单个门户中。Backstage 还(使用 Kubernetes 插件)将跨集群部署的服务集中到一个中央仪表板中,将底层云从软件开发人员中抽象出来,并提供有关部署状态的 所有重要信息。
Backstage 架构
Backstage 分为三个部分。这些组件根据每个部分的三个不同贡献者组进行划分。
- 核心:由开源项目中的核心开发人员构建的基础功能。
- 应用程序:应用程序是部署和调整的 Backstage 应用程序的实例。应用程序将核心功能与额外的插件结合起来。应用程序由应用程序开发人员构建和维护,通常是公司内的生产力团队。
- 插件:使您的 Backstage 应用程序对公司有用的附加功能。插件可以是特定于公司的,也可以是开源和可重用的。
Backstage "应用程序" 层可能会让您认为 Backstage 本身不提供用于部署的 Docker 镜像。这是因为假设每个企业都需要在 "应用程序" 层进行自定义。这意味着我们必须构建自己的镜像,我们将在本文后面的部分介绍这一点。
Backstage 的系统架构具有一定的灵活性,并且会根据您的需求而有所不同。我建议您查看此处的内容:架构概述 | Backstage 软件目录和开发平台,以便做出明智的决定。三个组件是前端(Backstage UI)、后端(核心/插件应用程序逻辑和代理)以及数据库,对于生产环境,建议使用 PostgreSQL。Backstage 现在还支持缓存。您可能希望解耦您的 前端和后端,以启用前端静态托管,Backstage 支持这一点,尽管它限制了后端插件 API 的功能。在这个示例中,我们将它们部署在单个容器中。当然,建议在生产环境中将您的数据库部署在集群之外。
在 AKS 上部署Backstage
现在我们对 Backstage 和它的工作原理有了更多的了解,让我们看看如何构建它,并将其设置起来,并与各种 Azure 服务集成。
创建数据库
首先,我们需要创建我们的 Postgres 数据库。由于我们已经在 Azure 中构建,我们将使用我们的完全托管的灵活 Azure Database for PostgreSQL 作为我们的 Backstage 数据库。此服务易于设置和管理,对于在生产中部署的企业,请参考您自己的内部数据标准。
首先,让我们使用您选择的终端,并确保我们使用正确的 Azure 订阅登录:
applescript
az login
az account set --subscription <subscription id>
现在,让我们为这个项目创建我们的资源组:
applescript
az group create --name backstage--location eastus
现在,我们可以创建我们的服务器。我们将我们的姓名首字母附加到服务器名称,以避免冲突。一个服务器可以包含多个数据库:
applescript
az postgres flexible-server create --name backstagedb-{your initals} --resource-group backstage
由于默认连接方法是 公共访问(允许的 IP 地址) ,该命令将提示您确认是否要将您的 IP 地址和/或所有 IP 地址(范围为 0.0.0.0 到 255.255.255.255)添加到允许的地址列表中。为了实现本文的目标,当提示时,我将添加我的 IP 地址。这将是我们 AKS 集群将使用的相同授权 IP 地址。在生产中,建议调整这些部署以利用完整的专用网络,使用 VNET 集成和专用终结点。
创建的服务器具有以下属性:
- 与您的资源组相同的地理位置
- 自动生成的管理员用户名和管理员密码(您应该将其保存在安全的地方)
- 默认数据库名称 "flexibleserverdb"
- 剩余服务器配置的服务默认值:计算层(通用用途),计算大小/SKU(
Standard_D2s_v3
- 2 vCore,8 GB RAM),备份保留期(7 天)和 PostgreSQL 版本(13)
部署后,我们现在可以检查我们服务器的连接详细信息:
applescript
az postgres flexible-server show --name backstagedb-{your initals} --resource-group backstage
在上面的命令的顶部,请记下管理员用户名输出。
然后,我们可以更改服务器的管理员密码。
applescript
az postgres flexible-server update --resource-group backstage--name backstagedb-{your initals} --admin-password <new-password>
现在,我们可以使用 psql 从命令行测试连接。如果您使用的是 Cloud Shell,则 psql 已安装。如果不是,您可以从 此处 安装它。现在,您可以使用您生成的管理员用户和您设置的 管理员密码连接到数据库。
applescript
psql -h backstagedb-{your initals}.postgres.database.azure.com -U {your generated admin user} flexibleserverdb
如果一切配置正确,您现在应该已经登录,并且能够验证您的数据库正在运行,如下所示:
您可以通过键入 "q" 退出数据库。
现在,让我们添加一个将由 Backstage 引用的数据库。我们可以使用以下命令执行此操作:
applescript
az postgres flexible-server db create --resource-group backstage --server-name backstagedb-{your inital} --database-name backstage_plugin_catalog
对于本文,我们不需要对我们的数据库进行安全连接,以便使我们的应用程序连接更容易。这意味着我们需要使用以下内容更新我们的服务器参数:
applescript
az postgres flexible-server parameter set --resource-group testGroup --server-name servername --name require_secure_transport --value off
构建 Backstage
现在事情变得稍微复杂一些。如前所述,由于需要自定义的程度,Backstage 没有提供可以直接部署到您的集群中的镜像,例如数据库连接和插件。这意味着我们必须自己构建 Backstage。
Backstage 是用 Node 构建的。对于下一步,我们可以通过 CloudShell 或您选择的 IDE 来执行此操作。为了提高可读性,我将使用 Visual Studio Code,因为我们需要更改文件,这对于不熟悉 Vi/Vim 的人来说会更简单。
首先,我创建了一个新文件夹,并在 Visual Studio 中打开空目录。我还打开了一个 WSL 终端。
在 WSL 终端中,然后运行以下命令,它将安装 Backstage 并在执行命令的目录中创建一个 backstage-app 子目录:
applescript
npx @backstage/create-app@latest
完成后,我们可以通过以下命令在本地测试应用程序的演示版本:
applescript
cd backstage
yarn dev
一旦我们验证 Backstage 在本地运行,我们就可以向应用程序添加 Postgres 客户端:
applescript
# 从您的 Backstage 根目录
yarn --cwd packages/backend add pg
我们的下一步是将我们的数据库配置添加到应用程序中。为此,我们需要打开 app-config.yaml
并在 Backstage 应用程序的根目录中使用前面步骤中的凭据添加 PostgreSQL 配置。
主机:backstagedb-{your initals}.postgres.database.azure.com
端口:5432
applescript
backend:
database:
client: better-sqlite3 <---- 删除此现有行
connection: ':memory:' <---- 删除此现有行
# 配置选项:https://node-postgres.com/apis/client <---- 在此处添加所有以下行
client: pg
connection:
host: ${POSTGRES_HOST}
port: ${POSTGRES_PORT}
user: ${POSTGRES_USER}
password: ${POSTGRES_PASSWORD}
# https://node-postgres.com/features/ssl
# ssl:
# host 仅在连接名称与证书名称不同时需要。
# 例如,对于 CloudSQL,这是这种情况。
# host: 证书中的服务器名称
# ca:
# $file: <file-path>/server.pem
# key:
# $file: <file-path>/client.key
# cert:
# $file: <file-path>/client-cert.pem
为了演示的目的,我们将用户名和密码作为硬编码值传递到我们的 yaml 文件中。在生产中,这并不建议。请使用您接受的应用程序配置方法,如果将应用程序部署到生产环境中。
如果您已经在 Cloudshell 中部署了 sql 数据库,并且现在已移动到本地计算机,则需要在服务器防火墙的授权 IP 范围中添加您的本地计算机的 IP 地址,或者在服务器的网络选项卡上通过 CLI 更新它。
身份验证
现在我们已经设置并连接了数据库,我们可以继续进行身份验证。为此,我们将使用我们的 Microsoft Entra ID 租户。我们可以通过 CLI 执行此操作,但为了提高可读性,我将在门户中创建应用程序注册等。首先,我们需要访问我们的 Microsoft Entra ID 租户并选择 "应用程序注册"。
然后,我们选择 "新建注册",并为应用程序提供一个名称,例如 "Backstage"。我们可以将范围保留为单个租户,并将本地开发 URL 暂时放在重定向下,这将 是:
http://localhost:7007/api/auth/microsoft/handler/frame
现在,我们可以转到我们创建的应用程序注册的 API 权限,并添加以下权限:
- 电子邮件
- offline_access
- openid
- profile
- User.Read
我们还需要添加一些应用程序权限,以便稍后我们可以将用户引入 Backstage。为此,我们按照与最后一步相同的方法,但选择应用程序权限而不是委派权限。在这里,我们需要添加两个权限:
- User.Read.All
- GroupMember.Read.All
如果您的组织需要,您可能需要向应用程序授予管理员同意。这可以通过在添加权限后通过点击 "授予 ___ 管理员同意" 按钮在门户中完成。您可能想这样做,以便用户在首次登录时无需单独提供同意。
我们接下来需要为这个应用程序注册添加一个客户端密钥。这将在我们的应用程序配置中使用。为此,我们转到应用程序注册中的密钥和证书。创建后,请记下客户端密钥,因为它只显示一次。
现在,我们需要将此添加到我们的应用程序配置中。这可以在之前的同一 app-config.yaml
文件中完成,在 "Auth" 标题下。我们需要添加以下块:
applescript
auth:
environment: development
providers:
microsoft:
development:
clientId: ${AZURE_CLIENT_ID}
clientSecret: ${AZURE_CLIENT_SECRET}
tenantId: ${AZURE_TENANT_ID}
domainHint: ${AZURE_TENANT_ID}
additionalScopes:
- Mail.Send
与数据库连接一样,我将硬编码值传递到文件中。对于生产环境,建议通过秘密传递这些值。
我们还需要对应用程序源代码进行一些更改,以添加前端登录页面。为此,我们需要将以下块添加到 packages/app/src/App.tsx
。
applescript
import { microsoftAuthApiRef } from '@backstage/core-plugin-api';
import { SignInPage } from '@backstage/core-components';
然后,我们需要在同一文件的稍后位置添加另一个块。搜索 "Const app = createApp",然后在 "apis," 下面粘贴以下块:
applescript
components: {
SignInPage: props => (
<SignInPage
{...props}
auto
provider={{
id: 'microsoft-auth-provider',
title: 'Microsoft',
message: '使用 Microsoft 登录',
apiRef: microsoftAuthApiRef,
}}
/>
),
},
例如,完整的创建应用程序块应该如下所示:
applescript
const app = createApp({
apis,
components: {
SignInPage: props => (
<SignInPage
{...props}
auto
provider={{
id: 'microsoft-auth-provider',
title: 'Microsoft',
message: '使用 Microsoft 登录',
apiRef: microsoftAuthApiRef,
}}
/>
),
},
bindRoutes({ bind }) {
bind(catalogPlugin.externalRoutes, {
createComponent: scaffolderPlugin.routes.root,
viewTechDoc: techdocsPlugin.routes.docRoot,
createFromTemplate: scaffolderPlugin.routes.selectedTemplate,
});
bind(apiDocsPlugin.externalRoutes, {
registerApi: catalogImportPlugin.routes.importPage,
});
bind(scaffolderPlugin.externalRoutes, {
registerComponent: catalogImportPlugin.routes.importPage,
viewTechDoc: techdocsPlugin.routes.docRoot,
});
bind(orgPlugin.externalRoutes, {
catalogIndex: catalogPlugin.routes.catalogIndex,
});
},
});
我们应用程序代码中必须添加的另一个项目是 Microsoft 解析器。这在 Backstage 身份验证文档中没有被提及,这将节省您我花费的时间来弄清楚为什么我的登录失败。我们需要从 packages/backend/src/plugins/auth.ts
文件中删除 GitHub 示例块,并替换它。我已将完整文件粘贴在下面:
applescript
import {
createRouter,
providers,
defaultAuthProviderFactories,
} from '@backstage/plugin-auth-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger: env.logger,
config: env.config,
database: env.database,
discovery: env.discovery,
tokenManager: env.tokenManager,
providerFactories: {
...defaultAuthProviderFactories,
microsoft: providers.microsoft.create({
signIn: {
resolver:
providers.microsoft.resolvers.emailMatchingUserEntityAnnotation(),
},
}),
},
});
}
如果我们现在尝试登录,我们将通过 Entra ID 身份验证流程,但我们将会看到错误 "用户未找到"。这是因为 Backstage 还需要我们从 Entra 租户设置用户的摄取。这是因为 Backstage 中的用户实体没有账户的概念,而是将登录用户与在 Backstage 本身注册的用户实体匹配。为了将我们的 Entra 用户引入,我们需要将以下内容添加到我们的 app-config.yaml
:
applescript
catalog:
providers:
microsoftGraphOrg:
providerId:
target: https://graph.microsoft.com/v1.0
authority: https://login.microsoftonline.com
tenantId: ${TENANT_ID}
clientId: ${CLIENT_ID}
clientSecret: ${CLIENT_SECRET}
queryMode: basic
我们再次将秘密以明文形式添加到文件中,以快速启动并运行而无需构建 CI/CD 管道。在生产环境中,我们将使用运行时从安全存储中传递的 ${CLIENT_SECRET}
。
我们可以将用户或组查询添加到此提供者,以避免加载整个租户并仅选择特定用户,但在本例中,我保持了简单性。您可以通过以下方式了解如何添加用户/组过滤参数:
Microsoft Entra 租户数据 | Backstage 软件目录和开发平台
我们还需要将 MS Graph 插件添加到我们的应用程序包中。我们使用以下命令执行此操作:
applescript
# 从您的 Backstage 根目录
yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-msgraph
然后,我们必须在我们的插件目录中注册 Microsoft 实体提供者。我们通过以下更改 packages/backend/src/plugins/catalog.ts
文件来完成此操作:
applescript
builder.addEntityProvider(
MicrosoftGraphOrgEntityProvider.fromConfig(env.config, {
logger: env.logger,
schedule: env.scheduler.createScheduledTaskRunner({
frequency: { hours: 1 },
timeout: { minutes: 50 },
initialDelay: { seconds: 15},
}),
}),
);
我们的 catalog.ts
文件现在应该如下所示:
applescript
import { CatalogBuilder } from '@backstage/plugin-catalog-backend';
import { ScaffolderEntitiesProcessor } from '@backstage/plugin-catalog-backend-module-scaffolder-entity-model';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
import { MicrosoftGraphOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-msgraph';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const builder = await CatalogBuilder.create(env);
builder.addEntityProvider(
MicrosoftGraphOrgEntityProvider.fromConfig(env.config, {
logger: env.logger,
schedule: env.scheduler.createScheduledTaskRunner({
frequency: { hours: 1 },
timeout: { minutes: 50 },
initialDelay: { seconds: 15},
}),
}),
);
builder.addProcessor(new ScaffolderEntitiesProcessor());
const { processingEngine, router } = await builder.build();
await processingEngine.start();
return router;
}
我们还需要将此新提供者添加到我们的 app-config.yaml
文件中的提供者块中。我们可以在现有身份验证提供者块下方添加以下内容。
applescript
microsoftGraphOrg:
default:
tenantId: ${TENANT_ID}
user:
filter: accountEnabled eq true and userType eq 'member'
group:
filter: >
securityEnabled eq false
and mailEnabled eq true
and groupTypes/any(c:c+eq+'Unified')
schedule:
frequency: PT1H
timeout: PT50M
如果您的环境对出站访问有限制,例如当我们将其部署到 UDR 出站 AKS 集群时,我们需要确保我们的 Backstage 后端可以访问以下主机:
login.microsoftonline.com
,用于获取和交换授权代码和访问令牌graph.microsoft.com
,用于获取用户配置文件信息(如 此源代码 所示)。如果此主机无法访问,用户在尝试登录时可能会看到 "认证失败,无法获取用户配置文件" 错误。
如果我们现在停止终端中的 Backstage 并使用 Yarn Dev 重新启动,我们应该会看到一个 Microsoft Auth 登录按钮。
登录后,请随意配置 Backstage 以包括您认为合适的任何其他集成或插件。完成后,我们现在可以准备创建我们的容器镜像。这将允许我们在选择的 Azure 应用程序服务上部署 Backstage。
我们还需要更新 app.baseUrl
在我们的 app-config.yaml
中,以便在我们的本地环境之外部署应用程序。这是为了在 AKS 上部署后避免 CORS 策略问题。
applescript
app:
title: Scaffolded Backstage App
baseUrl: http://localhost:7007
organization:
name: My Company
backend:
# 用于启用身份验证,秘密由所有后端插件共享
# 请参阅 https://backstage.io/docs/auth/service-to-service-auth 了解有关格式的信息
# auth:
# keys:
# - secret: ${BACKEND_SECRET}
baseUrl: http://localhost:7007
listen:
port: 7007
# 取消注释以下主机指令以绑定到特定接口
# host: 127.0.0.1
csp:
connect-src: ["'self'", 'http:', 'https:']
# 内容安全策略指令遵循 Helmet 格式:https://helmetjs.github.io/#reference
# 默认 Helmet 内容安全策略值可以通过将键设置为 false 来删除
cors:
origin: http://localhost:7007
methods: [GET, HEAD, PATCH, POST, PUT, DELETE]
credentials: true
Access-Control-Allow-Origin: '*'
容器化 Backstage
首先,让我们开始配置一个私有的 Azure 容器注册表。我们可以使用以下命令执行此操作:
applescript
az acr create -n backstageacr${YOUR INTIALS} -g backstage --sku Premium --public-network-enabled true --admin-enabled true
当此资源正在创建时,让我们现在为我们的 Backstage 应用程序创建一个 Dockerfile。我们将进行主机构建以节省时间。我们将在主机上构建后端,无论它是本地还是 CI 管道,然后我们将构建我们的 Docker 镜像。首先,从我们的 Backstage 根文件夹,我们需要运行以下命令:
applescript
yarn install --frozen-lockfile
# tsc 将类型定义输出到存储库根目录的 dist-types/ 中,然后这些类型定义由 Dockerfile 下的构建使用
yarn tsc
# 构建后端,将所有内容捆绑到 packages/backend/dist 文件夹中。
# 此处的配置文件应与 Dockerfile 下的配置文件匹配。
yarn build:backend --config ../../app-config.yaml
现在我们需要创建 Dockerfile(如果应用程序创建没有在第一位置初始化一个)(版本依赖)。Dockerfile 如下所示:
applescript
FROM node:18-bookworm-slim
# 安装 isolate-vm 依赖项,这些依赖项由 @backstage/plugin-scaffolder-backend 需要。
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked
--mount=type=cache,target=/var/lib/apt,sharing=locked
apt-get update &&
apt-get install -y --no-install-recommends python3 g++ build-essential &&
yarn config set python /usr/bin/python3
# 安装 sqlite3 依赖项。如果您在镜像中不使用 sqlite3,则可以跳过此步骤,
# 在这种情况下,您还应该将 better-sqlite3 移动到 "devDependencies" 中 package.json。
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked
--mount=type=cache,target=/var/lib/apt,sharing=locked
apt-get update &&
apt-get install -y --no-install-recommends libsqlite3-dev
# 从这里开始,我们使用权限最低的 `node` 用户来运行后端。
USER node
# 这应该以 `node` 创建应用程序目录。
# 如果它作为 `root` 创建,则下面的 `tar` 命令将失败:`无法创建目录 'packages/':权限被拒绝`。
# 如果发生这种情况,请确保启用 BuildKit(`DOCKER_BUILDKIT=1`),以便正确地以 `node` 创建应用程序目录。
WORKDIR /app
# 这会将许多 Node.js 依赖项切换到生产模式。
ENV NODE_ENV production
# 首先复制存储库骨架,以避免不必要的 Docker 缓存失效。
# 骨架包含存储库中每个包的 package.json,以及 yarn.lock 和根 package.json,
# 这足以运行 yarn install。
COPY --chown=node:node yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./
RUN tar xzf skeleton.tar.gz && rm skeleton.tar.gz
RUN --mount=type=cache,target=/home/node/.cache/yarn,sharing=locked,uid=1000,gid=1000
yarn install --frozen-lockfile --production --network-timeout 300000
# 然后复制后端捆绑包,以及我们可能想要的任何其他文件。
COPY --chown=node:node packages/backend/dist/bundle.tar.gz app-config*.yaml ./
RUN tar xzf bundle.tar.gz && rm bundle.tar.gz
CMD ["node", "packages/backend", "--config", "app-config.yaml"]
现在,我们可以使用 ACR 任务来构建我们的镜像。镜像成功构建后,它将被推送到我们之前创建的注册表。Azure 提供了一个托管池来构建这些镜像,但 ACR 现在还支持使用自托管池进行生产环境。如果我们将端点设置为私有,我们将使用自托管池来构建镜像。
由于我们需要启用 Buildkit,我们需要使用 ACR 的多步骤 YAML 文件。创建一个名为 acr-task.yaml 的文件。它应该包含以下内容:
applescript
version: v1.0.0
stepTimeout: 1000
env:
[DOCKER_BUILDKIT=1]
steps: # 一系列图像或容器操作。
- build: -t backstageacr${YOUR_INITALS}.azurecr.io/backstageimage:v1 -f Dockerfile .
- push:
- backstageacr${YOUR_INITALS}.azurecr.io/backstageimage:v1
然后,我们可以使用以下 ACR 命令运行它:
applescript
az acr run -r backstageacroow -f acr-task.yaml .
一旦运行完成,我们应该在我们的注册表中看到我们的镜像:
现在,我们可以将此镜像部署到 Azure。将 Backstage 现在作为容器部署,为我们提供了多种平台选择。我们可以使用应用程序服务、Azure 容器应用程序或 AKS。ACA 和 AKS 最适合您的用例和架构。需要记住的是,Backstage,如我们之前所述,作为开发人员和基础设施之间的操作平台。这意味着我们需要仔细考虑网络影响,如果我们为每个组织或产品使用单个 Backstage,我们将需要能够对多个环境进行入站和出站调用。例如,使用 Kubernetes 插件,我们需要确保我们能够连接到我们想要添加到单个视图中的所有集群。
在本文的其余部分,我们将重点介绍如何将 Backstage 部署到 AKS,但我相信 ACA 在中心网络中是一个很好的 Backstage 部署目标,易于托管。我已经部署并验证了 Backstage 在 ACA 中运行。
在 Azure Kubernetes Service 上部署 Backstage
为了部署 Backstage,我们首先需要创建我们的 AKS 集群(如果尚未创建)。为此,我们可以使用以下命令。为了简单起见,我们将不使用 Azure 防火墙和 UDR 来限制入站和出站流量。如果在生产中部署,请使用您自己的部署标准。集群将需要网络访问您想要使用 Kubernetes 插件引入的任何其他集群、Git 仓库和 Postgres 数据库。
要添加管理员用户,我们需要获取我们的用户 ID。如果部署在生产环境中,这可能不是必需的,因为您的服务部署将有所不同。
要获取您的用户 ID,您可以使用以下命令:
applescript
az ad signed-in-user show --query id -o tsv
然后,我们可以使用以下命令创建我们的集群:
applescript
az aks create -g backstage -n backstagecluster --enable-aad --enable-oidc-issuer --enable-azure-rbac --load-balancer-sku standard --outbound-type loadBalancer --network-plugin azure --attach-acr backstageacr${YOUR_INITALS} --aad-admin-group-object-ids {YOUR USER ID}
我们现在需要为我们的 Backstage部署创建我们的清单。此文件可以在您的 Backstage 根目录中创建,也可以在 Backstage 根目录内的 Kubernetes 子目录中创建。根据您的需求,您的清单应该如下所示,将容器镜像替换为您所在的位置:
applescript
# kubernetes/backstage.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backstage
namespace: backstage
spec:
replicas: 1
selector:
matchLabels:
app: backstage
template:
metadata:
labels:
app: backstage
spec:
containers:
- name: backstage
image: backstageacr${YOUR_INITALS}.azurecr.io/backstageimage:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 7007
然后,我们可以使用 AKS 的命令调用功能部署清单。命令调用使用 Azure 背骨网络,避免直接连接到集群,这对于管理私有集群的管理非常有效。
首先,我们需要我们的集群 ID:
applescript
AKS_ID=$(az aks show -g backstage -n backstagecluster --query id -o tsv)
然后,我们可以使用我们之前获得的用户 ID 将角色分配给我们的用户:
applescript
az role assignment create --role "Azure Kubernetes Service RBAC Cluster Admin" --assignee <AAD-ENTITY-ID> --scope $AKS_ID --scope subscriptions/<YOUR SUBSCRIPTION ID>
现在我们可以部署我们的应用程序和服务。为此,我们需要为每个创建一个清单。我们可以在 Backstage 根目录中或 Backstage 根目录内的 Kubernetes 目录中执行此操作。为了方便,我建议使用单独的 Kubernetes 目录。
applescript
apiVersion: v1
kind: Namespace
metadata:
name: backstage
---
# kubernetes/backstage.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backstage
namespace: backstage
spec:
replicas: 1
selector:
matchLabels:
app: backstage
template:
metadata:
labels:
app: backstage
spec:
containers:
- name: backstage
image: backstageacroow.azurecr.io/backstageimage:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 7007
我们的服务应该如下所示:
applescript
# kubernetes/backstage-service.yaml
apiVersion: v1
kind: Service
metadata:
name: backstage
namespace: backstage
spec:
selector:
app: backstage
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: http
然后,我们可以使用以下命令部署它们:
applescript
az aks command invoke --name backstagecluster --resource-group backstage --command "kubectl apply -f deployment.yaml" --file kubernetes/deployment.yaml
applescript
az aks command invoke --name backstagecluster --resource-group backstage --command "kubectl apply -f backstage-service.yaml" --file kubernetes/backstage-service.yaml
很可能您希望为内部访问您的 backstage 应用程序创建某种形式的入口。如果您在 Azure 容器应用程序上这样做,可以通过点击按钮启用入口创建,在 AKS 上,您可能希望使用我们的应用程序网关容器服务来使用托管的网关资源(在之前的一篇博客中了解更多关于此产品的信息这里)。在两种情况下,您都需要更改应用程序的基 URL 为您想要托管 Backstage 的自定义域,以及相应地更改应用程序的重定向 URI,使其也指向该域。为了演示的目的,我们将通过端口转发验证我们的部署,这意味着我们可以保持我们的重定向 URI 为 localhost:7007,并且无需返回到应用程序配置/设置集群上的域和证书。
首先,让我们检查我们的部署是否成功:
applescript
az aks command invoke --name backstagecluster --resource-group backstage --command "kubectl get pods -n backstage" --file kubernetes/backstage-service.yaml
我们应该看到我们的 backstage pod 正在运行。
直到这一点,我们已经使用命令调用作为最佳实践来进行完整的配置和部署。由于我们现在想要从我们的集群将流量隧道传输到我们的本地主机,我们将需要在我们的终端中使用 kubectl。首先,我们需要使用以下命令登录到我们的集群:
applescript
az aks get-credentials --resource-group backstage --name backstagecluster --overwrite-existing
然后,我们可以执行以下操作来设置端口转发:
applescript
kubectl port-forward deployment/backstage -n backstage 7007:7007
现在,如果我们在私人浏览器中打开并导航到 http://localhost:7007,我们应该会看到我们的 backstage 应用程序。
如果导航到 localhost:7007,我们将能够查看我们的应用程序并完成我们的登录流程。我建议在私人窗口中测试此操作,否则您可能会跳过登录流程并使用您现有会话的凭据。
一旦通过身份验证,我们将看到我们的 backstage 应用程序!
总结
我们现在已经在 AKS 上部署了 Backstage,并配置了托管的 Postgres 后端和 Entra ID 身份验证,并将租户中的用户引入。我们还使用了 Azure 容器注册表来简化我们的镜像构建和部署过程。我们现在可以通过安装许多社区支持的附加插件并引入我们的 Kubernetes 集群来进一步开发我们的 Backstage 实例。如前所述,Azure 容器应用程序有可能成为集中 Backstage 部署的绝佳平台。这将允许在中心网络中部署,能够部署和监视在 spokes 中的集群或应用程序/API,而无需管理整个 AKS 集群。
如果扩展到生产环境,下一步是:
- 自定义域和内部负载均衡器,以便在网络内部进行安全的入口。
- 使用环境变量和秘密的 CI/CD 管道来构建、推送和部署应用程序。这对于需要在没有自定义域的情况下重写基应用程序 URL 的情况非常有用,例如 Container Apps 没有自定义域。更多信息请参阅此处:编写 Backstage 配置文件 | Backstage 软件目录和开发平台
- 在 Backstage 和您的理想私有 Postgres 实例之间进行安全的网络连接。