operator-framework/josdk-webhooks

GitHub: operator-framework/josdk-webhooks

一个用于在 Java 中编写 Kubernetes 动态准入控制器和 CRD 版本转换 Webhook 的框架工具。

Stars: 26 | Forks: 7

# kubernetes-webhooks-framework 支持在 Java 中为 Kubernetes 实现 [dynamic admission controllers](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/) 和 [conversion hooks](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning/#webhook-conversion) 的框架和工具。同时支持 **quarkus** 和 **spring boot**。支持 **sync** 和 **async** 两种编程模型。 ## 文档 **如需更详细的文档,请查看 [docs](docs)。** ## 示例用法 向您的项目添加依赖: ``` io.javaoperatorsdk kubernetes-webhooks-framework-core ${josdk.webhooks.version} ``` ### Dynamic Admission Controllers 定义一个 mutation 或 validation 控制器非常简单: ``` @Singleton @Named(MUTATING_CONTROLLER) public AdmissionController mutatingController() { return new AdmissionController<>((resource, operation) -> { if (resource.getMetadata().getLabels() == null) { resource.getMetadata().setLabels(new HashMap<>()); } resource.getMetadata().getLabels().putIfAbsent(APP_NAME_LABEL_KEY, "mutation-test"); return resource; }); } @Singleton @Named(VALIDATING_CONTROLLER) public AdmissionController validatingController() { return new AdmissionController<>((resource, oldResource, operation) -> { if (resource.getMetadata().getLabels() == null || resource.getMetadata().getLabels().get(APP_NAME_LABEL_KEY) == null) { throw new NotAllowedException("Missing label: " + APP_NAME_LABEL_KEY); } }); } ``` 可以在 endpoint 中直接使用: ``` @POST @Path(MUTATE_PATH) @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public AdmissionReview mutate(AdmissionReview admissionReview) { return mutationController.handle(admissionReview); } @POST @Path(VALIDATE_PATH) @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public AdmissionReview validate(AdmissionReview admissionReview) { return validationController.handle(admissionReview); } ``` 详情请参阅示例。 ### Conversion Hooks Conversion hooks 遵循 [Kuberbuilder](https://book.kubebuilder.io/multiversion-tutorial/conversion-concepts.html) 中描述的相同模式,因此首先将 custom resource 从当前版本转换为 hub,下一步再从 hub 转换为目标资源版本。 要创建控制器,请注册 [mappers](https://github.com/java-operator-sdk/kubernetes-webhooks-framework/blob/main/core/src/main/java/io/javaoperatorsdk/webhook/conversion/Mapper.java): ``` @Singleton public ConversionController conversionController() { var controller = new ConversionController(); controller.registerMapper(new V1Mapper()); controller.registerMapper(new V2Mapper()); return controller; } ``` 并在 endpoint 中使用这些控制器: ``` @PostMapping(CONVERSION_PATH) @ResponseBody public ConversionReview convert(@RequestBody ConversionReview conversionReview) { return conversionController.handle(conversionReview); } ```
标签:API安全, JSON输出, JS文件枚举, Operator, Quarkus, Spring Boot, Streamlit, T1098.001, Webhook, 力导向图, 动态准入控制, 后端开发, 子域名突变, 数据科学, 校验控制器, 编程框架, 自定义资源, 访问控制, 资源变更, 资源验证, 转换钩子