Source to Image (S2I) 是一个允许程序员直接输入源代码然后打包成可运行程序到 Docker 镜像的工具,在程序员不需要了解 Dockerfile 的情况下方便构建镜像。它是通过将源代码放入一个负责编译源代码的 Builder image 中,自动将编译后的代码打包成 Docker 镜像。

目的

本示例通过官方给出的 Hello World 的 Java 示例,演示如何在 KubeSphere 上使用 Source to Image 来实现构建镜像,并且实现自动推送到镜像仓库,最后部署到集群中。

前提条件

  • 本示例以 GitHub 代码仓库和 DockerHub 镜像仓库为例,参考前确保已创建了 GitHubDockerHub 账号;
  • 已创建了企业空间、项目和普通用户 project-regular 账号,若还未创建请参考 多租户管理快速入门
  • 使用项目管理员 project-admin 邀请项目普通用户 project-regular 加入项目并授予 operator 角色,参考 多租户管理快速入门 - 邀请成员

预估时间

20-30 分钟(时间由于网速等因素而有所不同)。

操作示例

创建密钥

需要预先创建 DockerHub 镜像仓库和 GitHub 代码仓库的密钥,分别为 dockerhub-idgithub-id,参考 创建常用的几类密钥

Fork 项目

登录 GitHub,将本示例用到的 GitHub 仓库 devops-java-sample Fork 至您个人的 GitHub。

fork

创建部署

第一步:填写基本信息

1、在左侧的工作负载菜单下,点击部署,进入部署管理界面。

createdeploy

2、点击创建,创建一个部署。

  • 名称:必填,给部署起一个名字,以便在使用的时候容易区分,此处使用 s2i-test
  • 别名:为了方便理解可自定义设置;
  • 描述信息:简单描述该部署的相关信息,可自定义;

第二步:容器组模版设置

1、点击 「下一步」,进入容器组模版设置界面,选择 「添加容器」。

container

2、然后选择 通过代码构建新的容器镜像

build

3、示例仓库 Fork 至您个人的 GitHub 后,复制您个人仓库的 git 地址。

示例八 - Source-to-Image - 图5

4、参考如下提示填写信息。

说明: KubeSphere 内置了常用的 Java、Node.js、Python 等 s2i 的模板,若需要自定义其它语言或依赖环境的 s2i 模板,请参考 自定义 s2i 模板

  • 代码地址:粘贴上一步复制的 git 地址(目前支持 Git,支持 HTTP、HTTPS,并且可以指定在源代码终端的相对路径);
  • 密钥:选择之前创建的 github-id
  • 映像模板:选择 kubespheredev/java-8-centos7 作为此示例的 Builder image;
  • 代码相对路径:使用默认的 / 即可;
  • 映像名称:可根据自己情况定义,此示例使用 <dockerhub_username>/hellodockerhub_username 为自己的账户名称,确保具有推拉权限;
  • tag:镜像标签使用默认 latest 即可;
  • 目标镜像仓库:选择之前创建的 dockerhub-id

s2i

4、往下滑动至 容器规格设置,建议最大 CPU 和最大内存设置为 500m 和 1000Mi

plan

5、往下滑至 服务设置,配置端口为 8080,如:

server

6、然后点击 「保存」

副本数量可选择为 1,然后点击 「下一步」。

next1

第三步:创建 s2i 部署

本示例无需配置存储卷,点击 「下一步」,标签保留默认值即可,选择 「创建」,s2i 示例部署创建完成。

构建完成

出现如下图绿勾即表示镜像通过 s2i 构建成功。

succ

查看容器组,正常运行。

succ-pod

验证运行结果

若通过 s2i 部署顺利,则将会在设置的 Dockerhub 中查看到设置的镜像,名称和标签为 容器组模版设置 中设置的值。若想在浏览器中查看到部署结果,可进行如下配置。

第一步:创建服务

选择左侧网络与服务下的服务,点击 「创建服务」。

create_service

第二步:基本信息填写

基本信息与创建部署类似,这里名称填写示例名称 s2i-test-service,其余可根据自己情况填写,点击 「下一步」,如下图。

service_name

第三步:服务设置

1、服务类型选择第一项 通过集群内部IP来访问服务 Virtual IP

2、然后点击 「指定工作负载」,选择刚刚创建的名称为 s2i-test 的部署,如下图。

select

3、点击保存,参考如下提示配置端口信息。

  • 端口名称:s2i-port;
  • 协议默认 TCP,端口号:8080,目标端口为 8080
  • 设置完成后点击 「下一步」。

示例八 - Source-to-Image - 图15

第五步:标签设置

默认即可,点击 「下一步」。

第六步:配置外网访问

选择访问方式为 NodePort

示例八 - Source-to-Image - 图16

至此,查看服务创建完成,如下图所示,Virtual IP 为 10.233.40.25,服务端口设置的是 8080,节点端口 (NodePort) 为 30454。

示例八 - Source-to-Image - 图17

第七步:验证访问

若在内网环境访问部署的 HelloWorld 示例服务,可通过 SSH 登陆集群节点,或使用集群管理员登陆 KubeSphere 在 web kubectl 中输入以下命令验证访问:

  1. # curl {$Virtual IP}:{$Port} 或者 curl {$内网 IP}:{$NodePort}
  2. curl 10.233.40.25:8080
  3. Hello,World!

提示:若需要在外网访问该服务,可能需要绑定公网 EIP 并配置端口转发和防火墙规则。在端口转发规则中将内网端口 30454 转发到源端口 30454,然后在防火墙开放这个源端口,保证外网流量可以通过该端口,外部才能够访问。例如在 QingCloud 云平台进行上述操作,则可以参考 云平台配置端口转发和防火墙

查看推送的镜像

由于我们在容器组模板设置中设置的目标镜像仓库为 DockerHub,此时可以登录您个人的 DockerHub 查看 Source to Image 示例推送的镜像,以下验证发现 hello:latest 镜像已成功推送至 DockerHub。

查看推送的镜像