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

Kubernetes 백엔드 프록시 엔드포인트

원문 보기 위키 갱신

Kubernetes의 데이터에 기반한 개발자 포털 경험을 만들고 싶은 기여자들(예: 기존 Kubernetes 플러그인의 기본 동작을 넘어 사용자 지정 리소스와 상호작용하려는 경우)은 Kubernetes 백엔드 플러그인의 프록시 엔드포인트를 활용해 REST API에 임의의 요청을 할 수 있어요.

출처: 문서

본문

Kubernetes의 데이터에 기반한 개발자 포털 경험을 만들고 싶은 기여자들(예: 기존 Kubernetes 플러그인의 기본 동작을 넘어 사용자 지정 리소스와 상호작용하려는 경우)은 Kubernetes 백엔드 플러그인의 프록시 엔드포인트를 활용해 REST API에 임의의 요청을 할 수 있어요.

KubernetesBackendClient 라이브러리를 사용해 네임스페이스를 가져오는 스니펫은 다음과 같아요.

import { useApi } from '@backstage/core-plugin-api';
import { kubernetesApiRef } from '@backstage/plugin-kubernetes';

const CLUSTER_NAME = ''; // use a known cluster name
const kubernetesApi = useApi(kubernetesApiRef);
await kubernetesApi.proxy(CLUSTER_NAME, '/api/v1/namespaces');

작동 방식

프록시는 Backstage-Kubernetes-Cluster 헤더를 대상으로 할 클러스터의 이름으로 해석해요. 이 이름은 모든 구성된 클러스터 locator가 반환한 각 클러스터와 비교되며, name 필드가 헤더의 값과 일치하는 첫 번째 클러스터가 대상이 돼요.

그런 다음 요청이 클러스터로 전달돼요.

전반적으로 각 요청에 대한 변경 사항은 오직 다음과 같아요.

  • 엔드포인트의 기본 URL 접두사가 제거돼요.
  • Backstage-Kubernetes-Authorization 헤더가 요청 전달 시 사용되는 Authorization 헤더가 돼요.

프록시는 기본적으로 모든 요청을 Auth로 장식하는 데 사용되는 KubernetesAuthTranslator가 제공되기를 기대해요. 이는 clusterDetails에 정의된 authProvider를 사용해 clusterDetails에 serviceAccountToken 필드를 공급함으로써 그렇게 해요.

인증

프록시는 mTLS에 대한 설비가 없으므로 x509 클라이언트 인증서 인증 전략을 사용하는 클러스터에 연결하는 데 사용할 수 없어요.

현재 /proxy 구현은 대상 클러스터에 대한 Backstage-Kubernetes-Authorization 헤더로 제공되는 Bearer 토큰을 기대해요. 이 토큰은 대상 클러스터에 요청을 전달할 때 Authorization 헤더로 사용될 거예요.

PermissionPolicy로 프록시 엔드포인트를 비활성화하는 방법

kubernetes 플러그인은 권한 프레임워크를 활용해 proxy 엔드포인트의 사용을 비활성화할 수 있어요. 이 통합은 관리자가 잘 정의된 PermissionPolicy를 사용해 엔드포인트의 사용을 완전히 제한할 수 있게 해줘요. 클러스터가 인가할 유효한 ID 토큰이 붙어 있어도 proxy 엔드포인트는 403 오류를 반환할 수 있어서, 통합자는 Backstage가 원치 않는 당사자를 대신해 Kubernetes 클러스터에 접근하지 않고 있다는 확신을 가질 수 있어요.

이 기능은 Backstage 인스턴스가 권한 프레임워크를 활성화했다고 가정해요.

다음과 같은 샘플 정책:

import {
  AuthorizeResult,
  PolicyDecision,
} from '@backstage/plugin-permission-common';
import {
  PermissionPolicy,
  PolicyQuery,
  PolicyQueryUser,
} from '@backstage/plugin-permission-node';

class KubernetesDenyAllProxyEndpointPolicy implements PermissionPolicy {
  async handle(
    request: PolicyQuery,
    user?: PolicyQueryUser,
  ): Promise<PolicyDecision> {
    if (request.permission.name === 'kubernetes.proxy') {
      return {
        result: AuthorizeResult.DENY,
      };
    }
    return { result: AuthorizeResult.ALLOW };
  }
}

은 클러스터가 인가할 유효한 ID 토큰이 붙어 있어도 권한 프레임워크를 활용해 다음 응답을 반환할 거예요.

{
  "error": {
    "name": "NotAllowedError"
  }
}

기타 알려진 제한 사항

Backstage 1.9에서 릴리스된 프록시에는 알려진 버그가 있어요.

  • #15901 - 같은 이름을 공유하는 또 다른 위치된 클러스터를 안정적으로 대상으로 할 수 없어요.

더 알아보기 (Learn more)