Skip to content

支持下载带 TTL 的多集群 Kubeconfig,并通过 Cluster Agent 代理使用 kubectl #695

Description

@TimeBye

背景

希望能够下载 Kubeconfig,通过本地 kubectlktctl 访问其在 Kite 中有权限的集群和资源,而不暴露目标集群的原始凭证及 API Server 地址。

功能需求

Kubeconfig 下载

  • 在顶部 Kubectl Terminal 按钮旁增加下载入口。
  • 展示当前用户有权访问且已启用的集群,支持多选并默认勾选当前集群。
  • 生成的 Kubeconfig 使用以下代理地址:
https://<kite-server>/api/v1/clusters/<cluster-uuid>/k8s-proxy
  • UUID 仅用于稳定路由,不承担认证或授权职责。
  • Kubeconfig 不得包含 kube-apiserver 真实地址、Cluster Agent Token 或 Kubernetes 原始凭证。

有状态 Kubeconfig JWT

  • 使用独立 Kubeconfig JWT,不复用浏览器登录 JWT,也不接入现有 API Key 子系统。
  • JWT 不可刷新,至少包含:
iss / sub / jti / token_use / iat / nbf / exp
  • token_use 固定为 kubeconfig
  • JWT 不包含角色、集群权限、OAuth Refresh Token 或其他敏感凭证。
  • 服务端仅存储 jti 哈希及 Token 元数据,不存储 JWT 明文。
  • 每次代理请求必须验证签名、状态记录、过期时间、撤销状态、所有者状态和当前 RBAC 权限。
  • 支持同一用户持有多个 Token,并可单独撤销,创建新 Token 不影响旧 Token。

TTL

  • 默认 30 天。
  • 提供快捷选项:1 小时、1 天、7 天、30 天、6 个月、1 年、5 年。
  • 支持通过“天 / 时 / 分 / 秒”组件自定义时长。
  • 自定义范围为 3,600~157,680,000 秒,精确到秒。
  • 前后端均需校验,后端为最终安全边界。
  • JWT 时间及数据库时间统一使用 UTC,前端按浏览器时区显示。

Token 管理

  • 账户设置增加独立的 Kubeconfig Tokens 页面,用户可查看并撤销自己的 Token。
  • 管理员增加独立的 Kubeconfig Tokens 管理页面,可查看所有者、创建时间、到期时间、状态、最后使用时间及撤销信息。
  • 列表不返回 JWT、原始 jtijti 哈希。

Kubernetes API 代理

必须支持:

  • Kubernetes discovery 和资源 CRUD;
  • kubectl get -w
  • kubectl logs -f
  • kubectl exec
  • kubectl attach
  • kubectl port-forward
  • SPDY/WebSocket Upgrade;
  • 项目指定固定版本的 ktctl 核心命令。

代理必须:

  • 按 Cluster UUID 定位集群;
  • 执行集群、namespace、资源、verb 和子资源级 Kite RBAC;
  • 转发前移除外部 JWT、Cookie 和 Impersonate-* 请求头;
  • 通过 Cluster Agent transport 注入目标集群凭证;
  • 组合而非覆盖 Cluster Agent 原有 WrapTransport,保证 Upgrade 请求认证正常;
  • 对认证及授权错误返回 Kubernetes 标准 metav1.Status

数据与迁移

  • Cluster 模型增加唯一 UUID。
  • 新集群自动生成 UUID v4。
  • 启动时幂等回填历史集群 UUID。
  • 新增独立 Kubeconfig Token 状态表,包含所有者、名称、jti 哈希、创建/到期/最后使用/撤销时间和签名密钥版本等信息。

安全要求

  • 使用独立 JWT 签名密钥、算法白名单和 kid,不与浏览器 JWT 共用密钥。
  • 支持签名密钥受控轮换。
  • Token 撤销后必须及时失效,多实例缓存不得绕过数据库状态检查。
  • 下载响应禁止缓存。
  • 提示用户将 Kubeconfig 文件权限设置为 0600
  • 审计日志不得记录 JWT、jti、哈希或目标集群凭证。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions