[TOC]
概述
這次的實戰目标如下:
将已有的python示例程式部署到OpenShift上. 為此, 需要做的事情有:對原有python示例程式做優化和調整, 使得可以部署到OpenShift上.
基于OpenShift上自帶模闆(templates: openshift上的一種CI/CD全流程定義) - Django + PostgreSQL 進行修改生成新的模闆.
基于新的模闆, 填入python示例程式的git位址, 自動進行: 建構(build), 部署(deployment)和對外服務(service, route). 檢視部署結果.
OpenShift簡介
OpenShift v3(開源版本叫做: okd)是一個PAAS(平台及服務)系統,旨在盡可能準确地公開底層Docker格式的容器鏡像和Kubernetes 理念,并着重于開發人員輕松組合應用程式。例如,安裝Ruby,推送代碼并添加MySQL。
OpenShift基于Docker和Kubernetes, 并針對以下方面進行了開發和優化:CI/CD 流程(基于jenkins的pipeline, S2I等)
UI界面
安全加強(如容器内使用非root使用者等)
監控功能(基于EFK技術棧的日志監控和基于Prometheus的metrics監控等)
提供更安全 經過RedHat認證的基礎鏡像/模闆等.(包括: java, python等運作時, mysql, mongo等db, apache, wildfly等中間件, jenkins等CI/CD, elasticsearch, kibana等監控鏡像):notebook:
OpenShift有多個産品線, 包括:開源版minishift (okd的單機部署版)okd (The Origin Community Distribution of Kubernetes that powers Red Hat OpenShift.)
商業版OpenShift Online
OpenShift Delicated
OpenShift Container Platform
Python示例程式簡介
這是一個Django項目 - Learning Log(《Python程式設計:從入門到實踐》的教學案例),資料庫可以基于sqlite或Postgresql.:notebook:
這個應用的功能如下:這是一個名為"學習筆記"的Web應用程式, 讓使用者能夠記錄感興趣的主題, 并在學習每個主題的過程中添加日志條目.
"學習筆記"的首頁對這個網站進行描述, 并邀請使用者注冊或登陸.
使用者登陸後, 就可以建立新主題/添加新條目以及閱讀既有的條目.
實戰步驟
python示例程式修改:notebook:
針對Django應用需要修改的代碼其實不多, 都集中在settings.py 中.Django settings.py 檔案修改内容:import osfrom 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)),
}
針對OpenShift 模闆Django + PostgreSQL進行修改生成新模闆
模闆簡介
模闆由一組服務(service),建構配置(build config)和部署配置(deployment config)構成。模闆引用必要的鏡像和源存儲庫來建構和部署應用程式。
順便簡單介紹一下模闆編寫時的相關參數:
簡單模闆示例:apiVersion: v1
kind: Template
metadata:
name: redis-template
annotations:
description: "Description"
iconClass: "icon-redis"
tags: "database,nosql"objects:
- apiVersion: v1
kind: Pod
metadata:
name: redis-master
spec:
containers:
- env:
- name: REDIS_PASSWORD
value: ${REDIS_PASSWORD}
image: dockerfile/redis
name: master
ports:
- containerPort: 6379
protocol: TCP
parameters:
- description: Password used for Redis authentication
from: '[A-Z0-9]{8}'
generate: expression
name: REDIS_PASSWORD
labels:
redis: master
描述
模闆描述告知使用者模闆的功能,并幫助他們在Web控制台中搜尋時找到它。模闆名稱之外的其他中繼資料是可選的,但有用。除了一般描述性資訊之外,中繼資料還包括一組标簽(label)。有用的标簽包括模闆與之相關的語言的名稱(例如, java,php,ruby等)。見上文代碼片段的 metadata部分.
标簽
模闆可以包含一組 标簽。這些标簽将添加到執行個體化模闆時建立的每個對象。以這種方式定義标簽使使用者可以輕松查找和管理從特定模闆建立的所有對象。見上文代碼片段的 labels部分.
參數
參數允許值由使用者提供或在執行個體化模闆時生成。然後,隻要引用參數,該值就會被替換。可以在對象清單字段的任何字段中定義引用。這對于生成随機密碼或允許使用者提供自定義模闆所需的主機名或其他特定于使用者的值非常有用。可以通過兩種方式引用參數:通過在模闆中的任何字元串字段中以${PARAMETER_NAME}形式放置值來作為字元串值。
作為json / yaml值,通過在${{PARAMETER_NAME}}格式中放置值代替模闆中的任何字段。見上文代碼片段的 parameters部分.
對象清單
模闆的主要部分是在執行個體化模闆時将建立的對象清單。這可以是任何 有效的API對象,例如 BuildConfig,DeploymentConfig,Service等。該對象将被精确地建立為這裡所定義,和在之前的建立取代的任何參數值。這些對象的定義可以引用先前定義的參數.見上文代碼片段的 objects部分.
修改模闆并導入:notebook:
針對python的官方quickstart模闆有3個:django (1個pod, 資料庫使用sqlite)
django + postgresql (2個pod, 資料庫使用postgresql, 但是資料庫資料沒有持久化)
django + postgresql persistent (2個pod, 資料庫使用postgresql, 資料庫資料進行持久化)
順便說明一下, 模闆檔案幾百行, 看起來挺吓人的, 但是實際上大部分都是自動生成的. 可以通過CLI等工具生成, 或者對現成的模闆做微調.本次模闆共建立了以下幾類對象:django 應用的DC
postgresql 資料庫的DCdjango應用的Service
postgresql資料庫的Service (提供給django使用)Secret - 密鑰對象(存儲加密資訊, 本例中存儲: 資料庫使用者名和密碼, django secret key)
Service - 服務(容器内端口對外暴露并提供負載均衡). 這個模闆有2個:
Route - 路由(對外暴露提供服務, 通常是域名)
ImageStream - 鏡像流(OpenShift特有, 定義如何建構該應用, 包含: 代碼庫位址, 基礎鏡像等資訊)
DeploymentConfig - 部署配置(包含: pod數量及重新開機政策, 可用性探針, 運作時環境變量, 資源閑置等資訊)
PersistentVolumeClaim - 持久性存儲聲明(包含: 存儲大小/讀寫的聲明)
新增内容:新增env和參數:ENABLE_PIPENV (這個參數基礎鏡像就有, 這兒列出來設定為true使之生效)
修改内容:git倉庫相關資訊
pip index url資訊(隻有使用pip方式才生效, 因為我用的是pipenv方式, 實際上沒生效) - 改為阿裡的源.
基礎鏡像從python3.5改為了3.6(沒啥影響, 隻因為我本地用的比較新)根據自己的代碼倉庫資訊, 對參數的預設值做了部分修改. (可選, 不修改也行, 填的時候手動填寫也可以)
對Django pod的可用性探針 - readinessProbe和livenessProbe進行了修改, 改為了自己的測試URI(就是/), 另外逾時時間放長一點.
修改完之後, 導入該模闆到OpenShift: oc create -f .\openshift\templates\django-postgresql-persistent.json(也可以通過UI導入: Catalog Custom Add Import YAML/JSON)
建構 部署并驗證應用在OpenShift 的 Catalog頁面點選新導入的模闆 - Learning Log. 如下圖:
OpenShift Catalog點選Next:
OpenShift Template Info填寫相關的配置資訊:
OpenShift Template Conf
OpenShift Template Conf點選Create. 會自動建立django-psql-persistent應用. 此時, OpenShift會進行如下的動作:下載下傳pipenv及相關依賴包(如virtualenv等)
pipenv根據Pipfile.lock安裝應用所需依賴包
Django執行static檔案移動和資料庫migrate.
推送build完成的鏡像到鏡像庫建立PVC
建立Secret
建立Build 流程, 我是之前有部分代碼有問題, 或者連不上pipenv的源, 建構了4次才成功. (建構也是會啟動一個專門的建構容器, 建構成功後輸出一個建構後部署的鏡像, 同時建構鏡像自動銷毀). 對于: python pipenv django, build流程大緻如下:
OpenShiftDeployment部署應用, 包括: postgresql和django應用鏡像. (pod那個圈是藍色就是成功了)
OpenShift Template Deploy最終部署成功後, 在OpenShift上的Overview顯示如下:
OpenShift Overview
更多細節展示:
容器的環境變量:
OpenShift Pod Env
容器的日志:
OpenShift Pod Logs
容器的終端:
OpenShift Pod Terminal
應用的services:
OpenShift Services
應用的route:
OpenShift Route
:thinking:感悟
K8S概念就很複雜了, OpenShift又在這上面添加了很多新概念, 比如: build, S2I, ImageStream ... 真的不容易了解.
還有就是其實開發人員需要頻繁調試, 修改代碼, 每次修改都得走一遍CI/CD流程. 真的挺耗時的.
目前OpenShift這種容器平台還是需要進一步提升易用性, 畢竟, 開發人員更多精力的是要放在寫代碼上, 建構部署越便捷越簡單越好.
道阻且長啊.
作者:東風微鳴
連結:https://www.jianshu.com/p/dddada5725a2