はじめに
前回はマイクロサービスアーキテクチャのアプリケーション構築を支援する「Dapr」を使ってAKS上にアプリケーションを構築していく方法について説明しました。今回はKubernetesのアプリケーションをパッケージ化して管理・運用できるツールである「Helm」を使ったアプリケーションのデプロイ方法について説明していきます。
Helmを使ってKubernetesアプリケーションを構築しよう
Kubernetesを使ってアプリケーションを作成したりデプロイする際にはマニュフェストファイルの作成が必要です。アプリケーションの規模が大きくなってくると、マニュフェストファイルの量も膨大になり、管理やメンテナンスの負荷が高くなってしまいます。今回紹介するHelmを使用することで、これらの課題がどのように解消されるかを見ていきましょう。
Helmとは
Kubernetesでは、アプリケーションのあるべき姿を定義したマニュフェストファイルを使ってクラスタ上にアプリケーションをデプロイします。このマニュフェストファイルは、基本的にKubernetesにデプロイしたいアプリケーションの数だけ用意する必要があります。そのため、大規模なシステムになると膨大な量のマニュフェストファイルの管理やメンテナンスが課題となってきます。
Helmはこの様なKubernetesでのアプリケーション管理の複雑さの解消を手助けするツールです。Helmは公式サイトのトップに「The package manager for Kubernetes」と掲げている通り、Kubernetesのためのパッケージマネージャーです。
以下はHelmの概念図です。
Helmには、「チャート」、「リリース」、「リポジトリ」という基礎となる3つの概念が存在します。
Helmチャート
Helmでは、チャートと呼ばれる単位でKubernetes上にデプロイされるアプリケーションのマニュフェストファイル群をパッケージ化して管理します。
チャートは、テンプレートファイルと呼ばれるKubernetesのマニュフェストファイルをテンプレート化したファイル群で構成されています。チャートを使ってKubernetes上にアプリケーションをデプロイする際は、テンプレートファイルに具体的な設定値を与える設定ファイルを用意します。Helmはテンプレートファイルと設定ファイルからKubernetesが認識できるマニュフェストファイルを生成してデプロイを行います。
またチャートは自作できる他、Helmリポジトリに公開されているチャートを利用することも可能です。例えば自作したチャートでHelmリポジトリに公開されている別のチャートを依存関係として定義すると、自作チャートをKubernetesクラスタにデプロイする際に依存するチャートの内容も同時にデプロイすることができるようになります。
Helmリリース
HelmチャートをKubernetes上にデプロイする行為をHelmリリースと呼びます。Helmリリースはリビジョンという通し番号で管理されます。チャートの設定値を更新して再度デプロイした場合などに新しいリビジョン番号でHelmリリースが行われます。以前のリビジョンのHelmリリースの情報は保存されるため、以前のリリース状態に戻す「ロールバック」といった操作も可能になります。
Helmリポジトリ
Helmチャートを公開して利用するためのリポジトリをHelmリポジトリと呼びます。自作したHelmチャートをHelmリポジトリに公開したり、公開されている別のチャートを使用することができます。Helm公式のHelmリポジトリである「https://charts.helm.sh/stable」の他にもリポジトリは多数存在しており、コミュニティが公開しているHelmチャートを使うことでKubernetesにデプロイするアプリケーション群をHelmで包括的に管理することができるようになります。
WebアプリケーションのHelmチャートを作ろう
ここからは実際にHelmを使ってWebアプリケーションをAKS上にデプロイしていきます。アプリケーション部分の説明を簡素化するために、これまでに作成してきたFlaskとRedisを使ったアクセスカウンターのWebアプリケーションを実装します。
コンテナ化するWebアプリケーションの実装
まずはAKS上で実行させたいアプリケーションの実装を行っていきます。任意のフォルダ上に「zerokara-aks-helm」というフォルダを作成します。さらにその中に「src」というフォルダを作成し「app.py」というファイルを作成します。
アクセスカウンターアプリの実装(zerokara-aks-helm/src/app.py)
# Flaskのインポート
from flask import Flask
# Redisのインポート
from redis import Redis
import os
# Flaskの使用
app = Flask(__name__)
# Redisの初期化
redis_server = os.environ['REDIS_SERVER']
redis = Redis(host=redis_server, port=6379)
# 公開するAPIの定義
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello Helm! {}回目のアクセスです。\n'.format(count)
# ヘルスチェック用のAPIの定義・・・①
@app.route('/health')
def health():
try:
redis.ping()
except redis.exceptions.ConnectionError:
return 'NG', 500
return 'OK', 200
# アプリケーションの起動(外部公開できる状態で起動)
if __name__ == "__main__":
app.run(host="0.0.0.0", port="5000", debug=True)
以前紹介したアクセスカウンタの実装に、ヘルスチェック用のAPIを新たに追加しました(①)。このAPIではRedisへの疎通が取れているかどうかをpingメソッドを使って確認し、Redisから応答があればHTTPステータスコード200を、Redisとの接続に失敗した場合はHTTPステータスコード500を返すようにしています。このヘルスチェックAPIは、後ほど説明するHelmが生成したDeployment用のテンプレートの中で使用していきます。