はじめに
前回の記事でRed Hat OpenShift LocalをMacにインストールしたので、早速それを使ってみることにします。
と言っても、もうRed Hat OpenShift Localの新しいバージョン2.10.2が出ていたのでインストールし直しました。
前提環境
今回使用した手元のRed Hat OpenShift Localの環境はこちらです。
- MacBook Pro (13-inch, 2020)
- MacOS Monterey 12.6
- Red Hat OpenShift Localのバージョン 2.10.2
GitHubなどのGitリポジトリを別途用意してある前提です。
OpenShiftでのCI/CDについて
OpenShiftのCI/CD の概要を参照します。
OpenShiftは、開発者向けのエンタープライズ対応のKubernetesプラットフォームですので、継続的インテグレーション (CI) や継続的デリバリー (CD) などの DevOpsソリューションが提供されています。
- OpenShift Builds
- OpenShift Pipeline
- OpenShift GitOps
OpenShift Buildsを使用するとBuildahを利用してコンテナイメージの生成ができます。
OpenShift Pipelineは、KubernetesネイティブのCI/CDフレームワークであるTektonベースのパイプラインです。
OpenShift GitOpsは、宣言型GitOpsエンジンとしてArgo CDを使用するオペレーターです。
今回は、OpenShift Buildsを使ってみます。
Dockerビルド、Source-to-Image (S2I)ビルド、カスタムビルドが選べるのですが、今回はDockerビルドでDockerfileからコンテナーイメージを生成します。
(Source-to-Image (S2I)ビルドで、アプリケーションソースコードからイメージを作成するというのも便利そうなので、機会があったら試してみたいですね。)
ソースコードの準備
定番のHello worldを作ろうと思いますが、ここ数年pythonが盛り上がっているので、python+FastAPIでやってみます。
FastAPIのサイトにデプロイの説明があります。
その中のDockerを使用したデプロイの解説が充実していますので参照します。
日本語版ではpython3.7で解説されているのですが、英語版ではpython3.9になっているので、python3.9でやってみます。
パス名などは好みで変更します。
Gitリポジトリに以下の構成でソースファイルを置きます。
├── Dockerfile
├── README.md
├── requirements.txt
└── src
└── main.py
Dockerfileは次のとおりです。
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
COPY ./requirements.txt /tmp/requirements.txt
RUN pip3 install --no-cache-dir --upgrade -r /tmp/requirements.txt
EXPOSE 8080
COPY ./src /app
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
requirements.txtも作成します。
fastapi>=0.68.0,<0.69.0
pydantic>=1.8.0,<2.0.0
uvicorn>=0.15.0,<0.16.0
main.pyを作成して、Hello world!と表示するためのコードを書きます。
おまけとして、OpenShift Localでサーバのホスト名としてコンテナ名を取得できるかどうかが気になったので、その確認もしてみます。
from fastapi import Cookie, FastAPI, Request
from typing import Optional
import os
app = FastAPI()
# ルート
@app.get('/')
async def index():
hostname = os.uname()[1]
return{"msg":"Hello world!","hostname":hostname}
ビルドとデプロイ
ログイン
メニューアイコンから、Openshiftコンソール画面を開きます。
ブラウザが起動して、Openshiftコンソールのログイン画面が開きます。
Openshift Localは、デフォルトでkubeadminとdeveloperというユーザーが用意されています。
今回は、アプリケーションのビルドをやってみますので、developerでログインします。
Openshiftコンソール画面は、開発と運用の分離の観点でAdministrator用とDeveloper用に分かれています。
developerでログインすると最初にトポロジーの画面が開きますが、まだプロジェクトがないため新規プロジェクトの作成リンクがあるくらいしか有益な表示がありません。
プロジェクトの作成
新規プロジェクトの作成リンクをクリックして、プロジェクト(名前空間)を作成します。プロジェクト名は、application-dev-1とします。
作成されたプロジェクトの詳細が表示されます。
OpenShift Localは、端末で動かす開発用ツールですので、残念ながらCPU/メモリ等のメトリクスは取得できません。通常のOpenShiftと違うところですね。
Gitからのインポート
次に左のメニューから「追加」を選択します。
表示されたメニューの中から「Gitからのインポート」を選択します。
Gitからのインポートの画面が開くため、ソースコードのGitリポジトリURLを入力します。
すぐにGitタイプの入力も求められるますので、使っているGitタイプを選択します。
詳細のGitオプションの表示を選択します。
ソースシークレットの項目で、「新規シークレット作成」を選択します。
GitリポジトリにアクセスするためのSSHキーをシークレットとして設定します。
名前は、repo-1とします。
(GitリポジトリのアクセスのためのSSHキー作成方法は、GitHub等のヘルプを参照してください)
詳細のGitオプションの表示に戻りますので、そのままスクロールダウンします。
インポートストラテジーの項目で、Dockerfileを選択して、Dockerfile名を指定します。Dockerfileをそのまま入力します。
アプリケーション名と名前は、helloにします。
それ以外は、デフォルトのままで、作成ボタンを押すとトポロジーが表示されてビルドが始まります。
トポロジー
このアイコンから進行中のビルドのログやソースコードリポジトリやデプロイ関係情報、アプリケーションへそれぞれアクセスすることができます。
ビルドが完了したら自動でデプロイされて、トポロジーの円が青になります。
できました。
ホスト名としてコンテナ名が取れていますね。
今回は、Red Hat OpenShift Local上でOpenShift Buildsを使用してpython+FastAPIのアプリケーションをビルドしてデプロイしました。
以上