资讯动态

Kubernetes Python 异步客户端 authorization/v1 API 实战指南:用 AuthorizationV1Api 完成访问授权评审

发布时间:2026/9/29 22:18:32 来源:尧图企业网站定制
后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载本篇技术指南围绕官方 Kubernetes Python 客户端kubernetes 项目异步分支中的kubernetes.aio.client.api.authorization_v1_api模块展开完整讲解AuthorizationV1Api的五个公开方法、底层 REST 端点、请求/响应模型与异步调用范式并结合源码给出可直接运行的鉴权检查示例。读完本文你将能够在 asyncio 程序中发起 SubjectAccessReview、LocalSubjectAccessReview、SelfSubjectAccessReview、SelfSubjectRulesReview 四类授权评审并自行判断当前凭据或任意主体是否具备某项操作权限。一、模块定位异步客户端中的授权评审入口AuthorizationV1Api是官方 Python 客户端异步aio分支中负责authorization.k8s.io/v1 API 组的客户端类位于 kubernetes/aio/client/api/authorization_v1_api.py共 1695 行。与之对应同步分支存在同名类 kubernetes/client/api/authorization_v1_api.py1409 行两者方法签名与语义一致区别仅在于异步分支的公开方法全部以async def定义并通过pydantic的validate_call装饰器进行请求参数校验。该类已在 kubernetes/aio/client/init.py 的__all__中导出可通过from kubernetes.aio import client后以client.AuthorizationV1Api(api_client)直接实例化使用。从源码结构看authorization_v1_api.py 第 39-61 行其构造函数支持传入现成的ApiClient未传入时会自动获取默认或新建客户端同时实现了close()、__aenter__()、__aexit__()因此既可以显式await api.close()也可以配合async with使用由上下文管理器自动释放底层 HTTP 会话。该模块文档入口为 Sphinx 自动生成页 doc/source/kubernetes.aio.client.api.authorization_v1_api.rst通过automodule指令自动收录类与方法的全部 docstring。二、五个公开方法总览AuthorizationV1Api共提供 5 个面向业务调用的公开异步方法源码中可通过async def方法名确认见 authorization_v1_api.py方法功能底层端点create_subject_access_review(body, ...)以指定主体user/groups/uid/extra发起集群级授权评审POST /apis/authorization.k8s.io/v1/subjectaccessreviewscreate_namespaced_local_subject_access_review(namespace, body, ...)在指定命名空间内以指定主体发起授权评审作用域仅限该命名空间POST /apis/authorization.k8s.io/v1/namespaces/{namespace}/localsubjectaccessreviewscreate_self_subject_access_review(body, ...)以当前请求方身份发起授权评审POST /apis/authorization.k8s.io/v1/selfsubjectaccessreviewscreate_self_subject_rules_review(body, ...)返回当前请求方在指定命名空间内可执行的全部规则POST /apis/authorization.k8s.io/v1/selfsubjectrulesreviewsget_api_resources()获取该 API 组下的可用资源列表GET /apis/authorization.k8s.io/v1/上述端点路径与 HTTP 方法均能在对应私有_*_serialize方法中直接验证例如_create_subject_access_review_serialize中的resource_path/apis/authorization.k8s.io/v1/subjectaccessreviews、methodPOSTauthorization_v1_api.py 第 1430-1432 行_create_namespaced_local_subject_access_review_serialize中则带{namespace}路径参数第 403-405 行_get_api_resources_serialize为methodGET且无路径参数第 1682-1684 行。除了这三个面向调用的公开方法每个方法还自动生成了两个变体create_xxx_with_http_info(...)返回ApiResponse[Model]除数据外还携带 HTTP 状态码、响应头等完整信息create_xxx_without_preload_content(...)返回RESTResponseType不预加载响应体适合流式或手工解析场景。三种形态均经validate_call(config{defer_build: True})校验并统一走await self.api_client.call_api(...)→await response_data.read()→self.api_client.response_deserialize(...)的调用链见 create_subject_access_review 实现第 1162-1188 行。三、请求模型与字段详解四类 Review 请求体的核心结构相同apiVersion、kind、metadata、必填的spec与可选的status。以V1SubjectAccessReview为例其模型定义在 kubernetes/aio/client/models/v1_subject_access_review.pyspec为必填、status由服务端回填。3.1 SubjectAccessReviewSpec描述谁要做什么模型文件 kubernetes/aio/client/models/v1_subject_access_review_spec.py 定义了以下字段字段类型说明userstr被测试的用户若只填user不填groups将被解释为该用户不属于任何组groupsList[str]被测试的用户所属组uidstr发起请求用户的信息extraDict[str, List[str]]对应认证器user.Info.GetExtra()的输出作为鉴权输入需要在此反映resource_attributesV1ResourceAttributes针对资源类请求的鉴权属性non_resource_attributesV1NonResourceAttributes针对非资源类请求如/healthz、/api的鉴权属性注意模型 docstring 明确指出resourceAttributes与nonResourceAttributes二者必须且只能设置一个。3.2 ResourceAttributes资源请求的鉴权维度V1ResourceAttributeskubernetes/aio/client/models/v1_resource_attributes.py描述一次资源操作字段如下verbKubernetes 资源 API 动词如get、list、watch、create、update、delete、proxy*表示全部groupAPI 组*表示全部versionAPI 版本*表示全部resource资源类型如pods、deployments*表示全部subresource子资源表示无name资源名称表示全部仅对get或delete语义生效namespace命名空间。对LocalSubjectAccessReview为空串对集群级资源为空对命名空间级资源的SubjectAccessReview/SelfSubjectAccessReview中空串表示 allfield_selectorV1FieldSelectorAttributes与label_selectorV1LabelSelectorAttributes用于精细限定请求范围的字段/标签选择器。3.3 NonResourceAttributes非资源请求的鉴权维度V1NonResourceAttributeskubernetes/aio/client/models/v1_non_resource_attributes.py仅两个字段path请求的 URL 路径与verb标准 HTTP 动词。3.4 SubjectAccessReviewStatus评审结果评审结果由服务端返回在status字段中模型见 kubernetes/aio/client/models/v1_subject_access_review_status.pyallowedbool必填True表示该操作将被允许deniedbool可选True表示将被拒绝若allowed与denied均为False表示鉴权器对该操作无意见allowedTrue时denied不得为TrueevaluationErrorstr可选评审过程中发生的错误提示例如 RBAC 缺失某个 Role 但其余角色已足以支撑判断此时仍可能给出鉴权结论reasonstr可选允许或拒绝的原因说明。四、公共查询参数与请求特征四个create_*方法均接收一组公共可选查询参数源码 docstring 与_*_serialize中均有明确说明见 authorization_v1_api.py 第 1387-1404 行参数传输方式取值与语义dry_runquerydryRun置为All时执行全部 dry-run 阶段但不持久化任何修改非法或无法识别的取值将直接返回错误field_managerqueryfieldManager与本次变更关联的 actor 名称长度须小于 128 字符且仅含可打印字符field_validationqueryfieldValidationIgnore忽略未知字段v1.23 之前默认行为、Warn对每个被丢弃的未知字段与重复字段发送警告头v1.23 默认、Strict存在未知/重复字段时以 BadRequest 失败并返回全部违规字段prettyqueryprettytrue时美化输出默认false除非 User-Agent 表明是浏览器或 curl/wget 等命令行 HTTP 工具此外create_namespaced_local_subject_access_review还要求必填namespace路径参数object name and auth scope, such as for teams and projects。从请求装配源码可以看到两个值得注意的实现细节Accept 头所有请求默认声明可接受application/json、application/yaml、application/vnd.kubernetes.protobuf、application/cbor四种媒体类型第 1412-1421 行由api_client.select_header_accept协商认证方式所有请求的_auth_settings均为[BearerToken]第 1424-1427 行即依赖 kubeconfig 或 ServiceAccount 注入的 Bearer Token 完成身份认证。每个方法还提供_request_timeout单个数值为总超时元组(connect, read)为连接/读取超时、_request_auth覆盖单次请求的认证设置、_content_type、_headers、_host_index等底层透传参数。响应状态码映射为200/201/202返回对应模型、401返回空见 create_subject_access_review 的_response_types_map第 1174-1179 行。五、实战示例在 asyncio 程序中执行授权评审官方异步分支的典型用法见 examples_asyncio/list_pods.py先await config.load_kube_config()加载默认 kubeconfig再以async with ApiClient() as api:创建上下文并传入各 API 类。以下示例演示如何用AuthorizationV1Api完成两类最常见评审。5.1 SelfSubjectAccessReview校验当前凭据是否有权import asyncio from kubernetes.aio import client, config from kubernetes.aio.client.api_client import ApiClient from kubernetes.aio.client.models import ( V1SelfSubjectAccessReview, V1SelfSubjectAccessReviewSpec, V1ResourceAttributes, ) async def main(): await config.load_kube_config() async with ApiClient() as api: authz client.AuthorizationV1Api(api) review V1SelfSubjectAccessReview( api_versionauthorization.k8s.io/v1, kindSelfSubjectAccessReview, specV1SelfSubjectAccessReviewSpec( resource_attributesV1ResourceAttributes( verbget, groupapps, versionv1, resourcedeployments, namespacedefault, namenginx, ) ), ) result await authz.create_self_subject_access_review(bodyreview) print(allowed:, result.status.allowed) print(reason:, result.status.reason) print(evaluationError:, result.status.evaluation_error) if __name__ __main__: asyncio.run(main())create_self_subject_access_review以请求方自身身份发起评审特别适合在应用启动时自检当前 ServiceAccount 是否具备运行所需的 RBAC 权限。5.2 SubjectAccessReview以任意主体身份评审如需为其他用户或组做预授权判断例如管理面批量校验某用户对多个资源的权限改用create_subject_access_reviewfrom kubernetes.aio.client.models import ( V1SubjectAccessReview, V1SubjectAccessReviewSpec, V1ResourceAttributes, ) review V1SubjectAccessReview( api_versionauthorization.k8s.io/v1, kindSubjectAccessReview, specV1SubjectAccessReviewSpec( useralice, groups[dev, platform], resource_attributesV1ResourceAttributes( verbcreate, group, versionv1, resourcepods, namespacestaging, ), ), ) result await authz.create_subject_access_review(bodyreview) print(allowed:, result.status.allowed, | reason:, result.status.reason)注意spec中resource_attributes与non_resource_attributes必须恰好设置一个若groups留空而仅指定user语义等同于假设该用户不属于任何组。5.3 命名空间限定与规则枚举若只想在某个命名空间内做评审避免把集群级判断引入局部上下文使用create_namespaced_local_subject_access_review(namespacestaging, body...)请求体会被发送到/apis/authorization.k8s.io/v1/namespaces/staging/localsubjectaccessreviewsV1ResourceAttributes.namespace也会默认解释为空串。若想一次性获得当前主体在某个命名空间内可执行的全部规则可构造V1SelfSubjectRulesReviewspec 含namespace字段调用create_self_subject_rules_review(body...)返回的status.resource_rules与status.non_resource_rules即该主体的有效权限清单。5.4 获取 API 组资源清单get_api_resources()无必填参数直接返回V1APIResourceList可用于在程序内动态发现 authorization.k8s.io/v1 提供的资源类型实现通用化的客户端能力探测resources await authz.get_api_resources() for r in resources.resources: print(r.name, r.verbs)六、异步实现原理与同步分支对照AuthorizationV1Api的每个公开异步方法内部遵循统一模板以 create_subject_access_review第 1106-1188 行 为例await self._create_subject_access_review_serialize(...)将命名参数装配为RequestSerialized路径、query、header、body、auth 设置齐全await self.api_client.call_api(*_param, _request_timeout...)真正发起 HTTP 请求await response_data.read()读取响应体异步 I/O不阻塞事件循环self.api_client.response_deserialize(response_data, response_types_map)依据状态码映射反序列化为对应 Pydantic 模型。整个调用链不使用线程池全部基于原生await因此适合与kubernetes.aio.watch、kubernetes.aio.client.CoreV1Api等其他异步 API 在同一事件循环中混用。若业务需要同步写法可等价使用 kubernetes/client/api/authorization_v1_api.py 中同名的同步AuthorizationV1Api其方法与参数完全对齐仅去掉async/await关键字。需要补充的使用前提异步分支的认证与配置加载需使用kubernetes.aio.configawait config.load_kube_config()或config.load_incluster_config()而不能混用同步kubernetes.configApiClient建议配合async with使用以自动关闭底层连接这一点与官方示例 examples_asyncio/in_cluster_config.py 展示的集群内运行方式保持一致。七、进一步阅读模块完整源码kubernetes/aio/client/api/authorization_v1_api.py同步分支对照实现kubernetes/client/api/authorization_v1_api.py请求/响应模型目录kubernetes/aio/client/models/v1_subject_access_review.py、v1_subject_access_review_spec.py、v1_subject_access_review_status.py、v1_resource_attributes.py异步客户端导出与文档kubernetes/aio/client/init.py、doc/source/kubernetes.aio.client.api.authorization_v1_api.rst异步调用范式示例examples_asyncio/list_pods.py、examples_asyncio/patch.py赞分享后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载相关推荐Kubernetes Python 异步客户端 RBAC Authorization API 完全指南Kubernetes Python 异步客户端 RBAC Authorization API 完全指南 本文以 kubernetes.aio.client.ap后端云原生容器编排Kubernetes Python 异步客户端 RBAC Authorization v1 API 全指南RbacAuthorizationV1Api 方法详解与实战Kubernetes Python 异步客户端 RBAC Authorization v1 API 全指南RbacAuthorizationV1Api 方法详后端云原生容器编排Kubernetes Python 异步客户端 NetworkingApi 使用指南基于 kubernetes.aio 的网络 API 组访问Kubernetes Python 异步客户端 NetworkingApi 使用指南基于 kubernetes.aio 的网络 API 组访问 导读 本文围绕后端云原生容器编排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