【Backstage】ローカルでKubernetesと連携してみる
はじめに
BackstageとKubernetesの連携をローカルで試せるようにしていきます。
Backstageの基本的な部分については以下の記事を参考にしてください。
【CNCF】Backstage触ってみた(Software Catalog)
はじめに CNCF プロジェクトの一つである、Backstage についてざっくり紹介して、メイ
BackstageとKubernetesとの連携
BackstageとKubernetesを連携することで、Kubernetes上にデプロイされたアプリケーションの情報をBackstage上で確認することができます。
Kubernetesの機能は、BackstageのCore Featuresとして提供されていますが、使うためにはプラグインの設定が必要です。
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の情報を表示するコンポーネントを追加します。
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プラグインを追加します。
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プラグインの設定を行います。
今回は、ローカルで試すだけなので、下記のようにしています。
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
Contribute to monda00/sampleapp-for-backstage-go development by creating an account on GitHub.
Kubernetesプラグインとして必要な設定は、'backstage.io/kubernetes-id'
アノテーションを追加するだけです。
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を作成して、トークンを作成します。
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を作成します。
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'
を追加しています。
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の情報が表示されていることが確認できます。
参考
- Kubernetes | Backstage Software Catalog and Developer Platform
- add kubernetes plugin · monda00/backstage-sample@5b078f9
- monda00/sampleapp-for-backstage-nodejs
- monda00/sampleapp-for-backstage-go