クラウドインテグレーション部の髙橋です。
本記事は『コンテナ入門 前編:コンテナとは何者か? コンテナの概要』の続きです。
クラウドにおけるコンテナ、コンテナを使用する各クラウドサービスについてざっくり説明していきます。
各クラウドのコンテナサービスやKubernetesサービスについてざっくり知りたい方はぜひ参考にしていただけたらと思います。
前提として、コンテナ技術を利用することが目的ではないです。
コンテナ化をすることで、以下のようなメリットがあります。
これらによって、オンプレミスにあったものからクラウド化へ繋げやすくなります。
3大クラウド(AWS,Azure,Google Cloud)それぞれにコンテナサービスがあります。そちらについて紹介していきます。
Dockerコンテナを管理するサービスです。Amazon ECSと省略されて呼ばれたりします。
特徴としては以下が挙げられます。
Amazon ECSや後述するEKSで利用するコンテナ環境の運用自動化サービスです。
以下のような特徴があります。
サーバーレスでコンテナを実行するサービスです。ACIと呼ばれたりします。
以下のような特徴があります。
こちらもサーバレスのコンテナ実行環境です。
以下は、マネージドサービスを比較した表です。(2024/3時点)
Google Cloud RunのCPUとメモリが高額になっていますが、毎月無料枠があります。
可用性は、AWS > Google Cloud > Azureの順で高く、AWSとAzureの年間停止時間にはおよそ8時間ほど差があります。
コンテナイメージを保存するレジストリサービスを紹介します。
AWSのコンテナレジストリであり、省略してECRと呼ぶことが多いです。
以下のような特徴があります。
Azureのコンテナレジストリです。
以下のような特徴があります。
Google Cloudの発展型レジストリです。
以下は料金の比較です。(2024/3時点)
Azureのみ料金システムが特殊で、サービスを利用すると別途レジストリ料金が発生します。
その分、最も安いプラン(Basic)では10GBのストレージが付属するので、超過しなければストレージ料金はかかりません。
各クラウドのサービスを紹介する前に、Kubernetesがどのようなサービスなのか紹介します。
Kubernetesは、Googleが2014年頃公開したコンテナオーケストレーションツール(コンテナを管理するツール)です。
「クバネティス」「クーベネティス」「K8s」などの呼び方があります。
Kubernetesを使うことで以下を実現でき、より効率的にコンテナ管理を実施できます。
各クラウドが提供するKubernetesサービスについて紹介していきます。
KubernetesをAWS上で簡単に実行できるようにした、マネージドサービスです。EKSと略されます。
以下のような特徴があります。
Azure上で Kubernetesクラスタの構築・管理を行うサービスです。AKSと略されます。
以下のような特徴があります。
Kubernetesをベースとしたコンテナ マネージドサービスです。GKEと略されます。
それぞれのサービスを比較すると以下の表のようになります。(2024/3時点)
Azure Kubernetes Serviceでは、開発・テスト用クラスタが無料で利用できます。
コンテナサービスのデモとして、Amazon Elastic Container ServiceとAzure Container Instances、
KubernetesのデモとしてGoogle Kubernetes Engineを使ってWebサーバーを立てていきます。
このような構成で作成します。
ECS on Fargateでコンテナを立てます。ALBも作成し、二つのサブネットにあるコンテナにアクセスを振り分ける形にします。
AWSコンソールに入り、ECSコンソール
> タスク定義
> 新しいタスク定義の作成
を選択します。
任意のタスク定義ファミリー名を入力し、インフラストラクチャの要件からAWS Fargate
を選択します。
次に、コンテナイメージとポートの定義です。任意のコンテナ名とコンテナイメージを選びます。今回はNginxにします。ポートは、後ほどブラウザで確認するので80番とします。作成ボタンを押して作成します。
残りはデフォルトのままで、作成
ボタンを押します。
次にクラスタを作成します。クラスタとは、タスクや後述する「サービス」の論理グループのことで、タスクやサービスを実行する基盤となるものです。
任意のクラスタ名を指定します。デフォルトでは名前空間もクラスタ名と同名になります。
インフラストラクチャはAWS Fargate(サーバーレス)
を選択します。
その他はデフォルトのままで、作成します。
クラスタが完成したら、サービスの作成をします。
サービスとは、タスク定義を基に作成されるリソース群のことで、タスクの管理を行うものです。作成
ボタンを押します。
コンピューティングオプションから起動タイプ
、起動タイプからFARGATE
を選択します。
デプロイ設定では、サービス
を選択します。
ちなみにタスク
を選択した場合は、サービスを使わずにタスクを立てることができます。
ファミリー名は、先ほどタスク定義で作成したものを選択します。任意のサービス名をつけます。
ネットワーキングの設定から、VPCとサブネット、セキュリティグループを選択します。ブラウザからアクセスできるように80ポートでインバウンドを設定しておきます。
ロードバランサーの作成もここで行います。Applicaton Load Balancer
を選択し、コンテナは先ほど作成したものを選択します。 任意のロードバランサー名もつけます。
ターゲットグループもここで作成します。任意のターゲットグループをつけます。
ここまで設定ができたら、他はデフォルトで作成します。
2,3分後に作成が完了するので、ALBのDNSからアクセスしてみます。
ブラウザにDNSを入力すると、Nginxのデフォルトページが表示されました!これにて、AWSのデモを完了とします。
Azure Container Instancesでは以下のような構成で作っていきます。
リソースグループ(仮想マシンやストレージなどのAzureリソースをグループ化したもの)を作成し、そこにAzure Container Instancesでコンテナを作成していきます。
作成
を選択します。
作成前に検証を行ってくれます。問題ないのでこのまま作成します。
続いて、Azure Container Instancesでコンテナを作成します。
リソースグループは先ほど作成したものを指定します。コンテナ名は任意のものを入力します。Availability Zonesの追加で可用性を高めることはできますが、今回はNoneのままいきます。
クイックスタートイメージ(Azureが用意しているイメージ)をイメージとして指定します。今回は簡単なWEBページを表示するものを利用します。
ネットワークの設定をします。ブラウザからアクセスしたいので、パブリックを選択します。
DNS名ラベルは任意のものを書きます。 DNS名ラベルは、コンテナに割り当てられるサブドメインのことです。
Azureではリソース作成時に、問題なく作成できるか検証を行ってくれます。検証に成功したので、作成します。
デプロイが完了しました。
コンテナにIPとFQDNが割り当てられています。これらから直接コンテナにアクセスできます。
FQDNをブラウザに入力した結果、ページが表示されました!
Google Cloudのデモは以下のような構成で作成します。
GKEクラスタ、クラスタ内のPod(Kubernetesでデプロイできる最小のオブジェクト)、ロードバランサーを作成します。ロードバランサーから簡単なWebページにアクセスできるものとなっています。
構築の流れとしては、以下のように進めていきます。
参考チュートリアル:アプリを GKE クラスタにデプロイする
まず、Google CloudのコンソールからCloud Shellを選択します。
Google Artifact Registryにコンテナイメージを保存
プロジェクトIDとリージョンの変数を作成しておきます。
export PROJECT_ID=(プロジェクトID)
export REGION=asia-northeast1
Google Artifact Registryのリポジトリを作成します。
gcloud artifacts repositories create hello-repo \
--repository-format=docker \
--location=asia-northeast1 \
--description="Docker repository"
今回使うサンプルのDockerfileをインストールします。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Dockerfileの階層に移動します。
cd kubernetes-engine-samples/quickstarts/hello-app
ビルドしていきます。
docker build -t ${REGION}-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 .
Google Artifact Registryを有効化しておきます。
gcloud services enable artifactregistry.googleapis.com
作成したイメージをGoogle Artifact Registryにプッシュします。
docker push ${REGION}-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
Google Artifact Registryの画面でプッシュしたイメージが確認できます。
GKEクラスタの作成
ここからはGoogle Cloud コンソールで操作していきます。GKEクラスタを作成
からクラスタを作成していきます。任意のクラスタ名とイメージを保存したリージョンを選択します。
クラスタ内のPodアドレス範囲なども設定できますが、今回はデフォルトで作成します。
ワークロードの作成
ワークロード
>デプロイ
からワークロードを作成していきます。
コンテナのイメージから既存のコンテナイメージ
を選択し、Google Artifact Registryにプッシュしたイメージを選択します。
Deployment名からワークロードの名前をつけます。
クラスタは先ほど作成したものを使います。構成YAML
では、今回の行った操作をYAML形式で定義されています。
このYAMLファイルから同じワークロードをデプロイすることができます。
ブラウザからアクセスしたいので、8080ポートをターゲットとしておきます。
また、サービスタイプ
でロードバランサ
を選択します。これでロードバランサーの作成も自動で行ってくれます。
ここまでできたら、作成します。
作成が完了したら、Podを確認します。マネージドPodが3つできていますが、この中でコンテナが起動しています。
では、ロードバランサーのエンドポイントからブラウザでアクセスしてみます。
ページが問題なく表示されました。
前後編を通して、仮想化、コンテナ、クラウドサービスについて紹介してきました。 今後、さらに仮想化やコンテナの利用が活発化していくと考えられるので、本記事で紹介したことが少しでも参考になればと思います。