はじめに
今回はコンテナオーケストレーションツールの代表格である「Kubernetes」をAuzre上で実行することのできる、「Azure Kubernetes Service(AKS)」について紹介します。
コンテナオーケストレーションツールやKubernetesとは何かについて説明し、AKSを使ってコンテナ化アプリケーションを実行していきます。
Kubernetesとは
Azure Kubernetes Service(AKS)を紹介するにあたって、まずはKubernetesについて説明していきます。
Kubernetesとは
Kubernetesは複数のマシンで構成される環境でのコンテナの実行を管理をするためのツールです。Dockerが単一のマシンに対するコンテナのライフサイクルを提供するのに対し、Kubernetesは複数のマシンにまたがってコンテナの実行を管理するための機能を提供します。DockerではDockerfileを使った方法などでコンテナを作成したり、コンテナをコンテナレジストリに登録したりすることができますが、Kubernetesはあくまでコンテナの実行のみをサポートしています。
Kubernetesの代表的な機能や特徴として、以下のものがあります。
・コンテナオーケストレーション
コンテナを実行するマシンに障害が発生した場合にコンテナを終了して他のマシン上で自動的に再起動させるセルフヒーリング機能や、負荷などの条件によって稼働するコンテナ数を増減させるオートスケーリングなどのコンテナ管理機能を有しています。
・設定ファイルに理想的なデプロイ状態を記述する「宣言型」
コンテナ群が最終的にこういう状態で実行していてほしいという情報をマニュフェストファイルと呼ばれる設定ファイルに記述し、それをKubernetesに適用することでコンテナ群を操作する仕組みをとっています。これによりKubernetesのユーザーは、コンテナ群をどのようにKubernetes上にデプロイするかの手順を気にせず、理想的な状態の定義に集中できます。
・高い拡張性
Kubernetesは大規模なツールですが、構成要素はコンポーネントとして分割されておりそれぞれが拡張可能となっています。Kubernetesではコンポーネントをカスタマイズしたり機能を追加するためのプラグインやAPIなどが用意されており、自分でプラグインを作成したりオープンソースで公開されているものを利用したりすることができます。
Kubernetesの代表的なリソース
Kubernetesの実行環境をKubernetesクラスターと呼びます。Kubernetesクラスター内には「コントロールプレーン」と呼ばれるクラスター全体の管理を行うためのコンポーネントと、「ノード」と呼ばれるコンテナの実行を担当するコンポーネントがあります。
以下はノードに対してアプリケーションをデプロイする際に使用する、代表的なリソースの例です。
・ポッド(Pod)
KubernetesはPodと呼ばれるリソースをデプロイの最小単位として取り扱います。Podは1つまたは複数のコンテナとストレージやネットワーク等の共有リソースをひとまとめにしたもので、Pod単位でノードにデプロイされます。
・デプロイ(Deployment)
PodはPod単体でノードにデプロイすることができますが、通常はDeploymentと呼ばれるリソースを使ってデプロイを行います。Deploymentを使用することでKubernetesの特徴であるセルフヒーリングやオートスケーリングなどの機能がPodに対して適用されます。
・サービス(Service)
Pod内で実行されているコンテナアプリケーションのサービスにアクセスするためのリソースがServiceです。Serviceを使用することでPodは他のPodやKubernetes外からアクセス可能になります。Serviceを使用することで、スケールアウトによって同じ機能を持つPodがKubernetesクラスター上に複数存在するような場合に、共通のIPアドレスからアクセスできるようになることからサービスディスカバリとしても機能します。
Azure Kubernetes Serviceとは
Azure Kubernetes Service(AKS)とはKubernetesクラスターをAzureのクラウド上で実行することのできるマネージドサービスです。Kubernetes導入におけるハードルとなっているKubernetesクラスターの構築や監視などをAzureに任せられるため、自前でKubernetes環境を構築する場合に比べて運用管理の手間を減らしてKubernetesを利用できるようになっています。
AKSではノードは仮想マシン(VM)として提供されるため、CPUやメモリ等のVMのリソースの選択肢が多くまた容易にスケールさせることができるようになっています。AKSではKubernetesのデプロイや管理にかかる料金は無料となっており、ノードとして実行しているVMとそれに関連するネットワークやストレージに対する従量課金制となっている点も特徴です。
Azure Kubernetes Serviceでコンテナ化アプリケーションを実行する
ここからは実際に、AKS上でアプリケーションを稼働させていきます。AKS上にデプロイするアプリケーションとして、前回実装したFlaskのWebアプリケーションおよびRedisを使用します。
コンテナの準備
まずはAKSが使用するWebアプリケーションのコンテナを作成します。前回実装した「app.py」の一部分を変更します。
アプリケーションコードの修正(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 AKS! {}回目のアクセスです。\n'.format(count)
# アプリケーションの起動(外部公開できる状態で起動)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
Redisの初期化処理で接続先となるRedisのホストアドレスの情報を、「REDIS_SERVER」という名前の環境変数から取得したものを参照するようにしています。この環境変数の値は、後ほど説明するマニュフェストファイルの中で設定していきます。また環境変数参照のためにosモジュールを使用するため、「import os」をファイル冒頭に追加しています。
次に実装したアプリケーションをコンテナイメージ化していきます。コンテナ化する際に必要な「Dockerfile」および「requirements.txt」は前回と同じ内容のものとなるため割愛します。コンテナイメージが作成されたら、ACRへイメージをプッシュします。
Webアプリケーションコンテナのイメージ化とACRへのプッシュ
$ docker login zerokara.azurecr.io
$ docker build -t zerokara-aks-webapp:latest .
$ docker tag zerokara-aks-webapp:latest zerokara.azurecr.io/zerokara-aks-webapp:latest
$ docker push zerokara.azurecr.io/zerokara-aks-webapp:latest
イメージをACRにプッシュすることができたら、AKSを作成していきます。
Kubernetesクラスターの作成
Azureポータル上からAKSのKubernetesクラスターを作成していきます。ポータル上部の検索窓で、「AKS」または「Kubernetes」と入力すると表示される「Kubernetes サービス」を選択します。作成したAKSの一覧画面が表示されるので、画面左上または画面下部にある「作成」ボタンを選択し、「Kubernetes クラスターの作成」を選択します。
Kubernetesクラスターの作成画面に遷移するので、基本情報を入力していきます。
AKSクラスターの基本情報入力例
設定項目名 | 設定値 |
---|---|
サブスクリプション | 任意のものを入力 |
リソースグループ | 任意のものを入力 |
クラスターのプリセット構成 | Dev/Test ($) |
Kubernetesクラスター名 | 任意のものを入力 |
地域 | 任意のものを入力 |
可用性ゾーン | なし |
Kubernetesバージョン | 規定となっているバージョン(執筆時点では「1.22.11」) |
APIサーバーの可用性 | 99.5% |
ノードサイズ | Standard B4ms |
スケーリング方法 | 自動スケーリング |
ノード数の範囲 | 1から2 |
今回はテスト用途でKubernetesクラスターを作成するため、開発やテスト向けに推奨されている構成で設定をするようにしています。基本情報をすべて入力・選択したら、画面上部にある「統合」タブを選択します。なお「ノードプール」、「アクセス」、「ネットワーク」タブの内容についてはデフォルトのままとします。
「統合」タブではKubernetesクラスターを他のAzureリソースと連携させることができます。「Azure Container Registry」の項目にある「コンテナーレジストリ」から、Webアプリケーション用のコンテナイメージをプッシュしたコンテナーレジストリを選択します。他の項目はそのままとし、画面下部の「確認および作成」ボタンを選択します。
作成するKubernetesクラスターの設定内容のプレビューが表示されるので、内容を確認して画面下部の「作成」ボタンを押下します。
しばらく待つとKubernetesクラスターの作成が完了します。