使用 S2I 构建云原生应用

2023年 1月 4日 23.5k 0

1. S2I 能解决什么问题

可以预见的是,未来大量的应用会以容器的方式进行部署。容器平台关注的是镜像和容器,应用开发关注的是业务代码,而最终代码需要以镜像的方式进行部署。从代码到镜像,就是 Source To Image ,即 S2I 。在前面的文章 PaaS 部署之 buildpack 中,描述到一个应用运行起来之前,需要进行一些必要的配置。这些配置包括运行依赖、环境变量、服务地址等。S2I 提供 buildpack 类似的功能,但 S2I 提供的方式更加通用化、更加容器化。

2. S2I 的特点

上图是 S2I 的工作流,S2I CLI 依赖于 Docker 环境。主要分为两步:

  • 通过 BASE IMAGE 、S2I Scripts 构建应用的基础镜像
  • 将源码移动到应用的基础镜像,仅添加一层文件,得到最终的镜像文件

BASE IMAGE 是一些通用的镜像,例如,Python、CentOS、Nodejs 等。S2I Scripts 通常是一些固定的流程脚本,比如变更数据库、拷贝静态文件等。S2I 的特点:

  • 速度,S2I 可以实现很复杂的操作逻辑,而不会创建新的镜像层,所以运行起来很快。
  • 打补丁,如果所依赖的镜像需要安全补丁,S2I 允许你一次性重新构建所有镜像。
  • 高效,在构建过程中,S2I 不允许运行任意的 yum install 命令,以防止降低开发迭代速度
  • 生态,S2I 鼓励一个共享镜像生态。从而你的应用可以实现最佳实践。

S2I 能够通过目录下的文件探测语言,如果有 Dockerfile 将会退化为非 S2I 的方式使用 Dockerfile 进行构建。

识别的语言探测的文件
java pom.xml
nodejs app.json, package.json
perl cpanfile、index.pl
php composer.json、index.php
python requirements.txt、setup.py
ruby Gemfile, Rakefile、config.ru
scala build.sbt
golang Godeps, main.go

3. S2I 与 buildpack 区别

buildpack 是 CloudFoundry 提供的一种打包应用的工具。buildpack 对应用及其依赖进行构建、打包和更新,让开发人员更加专注在业务逻辑实现。buildpack 最终会得到一个 droplet。droplet 是一个应用的可运行实例,运行在 dea(droplet execution agent)上。S2I 是 OpenShift 推出的一种基于容器的应用镜像构建工具。S2I 面向容器,试图解决的问题更为通用。S2I 最终会得到一个镜像,可以部署在任意容器平台。

4. 尝试使用 S2I

操作之前,请确保本地有可用的 Docker 环境。

  • 创建一个 Django 工程
  •  1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    pip install django==1.11
    django-admin startproject django_example
    echo django==1.11 > ./django_example/requirements.txt
    tree -L 3
    .
    └── django_example
        ├── django_example
        │   ├── __init__.py
        │   ├── settings.py
        │   ├── urls.py
        │   └── wsgi.py
        ├── manage.py
        └── requirements.txt
    

    添加 requirements.txt 是为了让脚本识别应用。

  • 安装 S2I ,以 OS X 为例:
  • 1
    
    brew install source-to-image
    
  • 构建应用镜像
    • build 命令格式
    1
    2
    3
    
    s2i build -h
    Usage:
      s2i build <source> <image> [<tag>] [flags]
    
    • source ,构建源码。可以是本地仓库,也可以是远程仓库
    • image,基础镜像
    • tag,生成的镜像
    • flags,构建参数,比如添加证书、设置网络等
    • 开始构建应用

    centos/python-35-centos7 是一个 Python 3.5 应用的 S2I 基础镜像,点击查看。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    s2i build django_example centos/python-35-centos7 hello-django
    ---> Installing application source ...
    ---> Installing dependencies ...
    Collecting django==1.11 (from -r requirements.txt (line 1))
    Downloading https://files.pythonhosted.org/packages/47/a6/078ebcbd49b19e22fd560a2348cfc5cec9e5dcfe3c4fad8e
    64c9865135bb/Django-1.11-py2.py3-none-any.whl (6.9MB)
    Collecting pytz (from django==1.11->-r requirements.txt (line 1))
    Downloading https://files.pythonhosted.org/packages/87/76/46d697698a143e05f77bec5a526bf4e56a0be
    61d63425b68f4ba553b51f2/pytz-2019.2-py2.py3-none-any.whl (508kB)
    Installing collected packages: pytz, django
    Successfully installed django-1.11 pytz-2019.2
    You are using pip version 7.1.2, however version 19.2.3 is available.
    You should consider upgrading via the 'pip install --upgrade pip' command.
    ---> Collecting Django static files ...
    WARNING: could not run 'manage.py collectstatic'. To debug, run:
    python ./manage.py collectstatic --noinput
    Ignore this warning if you're not serving static files with Django.
    Build completed successfully
    
    • 查看镜像
    1
    2
    3
    
    docker images
    REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
    hello-django               latest              042c6143ecf9        50 seconds ago      669MB
    
    • 运行应用
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    docker run -p 8080:8080 hello-django
    ---> Migrating database ...
    Operations to perform:
      Apply all migrations: admin, auth, contenttypes, sessions
    Running migrations:
      Applying contenttypes.0001_initial... OK
      Applying auth.0001_initial... OK
      Applying admin.0001_initial... OK
      Applying admin.0002_logentry_remove_auto_add... OK
      Applying contenttypes.0002_remove_content_type_name... OK
      Applying auth.0002_alter_permission_name_max_length... OK
      Applying auth.0003_alter_user_email_max_length... OK
      Applying auth.0004_alter_user_username_opts... OK
      Applying auth.0005_alter_user_last_login_null... OK
      Applying auth.0006_require_contenttypes_0002... OK
      Applying auth.0007_alter_validators_add_error_messages... OK
      Applying auth.0008_alter_user_username_max_length... OK
      Applying sessions.0001_initial... OK
    ---> Serving application with 'manage.py runserver' ...
    WARNING: this is NOT a recommended way to run you application in production!
    Consider using gunicorn or some other production web server.
    Performing system checks...
    System check identified no issues (0 silenced).
    August 26, 2019 - 08:08:36
    Django version 1.11, using settings 'django_example.settings'
    Starting development server at http://0.0.0.0:8080/
    Quit the server with CONTROL-C.
    
    • 查看应用

    5. 参考

    • https://github.com/openshift/source-to-image
    • https://github.com/sclorg/s2i-python-container
    • https://www.openshift.com/blog/create-s2i-builder-image

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论