Skip to main content

Kubernetes 后端代理端点

贡献者希望基于 Kubernetes 的数据创建开发人员门户体验(例如与定制资源超越现有 Kubernetes 插件的默认行为)可以利用 Kubernetes 后端插件的代理端点,让它们可以任意请求到REST API.

下面是使用KubernetesBackendClientlibrary

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头作为目标群集的名称。 该名称将与所有配置的集群定位器-- 第一个群组,其姓名与标头中的值相匹配的内容将成为目标。

然后,请求将被转发到群集。

总体而言,每项要求的唯一变化是

  • 端点的基础 URL 前缀会被剥离。 Backstage-Kubernetes-Authorization 标头会变成转发请求时使用的 Authorization 标头。

代理希望KubernetesAuthTranslator来装饰所有带有Auth默认情况下,它通过提供一个serviceAccountToken字段变成clusterDetails使用定义的authProviderclusterDetails.

验证

代理不支持 mTLS,因此不能用于连接使用x509 客户证书认证策略。目前的/proxy实施期望不记名令牌作为Backstage-Kubernetes-Authorization该标记将用作目标群集的Authorization头,将请求转发给目标群集。

如何通过权限政策禁用代理端点

kubernetes 插件可以禁止使用proxy这种集成允许管理员使用定义明确的许可政策来限制端点的使用。proxy即使端点附加了集群授权的有效 ID 标记,它也会返回 403 错误,从而让集成商确信 backstage 不会代表不受欢迎的一方访问 kubernetes 集群。

该功能假定您的Backstage实例已启用权限框架

政策范例如下

packages/backend/src/plugins/permissions.ts

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

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

将利用权限框架返回以下响应:

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

即使附加了集群会授权的有效 ID 令牌。

其他已知限制

委托书在Backstage 1.9有一个已知的错误:

  • #15901 - 它无法可靠地锁定与另一个定位集群共享相同名称的集群。