v2.0
v1.0
  1. Release Notes
    1. Release Notes - 2.0.2最新
    1. Release Notes - 2.0.1
    1. Release Notes - 2.0.0
  1. 产品介绍
    1. 产品简介
    1. 产品功能
    1. 产品优势
    1. 架构说明
    1. 应用场景
    1. 名词解释
  1. 安装指南
    1. 安装说明
    1. 需开放的端口
    1. All-in-One 模式
    1. Multi-Node 模式
    1. 在 Kubernetes 在线部署 KubeSphere
    1. 在 Kubernetes 离线部署 KubeSphere
    1. Master 和 etcd 节点高可用
    1. 存储安装配置说明
    1. 集群组件配置说明
    1. 安装负载均衡器插件
    1. 安装内置 Harbor
    1. 安装内置 GitLab
    1. 升级
    1. 访问 SonarQube 和 Jenkins 服务端
    1. 集群节点扩容
    1. 卸载
  1. 快速入门
    1. 入门必读
    1. 示例一 - 多租户管理快速入门
    1. 示例二 - 应用路由与服务示例
    1. 示例三 - 部署 MySQL
    1. 示例四 - 部署 Wordpress
    1. 示例五 - 创建简单任务
    1. 示例六 - 一键部署应用
    1. 示例七 - 设置弹性伸缩 (HPA)
    1. 示例八 - Source-to-Image
    1. 示例九 - Bookinfo 微服务的灰度发布
    1. 示例十 - 基于Spring Boot项目构建流水线
    1. 示例十一 - 图形化构建流水线
    1. 示例十二 - CI/CD 流水线(离线版)
    1. 示例十三 - 使用 Ingress-Nginx 进行灰度发布
  1. 管理员指南
    1. 多租户管理
      1. 多租户管理概述
      2. 角色权限概览
    1. 平台管理
      1. 企业空间管理
      2. 账号管理
      3. 平台角色
    1. 基础设施
      1. 服务组件
      2. 主机管理
      3. 存储类型
    1. 监控中心
      1. 监控概述
      2. 如何利用监控定位问题
      3. 集群状态监控
      4. 应用资源监控
      5. 监控策略 - 节点级别
      6. 监控消息 - 节点级别
    1. 平台设置
      1. 应用仓库
      2. 基于本地仓库搭建应用仓库部署Redis
      3. 上传应用到 KubeSphere 官方仓库
      4. 基于 GitHub 搭建自有应用仓库
      5. 邮件服务器
      6. 日志收集
      7. 添加 Fluentd 作为日志接收者
      8. 添加 Kafka 作为日志接收者
    1. 工具箱
      1. Web Kubectl
      2. 日志收集
    1. 通用配置
      1. 系统配置修改
      2. 上传镜像至 Harbor
      3. Jenkins 系统设置
    1. FAQ
      1. DevOps 运维FAQ
  1. 用户指南
    1. 应用
      1. 应用模板
      2. 自制应用
      3. 流量治理
      4. 熔断
    1. 工作负载
      1. 工作负载概述
      2. 部署
      3. 有状态副本集
      4. 守护进程集
      5. 任务
      6. 定时任务
      7. 设置健康检查器
      8. 工作负载管理
      9. 自定义 S2i 模板
    1. 存储
      1. 存储概述
      2. 存储卷
      3. Local Volume 使用方法
    1. 网络与服务
      1. 服务管理
      2. 灰度发布
      3. 应用路由
    1. 监控告警
      1. 告警策略 - 工作负载级别
      2. 告警消息 - 工作负载级别
    1. 配置中心
      1. 密钥
      2. 配置
      3. 镜像仓库
    1. 项目设置
      1. 基本信息
      2. 成员角色
      3. 项目成员
      4. 外网访问
    1. DevOps 工程
      1. DevOps 工程概述
      2. 管理 DevOps 工程
      3. 流水线
      4. 凭证管理
      5. 添加代码仓库
      6. 访问 SonarQube 并创建 Token
      7. 设置自动触发扫描
      8. Jenkins Agent 说明
      9. 流水线常见问题
  1. API 文档
    1. API 文档
    1. 如何调用 API
    1. API 常用术语对照
    1. 监控指标说明
  1. 常见问题
    1. 安装常见问题
    1. 存储常见问题
    1. 控制台使用常见问题
    1. DevOps 常见问题
  1. 附录
    1. 部署 Ceph 存储服务端
    1. 部署 GlusterFS 存储服务端
    1. 云平台配置端口转发和防火墙
KubeSphere®️ 2020 All Rights Reserved.

自定义 S2i 模板

S2i (Source-to-image)使用源代码和构建器镜像生成新的 Docker 镜像,在我们的项目当中提供了部分常用的构建器镜像,例如PythonJava,您也可以定义自己的构建器镜像 (即 S2i 模板) 扩展 S2i。

