容器 升级镜像 容器 镜像 pod_kubernetes

导读:如何构建和推送容器镜像?有哪些解决方案?本文带大家探讨这些问题。

容器 升级镜像 容器 镜像 pod_docker_02

解决方案

Kubernetes 中的工作单元是一个 pod。一个 pod 代表一组容器,它们运行在同一台主机上,并共享 IP 和端口等资源。要将一个服务部署到 Kubernetes 中,需要创建一个 pod。

由于 pod 是由一个或多个容器组成的,所以需要构建服务的容器镜像。

Quarkus 提供了构建和可选地推送容器镜像的扩展。在撰写本书时,支持以下容器构建策略:

Jib

Jib 为 Java 应用构建 Docker 和 OCI 容器镜像,无须 Docker 守护进程(Dockerless)。

这使得它非常适合在容器内运行进程时构建 Docker 镜像,因为这避免了 Docker-in-Docker(DinD)进程的麻烦。此外,使用 Quarkus 的 Jib 可以将所有的依赖项缓存在与实际应用不同的层中,使得重建速度快、规模小。这缩减了推送时间和构建时间。

Docker

运用 Docker 策略,使用 docker 二进制文件构建容器镜像,该二进制文件安装在本地,默认使用位于 src/main/docker 下的 Dockerfiles 来构建镜像。

S2I

Source-to-Image(S2I)策略使用 s2i 二进制构建在 OpenShift 集群内进行容器构建。

S2I 构建需要创建一个 BuildConfig 和两个 ImageStream 资源。这些资源的创建由Quarkus Kubernetes 扩展来实现。

在这个配置中,我们将使用 Jib 来构建和推送容器。这个配置的“讨论”部分将讨论Docker 和 S2I。

要使用 Jib 构建和推送容器镜像,首先需要添加 Jib 扩展项:

./mvnw quarkus:add-extensions -Dextensions="quarkus-container-image-jib"

然后可以自定义容器镜像的构建过程。可以在 application.properties、系统属性或环境变量中设置这些属性,与在 Quarkus 中设置任何其他配置参数一样:

quarkus.container-image.group=lordofthejars①
quarkus.container-image.registry=quay.io ②
quarkus.container-image.username=lordofthejars ③
#quarkus.container-image.password=④

①设置镜像的分组,这个值默认是 ${user.name}

②镜像推向的仓库,默认镜像被推向 docker.io

③镜像仓库的用户名

④镜像仓库的密码

要为项目建立并推送容器镜像,需要将 quarkus.container-image.push 参数设置为true,在打包阶段,创建并推送容器:

./mvnw clean package -Dquarkus.container-image.push=true
...
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ greeting-jib ---
[INFO] Building jar: /greeting-jib/target/greeting-jib-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- quarkus-maven-plugin:1.3.0.CR2:build (default) @ greeting-jib ---
[INFO] [org.jboss.threads] JBoss Threads version 3.0.1.Final
[INFO] [io.quarkus.deployment.pkg.steps.JarResultBuildStep] Building thin jar: greeting-jib/target/greeting-jib-1.0-SNAPSHOT-runner.jar
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Starting container image build①
[WARNING] [io.quarkus.container.image.jib.deployment.JibProcessor] Base image 'fabric8/java-alpine-openjdk8-jre' does not use a specific image digest - build may not be reproducible
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] LogEvent [level=INFO, message=trying docker-credential-desktop for quay.io]
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] LogEvent [level=LIFECYCLE, message=Using credentials from Docker config ($HOME/.docker/config.json) for
quay.io/lordofthejars/greeting-jib:1.0-SNAPSHOT]
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] The base image requires auth. Trying again for fabric8/java-alpine-openjdk8-jre...
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Using base image with digest:
 sha256:a5d31f17d618032812ae85d12426b112279f02951fa92a7ff8a9d69a6d3411b1
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Container entrypoint set to [java, -Dquarkus.http.host=0.0.0.0,
-Djava.util.logging.manager=org.jboss.logmanager.LogManager,-cp, /app/resources:/app/classes:/app/libs/*, io.quarkus.runner.GeneratedMain]
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Pushedcontainer image quay.io/lordofthejars/greeting-jib:1.0-SNAPSHOT(sha256:e173e0b49bd5ec1f500016f46f2cde03a055f558f72ca8ee1d6cb034a385a657)②
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 12980ms

①这个容器镜像被构建

②容器镜像被推向 quay.io

讨论

除了 Jib,还有另外两个选项可以用来构建容器镜像。要使用它们,只需要注册扩展:

Docker

quarkus-container-image-docker

S2I

quarkus-container-image-s2i

每个扩展都提供了特定的配置参数来更改构建过程。利用这些参数,可以更改用于构建容器镜像的基础镜像,并设置环境变量、传递给可执行文件的参数或 Dockerfile 的位置。

也可以建立镜像但不推送它到仓库。为此,需要将 quarkus.container-image.build 属性设置为 true,而不是设置 quarkus.container-image.push 属性:

./mvnw clean package -Dquarkus.container-image.build=true

如果使用 Jib,并且将 push 设置为 false,扩展就会创建一个容器镜像,并将其注册到 Docker 守护进程中。这意味着虽然没有使用 Docker 来构建镜像,但它仍然是必要的。

容器镜像扩展可以从 JAR 包(用于 JVM 模式)和原生可执行文件创建容器,这取决于在 build/output 目录中找到的内容。如果你想创建一个可从 Linux 容器中运行的原生可执行文件,然后创建一个包含所产生的原生可执行文件的容器镜像,可以运行以下命令:

./mvnw clean package -Dquarkus.container-image.push=true -Pnative \ 
-Dquarkus.native.container-build=true

将 quarkus.native.container-build 属性设置为 true,会在 Docker 容器内创建原生可执行文件。