• 欢迎访问V小白网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入V小白 暂无QQ群
  • 欢迎访问V小白网站,这是第二个滚动条

Python应用 OpenShift部署实战

其他分类 admin 2019年6月28日 10:36 80 0 个评论

[TOC]

将已有的python示例程序部署到OpenShift上. 为此, 需要做的事情有:

OpenShift基于Docker和Kubernetes, 并针对以下方面进行了开发和优化:

:notebook:

Python示例程序简介

实战步骤

:notebook:

  1. 删除heroku部署的相关代码: https://github.com/east4ming/learning_log/commit/1119c62d33766538601a711a4473f0ab64dd8f3e
  • Django `settings.py` 文件修改内容:
      1. 修改`ALLOW_HOSTS`为`*` (配置为`*`, 表示允许所有hosts, 如果不配置, OpenShift自动分配的域名和地址会无法访问python示例程序): [https://github.com/east4ming/learning_log/commit/534c1283eb9c430c1739d71ce0984cee6c776d04](https://github.com/east4ming/learning_log/commit/534c1283eb9c430c1739d71ce0984cee6c776d04) 1. DJANGO SECRET 改为通过系统变量(`os.getenv`方式)获取 (OpenShift的原模板 [Django + PostgreSQL](https://github.com/sclorg/django-ex) 包含这一变量): [https://github.com/east4ming/learning_log/commit/dd6695db345c333f1d193261fef3a35a2b926c97](https://github.com/east4ming/learning_log/commit/dd6695db345c333f1d193261fef3a35a2b926c97)
    1. 修改`DATABASES`相关代码, 改为兼容sqlite和postgresql. [https://github.com/east4ming/learning_log/commit/5dceef61b999cfe0abc45ed371f487c2e428a4c6](https://github.com/east4ming/learning_log/commit/5dceef61b999cfe0abc45ed371f487c2e428a4c6) 新增的`database.py` (`settings.py`的`DATABASES`部分调用该文件)代码如下:
      import os
      
      from django.conf import settings
      
      engines = {
          'sqlite': 'django.db.backends.sqlite3',
          'postgresql': 'django.db.backends.postgresql_psycopg2',
      }
      
      
      def config():
          service_name = os.getenv('DATABASE_SERVICE_NAME', '').upper().replace('-',
                                                                                '_')
          if service_name:
              engine = engines.get(os.getenv('DATABASE_ENGINE'), engines['sqlite'])
          else:
              engine = engines['sqlite']
          name = os.getenv('DATABASE_NAME')
          if not name and engine == engines['sqlite']:
              name = os.path.join(settings.BASE_DIR, 'db.sqlite3')
          return {
              'ENGINE': engine,
              'NAME': name,
              'USER': os.getenv('DATABASE_USER'),
              'PASSWORD': os.getenv('DATABASE_PASSWORD'),
              'HOST': os.getenv('{}_SERVICE_HOST'.format(service_name)),
              'PORT': os.getenv('{}_SERVICE_PORT'.format(service_name)),
          }
      
    2. (可选) 添加OpenShift相关脚本,变量: https://github.com/east4ming/learning_log/commit/095a59973bc6a6c5886f3debf56dde16e4ef2f96

      针对OpenShift 模板Django + PostgreSQL进行修改生成新模板

      顺便简单介绍一下模板编写时的相关参数:

      描述

      模板描述告知用户模板的功能,并帮助他们在Web控制台中搜索时找到它。模板名称之外的其他元数据是可选的,但有用。除了一般描述性信息之外,元数据还包括一组标签(label)。有用的标签包括模板与之相关的语言的名称(例如, javaphpruby等)。

      见上文代码片段的 metadata

      参数

      参数允许值由用户提供或在实例化模板时生成。然后,只要引用参数,该值就会被替换。可以在对象列表字段的任何字段中定义引用。这对于生成随机密码或允许用户提供自定义模板所需的主机名或其他特定于用户的值非常有用。可以通过两种方式引用参数:

      • 通过在模板中的任何字符串字段中以${PARAMETER_NAME}形式放置值来作为字符串值。

      • 作为json / yaml值,通过在${{PARAMETER_NAME}}格式中放置值代替模板中的任何字段。

      见上文代码片段的 parameters

      修改模板并导入

      :notebook:

      修改后的模板django-postgresql-persistent.json. 部分说明:

    3. 本次模板共创建了以下几类对象:
      1. `Secret` - 密钥对象(存储加密信息, 本例中存储: 数据库用户名和密码, django secret key)
      2. `Service` - 服务(容器内端口对外暴露并提供负载均衡). 这个模板有2个:
        1. django应用的`Service`
        2. 1. postgresql数据库的`Service` (提供给django使用) 1. 新增`env`和参数:`ENABLE_PIPENV` (这个参数基础镜像就有, 这儿列出来设置为`true`使之生效)
        3. 在OpenShift 的 Catalog页面点击新导入的模板 - **Learning Log**. 如下图: ![](//upload-images.jianshu.io/upload_images/10476447-55e98696dd2e72b2.png) OpenShift Catalog
        4. 点击**Next**: ![](//upload-images.jianshu.io/upload_images/10476447-5d4cad408fd037ce.png) OpenShift Template Info
        5. 填写相关的配置信息: ![](//upload-images.jianshu.io/upload_images/10476447-fb1af85ca41fe813.png) OpenShift Template Conf
        6. 点击Create. 会自动创建django-psql-persistent应用. 此时, OpenShift会进行如下的动作:
            1. 创建PVC

            1. 创建Secret
          1. 创建**Build** 流程, 我是之前有部分代码有问题, 或者连不上pipenv的源, 构建了4次才成功. (构建也是会启动一个专门的构建容器, 构建成功后输出一个构建后部署的镜像, 同时构建镜像自动销毁). 对于: python pipenv django, build流程大致如下:
              1. 下载pipenv及相关依赖包(如virtualenv等) 1. pipenv根据`Pipfile.lock`安装应用所需依赖包 1. Django执行static文件移动和数据库migrate. 1. 推送build完成的镜像到镜像库 ![](https://img.vxiaobai.com/images/10476447-8a5d5ddb226da076.png)
            1. Deployment部署应用, 包括: postgresql和django应用镜像. (pod那个圈是蓝色就是成功了) ![](//upload-images.jianshu.io/upload_images/10476447-0163e204c0797a7b.png) OpenShift Template Deploy
              1. 最终部署成功后, 在OpenShift上的Overview显示如下:

            2. 通过上图的URL访问: http://django-psql-persistent-learning-log.192.168.2.6.nip.io/

              OpenShift Learning Log

            3. 更多细节展示:
              容器的环境变量: 容器的日志: 容器的终端: 应用的services: 应用的route:

              :thinking:感悟

              K8S概念就很复杂了, OpenShift又在这上面添加了很多新概念, 比如: build, S2I, ImageStream ... 真的不容易理解.

              还有就是其实开发人员需要频繁调试, 修改代码, 每次修改都得走一遍CI/CD流程. 真的挺耗时的.

              目前OpenShift这种容器平台还是需要进一步提升易用性, 毕竟, 开发人员更多精力的是要放在写代码上, 构建部署越便捷越简单越好.

              道阻且长啊.

              参考资料

              s2i-python-container readme

              OpenShift 官方python模板quickstart

              Django settings

              OpenShift 官方文档

              OpenShift 快速开始: Django

              Python S2I镜像


  • V小白 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
    转载请注明原文链接:Python应用 OpenShift部署实战
    喜欢 (0)
    发表我的评论
    取消评论
    表情 贴图 加粗 删除线 居中 斜体 签到
    0个小伙伴在吐槽