在详细介绍构建器影响之前,我们会先说明一下自定义 S2i 模板的步骤,以及工作原理和构建器镜像的作用。

  1. 下载 S2i 构建器镜像(镜像提供构建脚本)。
  2. 下载源代码。
  3. 将源代码传入构建器镜像当中。
  4. 运行构建器镜像所提供的 assemble 脚本进行应用构建。
  5. 保存制品镜像。

构建器镜像需要有一些必要的内容才能完成所有工作。

首先由于构建器镜像负责构建应用程序,因此它必须包含构建和运行应用程序所有需要的库和工具。例如 Java 构建器镜像将安装 JDK、Maven等,而 Python 构建器镜像则可能需要 pip 等工具。

其次构建器镜像需要提供脚本来执行构建和运行操作。这部分脚本在 S2I 当中为:

  • assemble - 负责构建应用程序
  • run - 负责运行应用程序

在以下的步骤中,我们将向您展示如何创建一个Nginx 服务的构建器镜像。

第一步:S2i CLI 构建项目目录

S2i 命令行工具 带有一个方便的命令,可以引导构建器所需的目录结构。如下安装 S2i CLI:

$ wget https://github.com/openshift/source-to-image/releases/download/v1.1.14/source-to-image-v1.1.14-874754de-linux-386.tar.gz

$ tar -xvf source-to-image-v1.1.14-874754de-linux-386.tar.gz
$ ls
s2i  source-to-image-v1.1.14-874754de-linux-386.tar.gz  sti

$ cp s2i /usr/local/bin
$ s2i create nginx-centos7 s2i-builder-docs

本文使用 nginx-centos7 作为构建器镜像的名字创建了初始目录,目录结构如下所示。

s2i-builder-docs/
   Dockerfile - 一个标准的Dockerfile,定义了构建器镜像。
   Makefile - 用于测试和构建构建器镜像的帮助脚本。
   test/
      run - 测试脚本,测试构建器镜像是否正常工作。
      test-app/ - 用于测试的应用程序的目录
   s2i/bin
      assemble - 负责构建应用程序的脚本
      run - 负责运行应用程序的脚本
      usage - 负责打印构建器镜像用法的脚本

第二步:修改 Dockerfile

如下修改 Dockerfile 来定义构建器镜像。

Dockerfile

# nginx-centos7
FROM kubespheredev/s2i-base-centos7:1


LABEL maintainer="Runze Xia <runzexia@yunify.com>"

# 声明当前应用的版本
ENV NGINX_VERSION=1.6.3


LABEL io.k8s.description="Nginx Webserver" \
      io.k8s.display-name="Nginx 1.6.3" \
      io.kubesphere.expose-services="8080:http" \
      io.kubesphere.tags="builder,nginx,html"

# 安装nginx并且清理yum cache
RUN yum install -y epel-release && \
    yum install -y --setopt=tsflags=nodocs nginx && \
    yum clean all

# 修改nginx的默认开放端口
RUN sed -i 's/80/8080/' /etc/nginx/nginx.conf
RUN sed -i 's/user nginx;//' /etc/nginx/nginx.conf

# 将s2i的脚本复制到构建器镜像当中
COPY ./s2i/bin/ /usr/libexec/s2i

RUN chown -R 1001:1001 /usr/share/nginx
RUN chown -R 1001:1001 /var/log/nginx
RUN chown -R 1001:1001 /var/lib/nginx
RUN touch /run/nginx.pid
RUN chown -R 1001:1001 /run/nginx.pid
RUN chown -R 1001:1001 /etc/nginx

USER 1001

# 声明默认使用的端口
EXPOSE 8080

# 修改构建器的默认启动命令,以展示构建器镜像的用法
CMD ["/usr/libexec/s2i/usage"]

第三步 处理s2i构建器脚本

当我们完成了 Dockerfile 的定义,我们现在可以完成构建器镜像的其他部分。我们现在添加S2I脚本,我们将从 assemble(负责构建应用程序)开始。如下编辑 assemble 文件,在我们的例子中,它只是把 nginx的配置文件以及静态内容复制到目标容器中:

assemble

#!/bin/bash -e

if [[ "$1" == "-h" ]]; then
	exec /usr/libexec/s2i/usage
fi

echo "---> Building and installing application from source..."
if [ -f /tmp/src/nginx.conf ]; then
  mv /tmp/src/nginx.conf /etc/nginx/nginx.conf
fi

if [ "$(ls -A /tmp/src)" ]; then
  mv /tmp/src/* /usr/share/nginx/html/
fi

默认情况下,s2i build将应用程序源代码放在/tmp/src目录中,在上面的命令当中,我们将应用源代码复制到了了kubespheredev/s2i-base-centos7:1定义的工作目录/opt/app-root/src当中。

现在我们可以来处理第二个脚本 run(用于启动应用程序),在我们的例子当中,它只是启动nginx服务器:

run

#!/bin/bash -e

exec /usr/sbin/nginx -g "daemon off;"

我们使用 exec 命令将执行 run 脚本替换为执行 nginx 服务器的主进程。我们这样做是为了让所有docker发出的信号都可以被 nginx 收到,并且可以让 nginx 使用容器的标准输入和标准输出流。

我们在例子当中被没有实现增量构建,因此我们可以直接删除 save-artifacts 脚本。

最后我们在 usage 脚本当中添加一些使用信息:

usage

#!/bin/bash -e
cat <<EOF
This is the nginx-centos7 S2I image:
To use it, install S2I: https://github.com/kubesphere/s2i-operator
Sample invocation:
s2i build test/test-app kubespheredev/nginx-centos7 nginx-centos7-app
You can then run the resulting image via:
docker run -d -p 8080:8080 nginx-centos7-app
and see the test via http://localhost:8080
EOF

第四步 构建与运行

当我们完成了 Dockerfile 和 S2i 的脚本,我们现在修改一下 Makefile 当中的镜像名称:

Makefile

IMAGE_NAME = kubespheredev/nginx-centos7-s2ibuilder-sample

.PHONY: build
build:
	docker build -t $(IMAGE_NAME) .

.PHONY: test
test:
	docker build -t $(IMAGE_NAME)-candidate .
	IMAGE_NAME=$(IMAGE_NAME)-candidate test/run

可以执行 make build 命令来构建我们的构建器镜像了。

$ make build
docker build -t kubespheredev/nginx-centos7-s2ibuilder-sample .
Sending build context to Docker daemon  164.9kB
Step 1/17 : FROM kubespheredev/s2i-base-centos7:1
 ---> 48f8574c05df
Step 2/17 : LABEL maintainer="Runze Xia <runzexia@yunify.com>"
 ---> Using cache
 ---> d60ebf231518
Step 3/17 : ENV NGINX_VERSION=1.6.3
 ---> Using cache
 ---> 5bd34674d1eb
Step 4/17 : LABEL io.k8s.description="Nginx Webserver"       io.k8s.display-name="Nginx 1.6.3"       io.kubesphere.expose-services="8080:http"       io.kubesphere.tags="builder,nginx,html"
 ---> Using cache
 ---> c837ad649086
Step 5/17 : RUN yum install -y epel-release &&     yum install -y --setopt=tsflags=nodocs nginx &&     yum clean all
 ---> Running in d2c8fe644415

…………
…………
…………

Step 17/17 : CMD ["/usr/libexec/s2i/usage"]
 ---> Running in c24819f6be27
Removing intermediate container c24819f6be27
 ---> c147c86f2cb8
Successfully built c147c86f2cb8
Successfully tagged kubespheredev/nginx-centos7-s2ibuilder-sample:latest

可以看到我们的镜像已经构建成功了,现在我们执行 s2i build ./test/test-app kubespheredev/nginx-centos7-s2ibuilder-sample:latest sample app 命令来构建我们的应用镜像。

$ s2i build ./test/test-app kubespheredev/nginx-centos7-s2ibuilder-sample:latest sample-app
---> Building and installing application from source...
Build completed successfully

当我们完成了应用镜像的构建,我们可以在本地运行这个应用镜像看构建出的应用是否符合我们的要求:

$ docker run -p 8080:8080  sample-app

在浏览器中访问,可以看到我们的网页已经可以正常访问了:

第五步 推送镜像并在 KubeSphere 添加 S2i 模版

当我们在本地完成 S2I 构建器镜像的测试之后,就可以推送镜像到自定义的镜像仓库当中,并创建构建器模版 yaml 文件:

s2ibuildertemplate.yaml

apiVersion: devops.kubesphere.io/v1alpha1
kind: S2iBuilderTemplate
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: nginx-demo
spec:
  baseImages: # 构建器镜像名称,同一代码框架的多个不同版本。
    - kubespheredev/nginx-centos7-s2ibuilder-sample
  codeFramework: nginx # 代码框架类型
  defaultBaseImage: kubespheredev/nginx-centos7-s2ibuilder-sample # 默认使用的构建器镜像 (可替换为自定义的镜像)
  version: 0.0.1 # 构建器模版的版本
  description: "This is a S2I builder template for Nginx builds whose result can be run directly without any further application server.." # 构建器模版的描述信息

在创建好构建器模版后我们可以使用 kubectl 将构建器模版提交到 KubeSphere 环境当中:

$ kubectl apply -f s2ibuildertemplate.yaml
s2ibuildertemplate.devops.kubesphere.io/nginx created

现在我们来到 KubeSphere 的控制台界面,我们已经可以选择添加的构建器模版了:

至此我们就完成了 S2i 构建器镜像与构建器模版的创建。类似地,可以参考上述步骤,您可以基于 S2i CLI 自定义任何所需的 S2i 模板,然后在 KubeSphere 构建所需的镜像并一键部署至 Kubernetes 环境中,方便快速与多次构建环境。