使用 Quarkus 部署 Openshift 和 AWS Lambda

如今,Quarkus 被称为Supersonic Subatomic Java。它提供了许多功能来促进构建和部署。


现在Quarkus 被称为 Supersonic Subatomic Java。它提供了许多功能来促进构建和部署。我尽我最大的努力创建了一个带有 quarkus 的小型博客应用程序,并安装了以下功能:rest-clientsecurityspring-data-jpasmallrye-healthopenapiKubernetesAWS部署以进行实际尝试。

如果他们有兴趣从 Quarkus 系统中获得尽可能多的生命,那么他们可以做很多事情。重要的是要了解先决条件以及系统此时可以做什么和不能做什么。在您了解这一点之前,要完成所有事情当然并不容易。

今天,我们将探讨您需要做什么才能使用 Quarkus系统有所作为。我们还将查看此时启动和运行所需的所有技术规范。当您努力充分利用您遇到的每个编码程序时,这应该对您有所帮助。

先决条件

  • JDK 11— for running app
  • Gradle 6+ — for packaging
  • Docker
  • OpenShift CLI — for deploying on OpenShift
  • AWS CLI, AWS SAM CLI— for deploying AWS Lambda
  • docker

    Quarkus 为构建(和推送)容器镜像提供了扩展。目前支持 Jib、S2I、Docker。

    要使用 Docker 容器化,请添加Gradle 依赖项:

    implementation 'io.quarkus:quarkus-container-image-docker'

    在以下位置配置 docker 镜像和远程注册表 application.properties

    Dockerfile

    1quarkus.container-image.name=blog-api2quarkus.container-image.tag=latest3quarkus.container-image.registry=docker.io4quarkus.container-image.username=5quarkus.container-image.password=6quarkus.container-image.push=true


    或覆盖 Gradle 命令上的属性:

    Dockerfile

    ./gradlew quarkusBuild 2           -Dquarkus.container-image.username= \3           -Dquarkus.container-image.password= \4           -Dquarkus.container-image.push=true


    因为可以创建一个多级Dockerfile来避免打包:

    Dockerfile

    ####2# This Dockerfile.multistage is used in order to build a container that runs the Quarkus application in JVM mode3# docker build -t quarkus-quickstart:jvm -f src/main/docker/Dockerfile.multistage .4# docker run -i --rm -p 8080:8080 quarkus-quickstart:jvm5###67# Build jar with gradle8FROM gradle:jdk11 AS build_image910ENV APP_HOME=/root/dev/myapp/11USER root12RUN mkdir -p $APP_HOME/src/main/java13WORKDIR $APP_HOME14COPY build.gradle gradlew gradlew.bat $APP_HOME15COPY gradle $APP_HOME/gradle16COPY . .17RUN ./gradlew -PawsLambdaEnabled=false quarkusBuild1819FROM registry.access.redhat.com/ubi8/ubi-minimal:8.12021ARG JAVA_PACKAGE=java-11-openjdk-headless22ARG RUN_JAVA_VERSION=1.3.52324ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en'2526# Install java and the run-java script27# Also set up permissions for user `1001`28RUN microdnf install curl ca-certificates ${JAVA_PACKAGE} \29    && microdnf update \30    && microdnf clean all \31    && mkdir /deployments \32    && chown 1001 /deployments \33    && chmod "g+rwX" /deployments \34    && chown 1001:root /deployments \35    && curl https://repo1.maven.org/maven2/io/fabric8/run-java-sh/${RUN_JAVA_VERSION}/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o /deployments/run-java.sh \36    && chown 1001 /deployments/run-java.sh \37    && chmod 540 /deployments/run-java.sh \38    && echo "securerandom.source=file:/dev/urandom" >> /etc/alternatives/jre/lib/security/java.security3940# Configure the JAVA_OPTIONS, you can add -XshowSettings:vm to also display the heap size.41ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"42COPY --from=build_image /root/dev/myapp/build/lib/* /deployments/lib/43COPY --from=build_image /root/dev/myapp/build/*-runner.jar /deployments/app.jar4445EXPOSE 809046USER 10014748ENTRYPOINT [ "/deployments/run-java.sh" ]


    OpenShift 部署

    要在没有 Quarkus 的情况下在 Openshift 上部署,可以定义 template.yaml:

    YAML

    apiVersion: v12kind: Template3metadata:4  name: my-template5objects:6- kind: DeploymentConfig7  apiVersion: v18  metadata:9      labels:10        ${TAG}: ${SELECTOR_APP_NAME}11      name: ${APP_NAME}12      namespace: ${NAMESPACE_NAME}13  spec:14      replicas: 115      revisionHistoryLimit: 1016      selector:17        app: ${APP_NAME}18        deploymentconfig: ${APP_NAME}19      strategy:20        activeDeadlineSeconds: 2160021        resources: {}22        rollingParams:23          intervalSeconds: 124          maxSurge: 25%25          maxUnavailable: 25%26          timeoutSeconds: 60027          updatePeriodSeconds: 128        type: Rolling29      template:30        metadata:31          annotations:32            openshift.io/generated-by: OpenShiftNewApp33          creationTimestamp: null34          labels:35            app: ${APP_NAME}36            deploymentconfig: ${APP_NAME}37        spec:38          containers:39            - env:40              name: ${APP_NAME}41              ports:42                - containerPort: 809043                  protocol: TCP44              resources: {}45          dnsPolicy: ClusterFirst46          restartPolicy: Always47          schedulerName: default-scheduler48          securityContext: {}49          terminationGracePeriodSeconds: 3050      test: false51      triggers:52        - type: ConfigChange53        - imageChangeParams:54            automatic: true55            containerNames:56              - ${APP_NAME}57            from:58              kind: ImageStreamTag59              name: 'blog-api:latest'60              namespace: ${NAMESPACE_NAME}61          type: ImageChange62- kind: Service63  apiVersion: v164  metadata:65    labels:66        ${TAG}: ${SELECTOR_APP_NAME}67    name: ${APP_NAME}68    namespace: ${NAMESPACE_NAME}69  spec:70    ports:71        - name: 80-tcp72          port: 8073          protocol: TCP74          targetPort: 809075    selector:76        app: ${APP_NAME}77        deploymentconfig: ${APP_NAME}78  sessionAffinity: None79  type: ClusterIP80  status:81    loadBalancer: {}82- kind: Route83  apiVersion: v184  metadata:85    labels:86        ${TAG}: ${SELECTOR_APP_NAME}87    name: ${APP_NAME}88    namespace: ${NAMESPACE_NAME}89  spec:90    host: ${HOST_NAME}91    port:92        targetPort: 80-tcp93    to:94        kind: Service95        name: ${APP_NAME}96        weight: 10097    wildcardPolicy: None98parameters:99- name: NAMESPACE_NAME100- name: SELECTOR_APP_NAME101- name: APP_NAME102  value: quarkus-blog-api103- name: HOST_NAME104- name: TAG105  value: app


    并处理:

    Dockerfile

    oc tag elvaliev/blog-api:latest23oc process NAMESPACE_NAME= \4           SELECTOR_APP_NAME= \5           HOST_NAME= \6           -f template.yaml | oc apply -f-


    通过使用 docker 容器化,还可以使用来自 docker 注册表的镜像流来部署应用程序。

    Dockerfile

    oc new-app elvaliev/blog-api:latest23oc expose svc/blog-api


    但是,Quarkus 提供了自动生成Kubernetes 资源的能力。它目前支持为 Kubernetes、OpenShift 和 Knative 生成​资源。

    摇篮依赖

    implementation 'io.quarkus:quarkus-kubernetes'

    要生成必要的模板,您需要将目标包含在 application.properties

    quarkus.kubernetes.deployment-target=kubernetes,openshift

    或者,您可以为模板设置自定义配置:

    Dockerfile

    quarkus.kubernetes.annotations.app=blog2quarkus.kubernetes.labels.app=blog34# To create route for your application5quarkus.openshift.expose=true


    打包 quarkus 后生成目标模板:

    通过命令部署应用程序:

    oc create -f build/kubernetes/openshift.yml

    此外,还可以使用S2I进行部署。

    Dockerfile

    oc new-app quay.io/quarkus/ubi-quarkus-native-s2i:19.3.1-java11~ 2                                         --context-dir=. --name=quarkus-blog-api3              4oc expose svc/quarkus-blog-a


    AWS 部署

    注意:仅使用最新版本的 quarkus — 1.4.1。

    Gradle的依赖:

    implementation 'io.quarkus:quarkus-amazon-lambda-http'

    打包 quarkus 后为 AWS 生成 sam 模板:

    要将应用程序部署为 AWS Lambda,请使用构建中的模板。对于本机构建使用模板build/sam.native.yaml

    我遵循了 quarkus-documentation:

    Dockerfile

    sam local start-api --template build/sam.jvm.yaml23sam package --template-file build/sam.jvm.yaml --output-template-file packaged.yaml --s3-bucket 45sam deploy --template-file packaged.yaml --capabilities CAPABILITY_IAM --stack-name 


    注意为了避免超时错误(502 - BAD GATEWAY) - Timeout 增加 build/sam.jvm.yaml

    注意:要使用 Docker 容器化,您需要排除quarkus-amazon-lambda-http对 jar 打包的依赖(使用条件属性awsLambdaEnabled=false进行 打包gradle.properties ):


    Dockerfile

    1if (project.property(“awsLambdaEnabled”) != “true”) { 2   configurations { 3       runtime.exclude group: ‘io.quarkus’, 4                       module: ‘quarkus-amazon-lambda-http’ 5    }6}


    Github: https ://github.com/ElinaValieva/quarkus-quickstarts



    发表评论
    留言与评论(共有 0 条评论) “”
       
    验证码:

    相关文章

    推荐文章