为Kite开发集群内基于exec参数启动kubelogin的OIDC认证功能

现状 我在集群中使用Keycloak + kubelgoin + Webhook的认证模式,具体流程如下: 在API-Server中将认证模式设置为Webhook模式,由Webhook手动校验OIDC 执行kubectl时,exec命令启动kubelogin,以device-code形式唤起Keycloak进行认证 认证完成后Keycloak给出token,由kubectl将id_token添加到GET请求的Authorization字段发送至API-Server API-Server向Webhook POST一个TokenReview,Webhook解析token、验证后根据规则组装成UserInfo发往后续准入环节等 现在项目中引入了Kite作为集群管理面板 Kite的底层是通过K8s-Client向API-Server发送HTTP请求执行相应操作,本质上与kubectl相似,且都需要读取预先配置的kubeconfig文件获取配置上下文,如集群地址、当前集群用户、用户证书等 不足 Kite本身不负责集群身份认证,而是将安全性转移至进入Kite面板的认证。因此Kite虽然原生支持OIDC,但只能支持进入Kite管理界面时的OIDC认证,而非集群内身份认证 也正因这个原因,Kite无法处理kubeconfig中配置了exec参数动态获取认证凭证的用户,在界面中将该用户上下文显示为不可用状态 为了解决这个问题,Kite创建了一个专用的Service Account,并使用其token通过集群认证(将token放入kubeconfig然后被Kite正常读取使用) 需求 我需要二次开发Kite,使Kite支持进行集群内OIDC device-code模式认证 用户只需要指定Issuer、client_secret等必要信息,即可提供Keycloak认证界面供用户进行认证 认证通过后,需要能够接收Keycloak响应的各种token 记录该token,禁用原kubeconfig配置 之后调用K8s-Client发送API请求时都在Authorization字段附加token 如果token过期,则在前端提示用户需要重新进行OIDC认证 如果请求被准入环节拦截,需要提示用户根据准入规定重新认证 / 增量认证 / 拒绝请求 准备 使用Postman测试不带Authorization的API请求响应,返回403: { "kind": "Status", "apiVersion": "v1", "metadata": {}, "status": "Failure", "message": "nodes is forbidden: User \"system:anonymous\" cannot list resource \"nodes\" in API group \"\" at the cluster scope", "reason": "Forbidden", "details": { "kind": "nodes" }, "code": 403 } 使用Postman附带Keycloak客户端ID、客户端Secret向$base_url发送认证请求: { "device_code": "vfpIiDEl8-M7euodTglJTkbUnKr99l7GGDNQK7If0EM", "user_code": "PSWY-TSRS", "verification_uri": "https://192.168.5.96:31443/realms/k8s-auth/device", "verification_uri_complete": "https://192.168.5.96:31443/realms/k8s-auth/device?user_code=PSWY-TSRS", "expires_in": 600, "interval": 5 } 认证完成后尝试拉取Token: ...

April 9, 2026