【Backstage】ローカルでKubernetesと連携してみる

2024.06.21
2024.06.21
Kubernetes
Backstage

はじめに

BackstageとKubernetesの連携をローカルで試せるようにしていきます。

Backstageの基本的な部分については以下の記事を参考にしてください。

【CNCF】Backstage触ってみた(Software Catalog)

【CNCF】Backstage触ってみた(Software Catalog)

はじめに CNCF プロジェクトの一つである、Backstage についてざっくり紹介して、メイ

BackstageとKubernetesとの連携

BackstageとKubernetesを連携することで、Kubernetes上にデプロイされたアプリケーションの情報をBackstage上で確認することができます。

Kubernetesの機能は、BackstageのCore Featuresとして提供されていますが、使うためにはプラグインの設定が必要です。

Backstage Software Catalog and Developer Platform

Backstage Software Catalog and Developer Platform

今回は、ローカルでKubernetesとBackstageを動かして、いろいろ試せる環境を作っていきます。

Kubernetesプラグインの設定

まずは、Backstageアプリ側でKubernetesプラグインの設定を行います。フロントエンドとバックエンド、app-config.yamlで設定が必要です。

フロントエンド

フロントエンドに、@backstage/plugin-kubernetesを追加します。

1yarn --cwd packages/app add @backstage/plugin-kubernetes

EntityPage.tsxに、Kubernetesの情報を表示するコンポーネントを追加します。

packages/app/src/components/catalog/EntityPage.tsx
1...
2import { EntityKubernetesContent } from '@backstage/plugin-kubernetes'; // 追加
3
4const serviceEntityPage = (
5  <EntityLayout>
6    ...
7    {/* 追加 */}
8    <EntityLayout.Route path="/kubernetes" title="Kubernetes">
9      <EntityKubernetesContent refreshIntervalMs={30000} />
10    </EntityLayout.Route>
11  </EntityLayout>
12);
13
14...

バックエンド

バックエンド側でも、@backstage/plugin-kubernetes-backendを追加します。

1yarn --cwd packages/backend add @backstage/plugin-kubernetes-backend

index.tsに、Kubernetesプラグインを追加します。

packages/backend/src/index.ts
1backend.add(import('@backstage/plugin-search-backend-module-techdocs/alpha'));
2
3// kubernetes plugin
4backend.add(import('@backstage/plugin-kubernetes-backend/alpha'));
5
6backend.start();

app-config.yamlの設定

次に、app-config.yamlでKubernetesプラグインの設定を行います。

今回は、ローカルで試すだけなので、下記のようにしています。

app-config.yaml
1...
2
3kubernetes:
4  serviceLocatorMethod:
5    type: 'singleTenant'
6  clusterLocatorMethods:
7    - type: 'config'
8      clusters:
9        - name: docker-k8s
10          url: 'https://127.0.0.1:6443'
11          authProvider: 'serviceAccount'
12          serviceAccountToken: ${K8S_DOCKER_TOKEN}
13          skipTLSVerify: true

対象のクラスタは、Docker DesktopのKubernetesのものを指定しています。

APIサーバーのURLは、kubectl cluster-infoで確認できます。

1❯ kubectl cluster-info
2Kubernetes control plane is running at https://127.0.0.1:6443
3CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

認証方式は、ServiceAccountのトークンを使います。また、TLSの検証もスキップするようにしています。

Backstageの起動

Backstageアプリ側の準備はできたので、起動しておきます。

1yarn dev

Componentの追加

次に、Kubernetes上にデプロイされたアプリケーションの情報をBackstage上で確認するためのComponentを追加します。

今回は、以下のサンプルアプリを使います。ルートにcatalog-info.yamlがあるので、Backstageから読み込み、Componentを追加します。

GitHub - monda00/sampleapp-for-backstage-go

GitHub - monda00/sampleapp-for-backstage-go

Contribute to monda00/sampleapp-for-backstage-go development by creating an account on GitHub.

Kubernetesプラグインとして必要な設定は、'backstage.io/kubernetes-id'アノテーションを追加するだけです。

catalog-info.yaml
1apiVersion: backstage.io/v1alpha1
2kind: Component
3metadata:
4  name: sampleapp-for-backstage-go
5  description: |
6    This is [sample app](https://github.com/monda00/sampleapp-for-backstage-go) for Backstage.
7  annotations:
8    'backstage.io/kubernetes-id': 'sampleapp-for-backstage-go' # Kubernetesオブジェクトを特定するためのID
9  links:
10    - url: https://github.com/monda00/sampleapp-for-backstage-go
11      title: GitHub Repo
12      icon: github
13spec:
14  type: service
15  lifecycle: prduction
16  system: backstage-example-app
17  owner: masa
18  dependsOn:
19    - resource:backend-db
20  providesApis:
21    - sample-api

ローカルKubernetesの準備

最後に、ローカルのKubernetesの準備をします。

ServiceAccountのトークンの作成

認証用のServiceAccountのトークンを作成します。今回は、default Namespaceのdefault ServiceAccountを使います。

下記のSecretを作成して、トークンを作成します。

default-token.yaml
1apiVersion: v1
2kind: Secret
3metadata:
4  name: default-token
5  namespace: default
6  annotations:
7    kubernetes.io/service-account.name: default
8type: kubernetes.io/service-account-token
1kubectl apply -f default-token.yaml

Secretを作成したら、トークンを取得して、app-config.yamlで指定していた環境変数に設定します。

1K8S_DOCKER_TOKEN=$(kubectl -n default get secret default-token -o go-template='{{.data.token | base64decode}}')

ClusterRoleの作成

次に、default ServiceAccountに対して、Kubernetesのリソースを読み取るためのClusterRoleとClusterRoleBindingを作成します。

cluster-role.yaml
1apiVersion: rbac.authorization.k8s.io/v1
2kind: ClusterRole
3metadata:
4  name: backstage-read-only
5rules:
6  - apiGroups:
7      - '*'
8    resources:
9      - pods
10      - configmaps
11      - services
12      - deployments
13      - replicasets
14      - horizontalpodautoscalers
15      - ingresses
16      - statefulsets
17      - limitranges
18      - resourcequotas
19      - daemonsets
20    verbs:
21      - get
22      - list
23      - watch
24  - apiGroups:
25      - batch
26    resources:
27      - jobs
28      - cronjobs
29    verbs:
30      - get
31      - list
32      - watch
33  - apiGroups:
34      - metrics.k8s.io
35    resources:
36      - pods
37    verbs:
38      - get
39      - list
40---
41apiVersion: rbac.authorization.k8s.io/v1
42kind: ClusterRoleBinding
43metadata:
44  name: backstage-read-only
45subjects:
46- kind: ServiceAccount
47  name: default
48  namespace: default
49roleRef:
50  kind: ClusterRole
51  name: backstage-read-only
52  apiGroup: rbac.authorization.k8s.io
1kubectl apply -f cluster-role.yaml

サンプルアプリケーションのデプロイ

最後に、サンプルアプリケーションをデプロイします。

まずは、デプロイするNamespaceを作成します。

1kubectl create namespace sample-dev

次に、サンプルアプリケーションをデプロイします。内容はDeploymentとServiceのみです。

Backstageから検出できるように、Deployment、Pod、Serviceのラベルに'backstage.io/kubernetes-id'を追加しています。

sampleapp-for-backstage-go.yaml
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: sampleapp-go-dev
5  namespace: sample-dev
6  labels:
7    'backstage.io/kubernetes-id': 'sampleapp-for-backstage-go' # Backstageで特定するためのID
8spec:
9  replicas: 2
10  selector:
11    matchLabels:
12      app: sampleapp-go-dev
13  template:
14    metadata:
15      labels:
16        app: sampleapp-go-dev
17        'backstage.io/kubernetes-id': 'sampleapp-for-backstage-go' # Backstageで特定するためのID
18    spec:
19      containers:
20      - name: go-app
21        image: monda00/sample-for-backstage-go:0.0.1
22---
23apiVersion: v1
24kind: Service
25metadata:
26  name: sampleapp-go-dev
27  namespace: sample-dev
28  labels:
29    'backstage.io/kubernetes-id': 'sampleapp-for-backstage-go' # Backstageで特定するためのID
30spec:
31  ports:
32  - protocol: TCP
33    port: 3000
34    targetPort: 3000
1kubectl apply -f sampleapp-for-backstage-go.yaml

BackstageからKubernetesの確認

これで、Backstage自体の設定、Componentの準備、Kubernetesリソースの準備ができました。

登録したComponentを確認すると、Kubernetesの情報が表示されていることが確認できます。

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee