Dekorate为Java项目生成Kubernetes和OpenShift清单

向右看齐 2023-02-16 06:07 51阅读 0赞

Dekorate(以前是ap4k项目)旨在简化基于Java的项目中Kubernetes和OpenShift清单的生成。该项目被更名,因为它现在支持在不使用注释的情况下装饰Kubernetes清单,因此名称ap4k不再准确地描述该项目。

Dekorate是用于Kubernetes和OpenShift清单的Java编译时生成器和装饰器的集合。开发人员无需编辑任何XML,JSON或YAML即可自定义这些清单。

使用Dekorate,开发人员可以使用注释处理,配置属性(application.properties)或两者来生成或自定义清单。Dekorate支持Kubernetes,OpenShift,Knative,Tekton,Prometheus,Jaeger,Service Catalog和Halkyon CRD。此外,Dekorate与Spring Boot,Quarkus,Thorntail之类的框架集成,并且还为通用Java项目提供了构建工具,该工具允许任何maven,gradle,sbt和bazel项目生成清单。

作为示例,让我们探讨Dekorate如何与Quarkus应用程序集成。

Quarkus已经有了一个Kubernetes扩展,该扩展在内部使用Dekorate为Kubernetes,OpenShift和Knative生成和自定义清单。此扩展允许Quarkus通过应用生成的清单来将应用程序部署到Kubernetes集群,甚至在部署应用程序之前创建容器映像并将其推送到注册表(有关更多详细信息,请参见容器映像指南)。

要添加扩展,您只需要在终端中执行:

  1. mvn quarkus:add-extension -Dextensions="io.quarkus:quarkus-kubernetes"

编译完成后,生成的清单将在以下位置可用。target/kubernetes/

kubernetes.json文件如下所示:

  1. {
  2. "apiVersion" : "v1",
  3. "kind" : "ServiceAccount",
  4. "metadata" : {
  5. "annotations" : {
  6. "app.quarkus.io/vcs-url" : "<>",
  7. "app.quarkus.io/build-timestamp" : "2020-06-04 - 05:13:57 +0000",
  8. "app.quarkus.io/commit-id" : "<>"
  9. },
  10. "labels" : {
  11. "app.kubernetes.io/name" : "decorate",
  12. "app.kubernetes.io/version" : "1.0.0-SNAPSHOT"
  13. },
  14. "name" : "decorate"
  15. }
  16. }

目前,此扩展将处理端口和运行状况检查之类的事情,用户端的配置为零。重要的是要注意,根据设计,此扩展将不会使用dekorate批注自定义生成的清单。

对于 Spring Boot 应用程序,有两个可用的启动器: io.dekorate: Kubernetes-Spring-starter: 1.0.0 (Kubernetes),以及 io.dekorate: OpenShift-Spring-starter: 1.0.0 (OpenShift)。

在Spring Boot上,可以通过利用已经存在的特定于框架的元数据来绕过注释。要自定义生成的清单,可以将dekorate属性添加到application.yml / application.properties中,甚至可以将注释与application.yml / application.properties一起使用。默认情况下,dekorate属性会覆盖所有现有的注释配置。

Dekorate按优先级从高到低的顺序寻找受支持的配置:

  1. Annotations
  2. application.properties
  3. application.yaml
  4. application.yml
  5. application-kubernetes.properties
  6. application-kubernetes.yaml
  7. application-kubernetes.yml

对于Thorntail应用程序,提供了两个启动器:io.dekorate:kubernetes-thorntail-starter:jar:1.0.0(Kubernetes) 和 io.dekorate:openshift-thorntail-starter:jar:1.0.0(OpenShift)。

从这些启动器,你就可以开始使用Dekorate注释,比如@KubernetesApplication@OpenShiftApplication

要为通用Java应用程序生成Kubernetes清单,必须为Kubernetes和OpenShift 添加依赖项。

然后,您需要在一个Java源文件中添加@Dekorate注解或@KubernetesApplication,这是一种更专业的形式@Dekorate

  1. import io.dekorate.kubernetes.annotation.KubernetesApplication;
  2. @KubernetesApplication
  3. public class Main {
  4. public static void main(String[] args) {
  5. }
  6. }

运行后,mvn clean package您将在target / classes / META-INF / dekorate下看到生成的清单。

kubernetes.yml如下所示:

  1. apiVersion: "apps/v1"
  2. kind: "Deployment"
  3. metadata:
  4. name: "kubernetes-example"
  5. spec:
  6. replicas: 1
  7. selector:
  8. matchLabels:
  9. app.kubernetes.io/name: "my-gradle-app"
  10. app.kubernetes.io/version: "1.0-SNAPSHOT"
  11. template:
  12. metadata:
  13. labels:
  14. app.kubernetes.io/name: "my-gradle-app"
  15. app.kubernetes.io/version: "1.0-SNAPSHOT"
  16. spec:
  17. containers:
  18. - env:
  19. - name: "KUBERNETES_NAMESPACE"
  20. valueFrom:
  21. fieldRef:
  22. fieldPath: "metadata.namespace"
  23. image: "default/my-gradle-app:1.0-SNAPSHOT"
  24. imagePullPolicy: "IfNotPresent"
  25. name: "my-gradle-app"

要为通用Java应用程序生成OpenShift清单,可以使用@Dekorate注释或@OpenshiftApplication,它的工作原理与完全相同@KubernetesApplication,但是会生成openshift.yml / openshift.json

Dekorate除了核心清单生成功能之外,还带来了一些其他功能。这些功能包括构建,部署和测试之类的功能。

Dekorate允许用户挂钩外部工具(例如dockeroc)以在编译结束后触发容器映像构建,因为它不生成Docker文件,也不为执行docker或s2i构建提供内部支持。

目前,作为实验功能,提供了以下挂钩:

  • docker build hook(需要使用-Ddekorate.build = true触发的docker二进制文件)
  • docker push hook(需要docker二进制文件,由-Ddekorate.push = true触发)
  • OOpenShift s2i build hook(需要oc二进制文件,由-Ddekorate.deploy = true触发)

Dekorate还为Kubernetes和Openshift带来了JUnit 5扩展,这些扩展使开发人员可以运行端到端测试。目前,受支持的功能包括环境条件,容器构建,应用生成的清单来测试环境以及使用客户端/应用程序容器注入测试。

可以在GitHub repo上找到更多详细信息,例如所有配置选项和代码示例(Spring Boot,Thorntail,Vertx,Istio)。

发表评论

表情:
评论列表 (有 0 条评论,51人围观)

还没有评论,来说两句吧...

相关阅读

    相关 kubernetes--资源清单

    ⒈资源含义   k8s中所有的内容都被抽象为资源,资源实例化之后,叫做对象。 ⒉资源分类   名称空间级别   仅在此名称空间下生效,k8s的系统组件是默认放在kube