使用后台的Kubernetes Plugin来检查目录中Kubernetes资源的状态
后台是什么意思?
“Backstage 最初是由 Spotify 开发的开源软件。官方文档引用的话说,…”
后台是一个用于构建开发者门户的开放平台。Backstage配备了统一的软件目录,可以恢复微服务和基础设施的秩序,并使产品团队能够快速交付高质量的代码,而不会损害其自主性。
我们可以看到,他们提供了专门给开发者使用的门户网站。主要功能如下:
-
- ソフトウェアカタログ
-
- ソフトウェアテンプレート
- 技術文書
这次我们启动Backstage,通过软件目录的功能来获取Kubernetes资源的状态。
验证环境
这次我在以下环境进行测试。
-
- Backstageの動作環境:Ubuntu 20.04.6 LTS
-
- ソースコード置き場:GitHub
- Kubernetes:EKS
事前准备
与GitHub的集成
公式文档在这里。
使用OAuth认证GitHub,并获取源代码。
首先获取GitHub的Client ID和Client Secret。
在账户的设置-开发者设置-授权应用中选择新的OAuth应用程序,
按以下方式创建OAuth应用程序。
以下为可直接复制的文本:
IP将成为启动Backstage的主机IP。请根据各自的环境将IP和端口部分替换为相应的数值。如果在本地运行,请将其设为localhost即可,不会有问题。
Homepage URL: http://localhost:3000
Authorization callback URL: http://localhost:7007/api/auth/github/handler/frame
完成后,创建Client Secret,并与Client ID一同设置为环境变量。
export AUTH_GITHUB_CLIENT_ID=xxxxx
export AUTH_GITHUB_CLIENT_SECRET=xxxxx
准备数据库
虽然可以在没有数据库的情况下使用,但每次重新启动时数据都会丢失,所以最好准备一个数据库。
请使用本文档中的docker-compose.yml,并按以下方式启动。
docker compose up -d
当程序安全启动后,请设置以下环境变量。
export POSTGRES_HOST=<ホストのIPアドレス>
export POSTGRES_PORT=5432
export POSTGRES_USER=postgres
export POSTGRES_PASSWORD=postgres
另外,最好将此处的POSTGRES_HOST IP与GitHub应用程序指定的IP保持一致。
后台的安装
请安装先决条件软件包。请注意,Node.js 必须是版本 16 或 18 才能正常运行。
sudo apt-get update -y
sudo apt install npm -y
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&\
sudo apt-get install -y nodejs
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install yarn
安装。
npx @backstage/create-app@latest
顺带提一下,如果前提软件包不完整,则会以以下错误而失败。
npx: installed 70 in 6.005s
TypeError: this.breakLines(...).flat is not a function
如果前提套件足夠,你會被問到以下的方式來詢問應用程式的名稱。
$ npx @backstage/create-app
? Enter a name for the app [required]
在这里,根据”入门”选择了输入”my-backstage-app”。
稍等片刻(在我的环境中大约需要5分钟),会弹出以下消息以完成安装。
? Successfully created my-backstage-app
已创建了一个以指定应用的名称命名的目录,因此需要移动。
cd my-backstage-app/
默认情况下,前端在localhost:3000上进行公开。为了改为通过IP访问,需要修改配置文件。配置文件名为app-config.yaml,并放置在目录中。需要修改以下3个地方:
app:
baseUrl: http://10.151.195.88:3000
backend:
baseUrl: http://10.151.195.88:7007
cors:
origin: http://10.151.195.88:3000
改变后,启动 backstage。
yarn dev
暂停一下
-
- GitHubの認証情報の設定
-
- Postgresの設定
- をapp-config.yamlに追加する。
以下是GitHub身份验证信息的设置内容。
auth:
environment: development
providers:
github:
development:
clientId: ${AUTH_GITHUB_CLIENT_ID}
clientSecret: ${AUTH_GITHUB_CLIENT_SECRET}
以下是Postgres的配置内容。
backend:
database:
- client: better-sqlite3
- connection: ':memory:'
+ client: pg
+ connection:
+ host: ${POSTGRES_HOST}
+ port: ${POSTGRES_PORT}
+ user: ${POSTGRES_USER}
+ password: ${POSTGRES_PASSWORD}
完成追加后,再次运行 “yarn dev” 以重新启动。
确认动作
确认 Kubernetes 插件的操作是否正常。
后台的插件种类繁多。
在这里尝试一下Kubernetes的插件。
安装Kubernetes插件
请点击这里访问官方网站。
进行插件安装。
yarn add --cwd packages/app @backstage/plugin-kubernetes
请打开编辑器,找到路径为 packages/app/src/components/catalog/EntityPage.tsx 的文件,并进行以下修改。
import { EntityKubernetesContent } from '@backstage/plugin-kubernetes';
In addition, make the following additions to the existing serviceEntityPage.
const serviceEntityPage = (
<EntityLayout>
{/* other tabs... */}
+ <EntityLayout.Route path="/kubernetes" title="Kubernetes">
+ <EntityKubernetesContent refreshIntervalMs={30000} />
+ </EntityLayout.Route>
</EntityLayout>
);
如果相应的目录拥有Kubernetes资源,将会显示如下所示的选项卡。
另外,参数refreshIntervalMs的意思是设置内容自动更新的间隔,如果不设置,则默认为10秒。
然后在后端也添加插件。
安装插件。
yarn add --cwd packages/backend @backstage/plugin-kubernetes-backend
创建调用Kubernetes后端插件的文件。
cat << EOF > ./packages/backend/src/plugins/kubernetes.ts
import { KubernetesBuilder } from '@backstage/plugin-kubernetes-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
import { CatalogClient } from '@backstage/catalog-client';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const catalogApi = new CatalogClient({ discoveryApi: env.discovery });
const { router } = await KubernetesBuilder.createBuilder({
logger: env.logger,
config: env.config,
catalogApi,
permissions: env.permissions,
}).build();
return router;
}
EOF
请将Kubernetes插件用于后端的index.ts进行修改。
在packages/backend/src/index.ts中使用编辑器打开,并添加以下内容。
import kubernetes from './plugins/kubernetes';
在同一个文件的main函数中,接下来添加以下内容。
async function main() {
// ...
+ const kubernetesEnv = useHotMemoize(module, () => createEnv('kubernetes'));
// ...
+ apiRouter.use('/kubernetes', await kubernetes(kubernetesEnv));
在中国的土著语言中,将以下句子进行改写(只需要一个选择):
设置集群信息(app-config.yaml)
为了进行后续的Kubernetes插件验证,我们需要进行与EKS的联动配置。
在官方文档中找不到设置方法,所以参考了Stack Overflow上的这篇文章。
将上下文与EKS匹配,使用kubectl cluster-info获取集群的终端URL。
$ kubectl cluster-info
Kubernetes control plane is running at https://xxxxxxxxxx.gr7.us-east-1.eks.amazonaws.com
使用获取的URL来向app-config.yaml文件中追加设置。请将以下的URL和名称修改为您自己的环境。如果没有使用环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,请先导出。
kubernetes:
serviceLocatorMethod:
type: 'multiTenant'
clusterLocatorMethods:
- type: 'config'
clusters:
- url: https://xxxxxxxxxx.gr7.us-east-1.eks.amazonaws.com
name: my-cluster-eks
authProvider: 'aws'
skipTLSVerify: true
skipMetricsLookup: true
auth:
environment: 'development'
providers:
aws:
development:
accessKeyId: ${AWS_ACCESS_KEY_ID}
secretAccessKey: ${AWS_SECRET_ACCESS_KEY}
设定完毕后,重新启动后台。
确认行动
请修正先前在适当的GitHub存储库中创建的catalog-info.yaml文件如下所示。
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: hello-tanzu-backstage
annotations:
github.com/project-slug: imurata/hello-tanzu-backstage
+ 'backstage.io/kubernetes-label-selector': 'app=hello-tanzu-backstage'
spec:
- type: other
+ type: service
lifecycle: unknown
owner: guests
如果使用命令创建部署资源,则会自动标记app=<deployment名称>。我们尝试使用命令创建资源。
kubectl create deploy hello-tanzu-backstage --image nginx --replicas 3 -n demo
总结
在后台进行部署到引入Kubernetes插件的过程中,确认可以看到与集群中的目录相关联的资源。
由于引入门槛较高,希望未来能更容易地引入。