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 - 같은 이름을 공유하는 또 다른 위치된 클러스터를 안정적으로 대상으로 할 수 없어요.