본문 바로가기
WIKI 기술 지식 베이스

설치

원문 보기 위키 갱신

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 정보가 표시되지 않으면 트러블슈팅해야 해요.

더 알아보기 (Learn more)