TL;DR
簡単なPythonスクリプトをFleet + HelmでMinikube環境にデプロイしてみました。
この記事ではデプロイ方法およびFleetについて解説します。
この記事で取り扱うPythonスクリプトやマニフェスト等の設定は、以下のリポジトリにあります。
https://github.com/cacapouh/simple-app
Fleetのインストール
ざっくり言いますと、
Fleetは、GitOpsを活用してコンテナおよびデプロイメントを効果的に管理するエンジンです。
公式サイトの説明にあるように、以下のコマンドでKubernetes環境にデプロイすることができます。
helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \
fleet/fleet-crd
helm -n cattle-fleet-system install --create-namespace --wait fleet \
fleet/fleet
デプロイ対象のPythonスクリプト
サンプルアプリとして、環境変数VERSION
を標準出力するものをデプロイします。
以下はそのためのPythonスクリプト, Dockerfileです。
import os
if __name__ == '__main__':
print("version: {}".format(os.environ["VERSION"]))
FROM python:3.9
RUN mkdir /work
WORKDIR /work
COPY main.py /work
ENTRYPOINT python main.py
以下のコマンドでDockerビルドできます。
docker build . -t simple-app
minikube image load simple-app:latest # イメージをロードしておく
PythonスクリプトをHelm Chartに
helm create
コマンドでHelm Chartを初期化します。
Helmのテンプレート機能につきましては、以下の記事でも説明していますので宜しければご一読お願いします。
以下は、Helm Chart内で扱うdeployment.yml
とChart.yaml
の設定です。
deployment.yml
ではPythonスクリプトの方で読み込む環境変数VERSION
を設定しています。
VERSION
にはChart.yaml
の設定値version
が設定されます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: simple-app-deployment
labels:
app: simple-app
spec:
replicas: 1
selector:
matchLabels:
app: simple-app
template:
metadata:
labels:
app: simple-app
spec:
containers:
- name: simple-app
image: "simple-app:latest"
imagePullPolicy: IfNotPresent
env:
- name: VERSION
value: "{{ .Chart.Version }}"
apiVersion: v2
name: helm
description: A Helm chart for Kubernetes
type: application
version: 0.0.1
appVersion: "0.0.1"
最後に上記のファイル群を適当なGitリポジトリにpushします。
この記事では、以下のリポジトリにpushしました。
FleetにGitリポジトリを監視させる
FleetのGitRepo
というカスタムリソースをデプロイすることによって、
Gitリポジトリの監視設定を加えることが可能です。
以下は https://github.com/cacapouh/simple-app を監視するマニフェストです。
デフォルト設定はmain
ではなくてmaster
ブランチを監視するようになっているため注意が必要です。
apiVersion: fleet.cattle.io/v1alpha1
kind: GitRepo
metadata:
name: simple-app-repo
namespace: fleet-local
spec:
repo: https://github.com/cacapouh/simple-app
branch: main
paths:
- helm
kubectl apply -f repo.yml
デプロイ結果
以下は、リポジトリ監視設定追加後にデプロイされたアプリケーションのログを確認した結果です。
Podのログにversion: 0.0.1
が出力されましたので、正しく動いていそうです。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
simple-app-deployment-75d7b88c6c-2c5k2 0/1 Completed 1 (3s ago) 3s
$ kubectl logs simple-app-deployment-75d7b88c6c-2c5k2
version: 0.0.1
おわりに
簡単なPythonスクリプトをHelmパッケージとしてまとめて、
Gitリポジトリにpushして、それをFleetに監視させることによってデプロイができました