설치
Kubernetes 기능은 Backstage의 플러그인이에요. 소프트웨어 카탈로그에서 엔티티를 볼 때 탭으로 노출돼요.
출처: 문서
본문
Kubernetes 기능은 Backstage의 플러그인이에요. 소프트웨어 카탈로그에서 엔티티를 볼 때 탭으로 노출돼요.
아직 Backstage를 설정하지 않았다면 시작하기 가이드를 읽으세요.
Kubernetes 프론트엔드 플러그인 추가하기
첫 단계는 Kubernetes 프론트엔드 플러그인을 Backstage 애플리케이션에 추가하는 것이에요.
Backstage 루트 디렉터리에서
yarn --cwd packages/app add @backstage/plugin-kubernetes
설치되면 플러그인은 기본 기능 검색을 통해 앱에서 자동으로 사용할 수 있게 돼요. Kubernetes 리소스가 연결된 엔티티의 엔티티 페이지에 "Kubernetes" 탭을 추가해요. 자세한 내용과 대체 설치 방법은 플러그인 설치하기를 참고하세요.
Kubernetes 탭은 엔티티 주석에 기반해 Kubernetes 데이터를 사용할 수 있는 엔티티에 기본적으로 표시돼요. app-config.yaml을 통해 탭의 엔티티 필터를 사용자 지정할 수 있어요.
app-config.yaml
app:
extensions:
- entity-content:kubernetes/kubernetes:
config:
filter:
metadata.annotations.backstage.io/kubernetes-id:
$exists: true
이제 끝이에요! 하지만 프론트엔드가 작동하려면 이제 Kubernetes 백엔드 플러그인이 필요해요.
Kubernetes 백엔드 플러그인 추가하기
먼저 백엔드 패키지를 추가해야 해요.
Backstage 루트 디렉터리에서
yarn --cwd packages/backend add @backstage/plugin-kubernetes-backend
그런 다음 백엔드 index.ts 파일에 추가하세요.
packages/backend/src/index.ts
const backend = createBackend();
// Other plugins...
backend.add(import('@backstage/plugin-kubernetes-backend'));
backend.start();
이제 끝이에요! Kubernetes 프론트엔드와 백엔드가 Backstage 앱에 추가되었어요.
사용자 지정 클러스터 발견
기존 클러스터 locator 중 어느 것도 사용 사례에 맞지 않으면 사용자 지정 KubernetesClustersSupplier를 구현할 수 있어요.
매우 단순화된 예시는 다음과 같아요.
packages/backend/src/index.ts
import { createBackend } from '@backstage/backend-defaults';
import { createBackendModule } from '@backstage/backend-plugin-api';
import { Duration } from 'luxon';
import {
ClusterDetails,
KubernetesClustersSupplier,
kubernetesClusterSupplierExtensionPoint,
kubernetesServiceLocatorExtensionPoint,
} from '@backstage/plugin-kubernetes-node';
export class CustomClustersSupplier implements KubernetesClustersSupplier {
constructor(private clusterDetails: ClusterDetails[] = []) {}
static create(refreshInterval: Duration) {
const clusterSupplier = new CustomClustersSupplier();
// setup refresh, e.g. using a copy of https://github.com/backstage/backstage/blob/master/plugins/kubernetes-backend/src/service/runPeriodically.ts
runPeriodically(
() => clusterSupplier.refreshClusters(),
refreshInterval.toMillis(),
);
return clusterSupplier;
}
async refreshClusters(): Promise<void> {
this.clusterDetails = []; // fetch from somewhere
}
async getClusters(): Promise<ClusterDetails[]> {
return this.clusterDetails;
}
}
const backend = createBackend();
export const kubernetesModuleCustomClusterDiscovery = createBackendModule({
pluginId: 'kubernetes',
moduleId: 'custom-cluster-discovery',
register(env) {
env.registerInit({
deps: {
clusterSupplier: kubernetesClusterSupplierExtensionPoint,
serviceLocator: kubernetesServiceLocatorExtensionPoint,
},
async init({ clusterSupplier, serviceLocator }) {
// simple replace of the internal dependency
clusterSupplier.addClusterSupplier(
CustomClustersSupplier.create(Duration.fromObject({ minutes: 60 })),
);
// there's also the ability to get access to some of the default implementations of the extension points where
// necessary:
serviceLocator.addServiceLocator(
async ({ getDefault, clusterSupplier }) => {
// get access to the default service locator:
const defaultImplementation = await getDefault();
// build your own with the clusterSupplier dependency:
return new MyNewServiceLocator({ clusterSupplier });
},
);
},
});
},
});
// Other plugins...
backend.add(import('@backstage/plugin-kubernetes-backend'));
backend.add(kubernetesModuleCustomClusterDiscovery);
backend.start();
참고
이 예시는 @backstage/plugin-kubernetes-node과 luxon 패키지의 항목들을 사용해요. 이 예시를 그대로 작동시키려면 그것들을 추가해야 해요.
구성(Configuration)
코드에 플러그인을 설치한 후에는 플러그인을 구성해야 해요.
트러블슈팅
코드에 플러그인을 설치한 후에도 Kubernetes 정보가 표시되지 않으면 트러블슈팅해야 해요.