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.war spring-mvc-showcase
b2i-war-java11.war springmvc5
b2i-binary devops-go-sample
b2i-jar-java11.jar java-maven-example
b2i-jar-java8.jar devops-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 镜像已推送


感谢您的反馈。如果您有关于如何使用 KubeSphere 的具体问题,请在 Slack 上提问。如果您想报告问题或提出改进建议,请在 GitHub 存储库中打开问题。