Binary to Image:发布制品到 Kubernetes

Binary-to-Image (B2I) 是一个工具箱和工作流,用于从二进制可执行文件(例如 Jar、War 和二进制包)构建可再现容器镜像。更确切地说,您可以上传一个制品并指定一个目标仓库,例如 Docker Hub 或者 Harbor,用于推送镜像。如果一切运行成功,会推送您的镜像至目标仓库,并且如果您在工作流中创建服务 (Service),也会自动部署应用程序至 Kubernetes。

在 B2I 工作流中,您不需要编写 Dockerfile。这不仅能降低学习成本,也能提升发布效率,使用户更加专注于业务。

本教程演示在 B2I 工作流中基于制品构建镜像的两种不同方式。最终,镜像会发布至 Docker Hub。

以下是一些示例制品,用于演示和测试,您可以用来实现 B2I 工作流:

制品包GitHub 仓库
b2i-war-java8.warspring-mvc-showcase
b2i-war-java11.warspringmvc5
b2i-binarydevops-go-sample
b2i-jar-java11.jarjava-maven-example
b2i-jar-java8.jardevops-java-sample

准备工作

  • 您已启用 KubeSphere DevOps 系统
  • 您需要创建一个 Docker Hub 帐户,也支持 GitLab 和 Harbor。
  • 您需要创建一个企业空间、一个项目和一个帐户 (project-regular),请务必邀请该帐户至项目中并赋予 operator 角色。有关更多信息,请参见创建企业空间、项目、帐户和角色
  • 设置一个 CI 专用节点用于构建镜像。该操作不是必需,但建议开发和生产环境进行设置,专用节点会缓存依赖项并缩短构建时间。有关更多信息,请参见为缓存依赖项设置 CI 节点

使用 Binary-to-Image (B2I) 创建服务

下图中的步骤展示了如何在 B2I 工作流中通过创建服务来上传制品、构建镜像并将其发布至 Kubernetes。

服务构建

步骤 1:创建 Docker Hub 密钥

您必须创建 Docker Hub 密钥,以便将通过 B2I 创建的 Docker 镜像推送至 Docker Hub。以 project-regular 身份登录 KubeSphere,转到您的项目并创建一个 Docker Hub 密钥。有关更多信息,请参见创建常用密钥

步骤 2:创建服务

  1. 在该项目中,转到应用负载下的服务,点击创建

    创建服务

  2. 下拉至通过制品构建新的服务,选择 war。本教程使用 spring-mvc-showcase 项目作为示例并上传 war 制品至 KubeSphere。设置一个名称,例如 b2i-war-java8,点击下一步

  3. 构建设置页面,请提供以下相应信息,并点击下一步

    构建设置

    服务类型:本示例选择无状态服务。有关不同服务的更多信息,请参见服务类型

    上传制品:上传 war 制品 (b2i-war-java8)。

    构建环境:选择 kubesphere/tomcat85-java8-centos7:v2.1.0.

    镜像名称:输入 <DOCKERHUB_USERNAME>/<IMAGE NAME><HARBOR-PROJECT_NAME>/<IMAGE NAME> 作为镜像名称。

    tag:镜像标签,请输入 latest

    Target image repository:镜像会推送至 Docker Hub,故请选择 Docker Hub 密钥。

  4. 容器设置页面,下拉至服务设置,为容器设置访问策略。协议选择 HTTP,自定义名称(例如 http-port),容器端口服务端口都输入 8080。点击下一步继续。

    容器设置

    备注

    有关如何在容器设置页面设置其他参数的更多信息,请参见容器镜像设置
  5. 挂载存储页面,您可以为容器添加存储卷。有关更多信息,请参见存储卷

  6. 高级设置页面,选中外网访问并选择 NodePort 作为访问方式。点击创建完成整个操作过程。

    高级设置

  7. 点击左侧导航栏的构建镜像,您可以看到正在构建示例镜像。构建中

步骤 3:查看结果

  1. 稍等片刻,您可以看到镜像状态变为成功

    构建成功

  2. 点击该镜像前往其详情页面。在任务记录下,点击记录右侧的箭头图标查看构建日志。如果一切运行正常,您可以在日志末尾看到 Build completed successfully

    查看日志

  3. 回到上一层页面,您可以看到该镜像相应的任务、部署和服务都已成功创建。

    服务

    service

    部署

    deployment

    任务

    job

  4. 在您的 Docker Hub 仓库,您可以看到 KubeSphere 已经向仓库推送了带有预期标签的镜像。

    Docker 镜像

步骤 4:访问 B2I 服务

  1. 服务页面,请点击 B2I 服务前往其详情页面,您可以查看暴露的端口号。

    端口暴露

  2. 通过 http://{$Node IP}:{$NodePort}/{$Binary-Package-Name}/ 访问服务。

    访问服务

    备注

    取决于您的部署环境,您可能需要在安全组中放行端口并配置端口转发规则。

使用 Image Builder 构建镜像

前述示例通过创建服务来实现整个 B2I 工作流。此外,您也可以直接使用 Image Builder 基于制品构建镜像,但这个方式不会将镜像发布至 Kubernetes。

build-binary

备注

请确保您已经创建了 Docker Hub 密钥。有关更多信息,请参见创建常用密钥

步骤 1:上传制品

  1. project-regular 身份登录 KubeSphere,转到您的项目。

  2. 在左侧导航栏中选择构建镜像,然后点击创建

    image-builder

  3. 在弹出对话框中,选择 binary 并点击下一步

    upload-artifact

  4. 构建设置页面,请提供以下相应信息,然后点击创建

    buidling-settings-2

    上传制品:下载 b2i-binary 并上传至 KubeSphere。

    构建环境:选择 kubesphere/s2i-binary:v2.1.0

    镜像名称:自定义镜像名称。

    tag:镜像标签,请输入 latest

    Target image repository:镜像会推送至 Docker Hub,故请选择 Docker Hub 密钥。

  5. 构建镜像页面,您可以看到正在构建镜像。

    构建状态

步骤 2:检查结果

  1. 稍等片刻,您可以看到镜像状态变为成功

    构建成功

  2. 点击该镜像前往其详情页面。在任务记录下,点击记录右侧的箭头图标查看构建日志。如果一切运行正常,您可以在日志末尾看到 Build completed successfully

    查看日志

  3. 回到上一层页面,您可以看到该镜像相应的任务已成功创建。

    Job 已创建

  4. 在您的 Docker Hub 仓库,您可以看到 KubeSphere 已经向仓库推送了带有预期标签的镜像。

    Docker 镜像已推送