コンテナ入門 後編: クラウドにおけるコンテナ

    コンテナ入門 後編: クラウドにおけるコンテナ

    目次

      はじめに

      クラウドインテグレーション部の髙橋です。
      本記事は『コンテナ入門 前編:コンテナとは何者か? コンテナの概要』の続きです。
      クラウドにおけるコンテナ、コンテナを使用する各クラウドサービスについてざっくり説明していきます。

      各クラウドのコンテナサービスやKubernetesサービスについてざっくり知りたい方はぜひ参考にしていただけたらと思います。

      なぜコンテナ化するのか

      前提として、コンテナ技術を利用することが目的ではないです。

      コンテナ化をすることで、以下のようなメリットがあります。

      • 高い可搬性
        • 異なる環境へ直ぐにデプロイできるため、クラウドへの移行がしやすい
      • より迅速なデプロイの実現
        • 開発サイクルを高速化できる

      これらによって、オンプレミスにあったものからクラウド化へ繋げやすくなります。

      各クラウドのコンテナサービス

      3大クラウド(AWS,Azure,Google Cloud)それぞれにコンテナサービスがあります。そちらについて紹介していきます。
      各クラウドのコンテナサービス_画像

      Amazon Elastic Container Service

      Dockerコンテナを管理するサービスです。Amazon ECSと省略されて呼ばれたりします。
      特徴としては以下が挙げられます。

      • シンプルだが、非常にパワフル
      • スケーリングや機能などを犠牲にすることなく、非常にスムーズに利用可能
      • アプリケーションの構築、導入にかかる時間を短縮できる
      • 「EC2」と「Fargate」の2つの起動タイプ
        • EC2タイプはカスタマイズ性に優れる
        • Fargateタイプはインスタンス管理が不要
      • 拡張性
        • 水平スケーリング、垂直スケーリングが可能

      AWS Fargate

      Amazon ECSや後述するEKSで利用するコンテナ環境の運用自動化サービスです。
      以下のような特徴があります。

      • サーバーレス
        • インスタンスのOSやDocker Agent、ミドルウェアなどの構築や設定操作の手間が省ける
        • 実行時に必要なCPUやメモリの設定だけで構築できる

      Azure Container Instances

      サーバーレスでコンテナを実行するサービスです。ACIと呼ばれたりします。
      以下のような特徴があります。

      • 素早い起動が可能
        • 数秒で起動し、稼働した秒単位で課金がされる
      • コンテナオーケストレーションや自動スケーリング機能なし
        • Azure Kubernetes Service (AKS)と連携させることでロードバランシングはできる
      • 直接アクセスが可能
        • コンテナ単位でPublic IP、DNSが提供される

      Google Cloud Run

      こちらもサーバレスのコンテナ実行環境です。

      • フルマネージド
        • インフラストラクチャの管理が不要
      • アプリケーションの移行が簡単
        • Knative が基盤
        • アプリケーションの移植が可能
      • 高速な自動スケーリングが可能
        • 最小インスタンスを「0」にでき、アクセスが来たらインスタンスを起動することができる
        • 起動時間を削減し、コストを下げられる

      比較

      以下は、マネージドサービスを比較した表です。(2024/3時点)
      Google Cloud RunのCPUとメモリが高額になっていますが、毎月無料枠があります。
      可用性は、AWS > Google Cloud > Azureの順で高く、AWSとAzureの年間停止時間にはおよそ8時間ほど差があります。
      コンテナサービス_比較表

      各クラウドのレジストリサービス

      コンテナイメージを保存するレジストリサービスを紹介します。
      各クラウドのレジストリサービス_画像

      Amazon Elastic Container Registry

      AWSのコンテナレジストリであり、省略してECRと呼ぶことが多いです。
      以下のような特徴があります。

      • フルマネージド
        • 運用・管理などが不要
      • 高可用性と耐久性
        • コンテナイメージはAmazon S3に保存
      • セキュア
        • コンテナイメージがHTTPS経由で転送
        • 保管時にイメージが自動的に暗号化
      • シンプルなワークフロー
        • Amazon ECSとDocker CLIに統合されている
        • 開発から本稼働までのワークフローを簡略化できる

      Azure Container Registry

      Azureのコンテナレジストリです。
      以下のような特徴があります。

      • フルマネージド
        • 運用・管理などが不要
      • セキュア
        • コンテナイメージがHTTPS経由で転送
        • 保管時はイメージが自動的に暗号化
      • 統合セキュリティ
        • Azure ADをネイティブにサポートする

      Google Artifact Registry

      Google Cloudの発展型レジストリです。

      • フルマネージド
        • 運用・管理などが不要
      • セキュア
        • コンテナイメージがHTTPS経由で転送
        • 保管時はイメージが自動的に暗号化
      • マルチコンテンツのレジストリ
        • コンテナイメージ以外のもの(言語・OSパッケージ)を管理できる

      比較

      以下は料金の比較です。(2024/3時点)
      Azureのみ料金システムが特殊で、サービスを利用すると別途レジストリ料金が発生します。
      その分、最も安いプラン(Basic)では10GBのストレージが付属するので、超過しなければストレージ料金はかかりません。
      レジストリサービス_比較表

      Kubernetesとは

      各クラウドのサービスを紹介する前に、Kubernetesがどのようなサービスなのか紹介します。

      Kubernetesは、Googleが2014年頃公開したコンテナオーケストレーションツール(コンテナを管理するツール)です。
      「クバネティス」「クーベネティス」「K8s」などの呼び方があります。

      Kubernetesを使うことで以下を実現でき、より効率的にコンテナ管理を実施できます。

      • 負荷分散
        • アクセスの振り分けを行う
      • コンテナ間通信
        • コンテナ間のネットワークを管理する
      • 自動スケーリング
        • コンテナの負荷からノードの増減を行う
      • 複数ホストでのコンテナ管理
        • 下の図のように、複数のホストマシンに跨ったコンテナ管理が可能
      • コンテナ監視
        • 障害発生などを検知する

      Kubernetes_画像

      各クラウドのKubernetesサービス

      各クラウドが提供するKubernetesサービスについて紹介していきます。
      各クラウドのKubernetesサービス_画像

      Amazon Elastic Kubernetes Service

      KubernetesをAWS上で簡単に実行できるようにした、マネージドサービスです。EKSと略されます。
      以下のような特徴があります。

      • 高可用性
        • 複数のAZ(アベイラビリティーゾーン)でKubernetes管理インフラを実行
        • 問題が発生した場合は、問題が発生したノードを自動的に検出、置換
      • マネージドインフラ
        • Kubernetes管理インフラの自動アップグレード
      • 「EC2」と「Fargate」タイプを選択可能

      Azure Kubernetes Service

      Azure上で Kubernetesクラスタの構築・管理を行うサービスです。AKSと略されます。
      以下のような特徴があります。

      • 運用効率の向上
        • 監視・スケーリング・クラスタの作成などの自動化
        • 運用管理のオーバーヘッドを大幅に削減
      • 優れた拡張性
        • Kubernetes を使用して、コンテナの計算能力を数秒で柔軟に増減できる
      • 認証基盤連携
        • Azure ADとの優れた連携が可能

      Google Kubernetes Engine

      Kubernetesをベースとしたコンテナ マネージドサービスです。GKEと略されます。

      • 頻繁な自動アップデート
        • KubernetesはGoogleが開発
        • 早い段階でアップデートに対応
      • 運用負荷の軽減
        • GKE Autopilotを利用することでノードの管理(作成・更新・削除・バージョン管理等)が不要
      • コミュニティの充実
        • イベントやミートアップの定期開催

      比較

      それぞれのサービスを比較すると以下の表のようになります。(2024/3時点)
      Azure Kubernetes Serviceでは、開発・テスト用クラスタが無料で利用できます。
      Kubernetesサービス_比較表

      各サービスのデモ

      コンテナサービスのデモとして、Amazon Elastic Container ServiceとAzure Container Instances、
      KubernetesのデモとしてGoogle Kubernetes Engineを使ってWebサーバーを立てていきます。

      Amazon Elastic Container Service

      このような構成で作成します。
      ECS on Fargateでコンテナを立てます。ALBも作成し、二つのサブネットにあるコンテナにアクセスを振り分ける形にします。
      AWSデモ構成図_画像まずはタスク定義から作成していきます。タスク定義とは、コンテナグループ管理のための要件定義のようなものです。タスク定義では、コンテナのCPUやメモリのサイズ、コンテナイメージなどの選択をします。

      AWSコンソールに入り、ECSコンソール > タスク定義 > 新しいタスク定義の作成を選択します。
      任意のタスク定義ファミリー名を入力し、インフラストラクチャの要件からAWS Fargateを選択します。
      AWSデモ画像0
      次に、コンテナイメージとポートの定義です。任意のコンテナ名とコンテナイメージを選びます。今回はNginxにします。ポートは、後ほどブラウザで確認するので80番とします。作成ボタンを押して作成します。
      AWSデモ画像1
      残りはデフォルトのままで、作成ボタンを押します。

      次にクラスタを作成します。クラスタとは、タスクや後述する「サービス」の論理グループのことで、タスクやサービスを実行する基盤となるものです。

      任意のクラスタ名を指定します。デフォルトでは名前空間もクラスタ名と同名になります。
      AWSデモ画像2
      インフラストラクチャはAWS Fargate(サーバーレス)を選択します。
      その他はデフォルトのままで、作成します。
      AWSデモ画像3

      クラスタが完成したら、サービスの作成をします。
      サービスとは、タスク定義を基に作成されるリソース群のことで、タスクの管理を行うものです。
      作成ボタンを押します。
      AWSデモ画像4
      コンピューティングオプションから起動タイプ、起動タイプからFARGATEを選択します。
      AWSデモ画像5
      デプロイ設定では、サービスを選択します。
      ちなみにタスクを選択した場合は、サービスを使わずにタスクを立てることができます。
      ファミリー名は、先ほどタスク定義で作成したものを選択します。任意のサービス名をつけます。
      AWSデモ画像6
      ネットワーキングの設定から、VPCとサブネット、セキュリティグループを選択します。ブラウザからアクセスできるように80ポートでインバウンドを設定しておきます。
      AWSデモ画像7
      ロードバランサーの作成もここで行います。
      Applicaton Load Balancerを選択し、コンテナは先ほど作成したものを選択します。 任意のロードバランサー名もつけます。
      AWSデモ画像8
      ターゲットグループもここで作成します。任意のターゲットグループをつけます。
      AWSデモ画像9
      ここまで設定ができたら、他はデフォルトで作成します。

      2,3分後に作成が完了するので、ALBのDNSからアクセスしてみます。
      AWSデモ画像10

      ブラウザにDNSを入力すると、Nginxのデフォルトページが表示されました!これにて、AWSのデモを完了とします。
      AWSデモ画像11


      Azure Container Instances

      Azure Container Instancesでは以下のような構成で作っていきます。
      リソースグループ(仮想マシンやストレージなどのAzureリソースをグループ化したもの)を作成し、そこにAzure Container Instancesでコンテナを作成していきます。
      Azureデモ構成図_画像まず、Azureコンソールに入り、リソースグループを選択します。
      Azureデモ画像0

      作成を選択します。
      Azureデモ画像1任意のリソースグループ名を入力します。
      Azureデモ画像2
      作成前に検証を行ってくれます。問題ないのでこのまま作成します。
      Azureデモ画像3

      続いて、Azure Container Instancesでコンテナを作成します。
      Azureデモ画像4
      リソースグループは先ほど作成したものを指定します。コンテナ名は任意のものを入力します。Availability Zonesの追加で可用性を高めることはできますが、今回はNoneのままいきます。
      Azureデモ画像5
      クイックスタートイメージ(Azureが用意しているイメージ)をイメージとして指定します。今回は簡単なWEBページを表示するものを利用します。
      Azureデモ画像6
      ネットワークの設定をします。ブラウザからアクセスしたいので、パブリックを選択します。
      DNS名ラベルは任意のものを書きます。 DNS名ラベルは、コンテナに割り当てられるサブドメインのことです。
      Azureデモ画像7
      Azureではリソース作成時に、問題なく作成できるか検証を行ってくれます。検証に成功したので、作成します。
      Azureデモ画像8
      デプロイが完了しました。
      Azureデモ画像9

      コンテナにIPとFQDNが割り当てられています。これらから直接コンテナにアクセスできます。
      Azureデモ画像10

      FQDNをブラウザに入力した結果、ページが表示されました!
      Azureデモ画像11

       

      Google Kubernetes Engine

      Google Cloudのデモは以下のような構成で作成します。
      GKEクラスタ、クラスタ内のPod(Kubernetesでデプロイできる最小のオブジェクト)、ロードバランサーを作成します。ロードバランサーから簡単なWebページにアクセスできるものとなっています。
      GoogleCloud構成図_画像

      構築の流れとしては、以下のように進めていきます。

      • Google Artifact Registryにコンテナイメージを保存
      • GKEクラスタの作成
      • ワークロード(クラスタ内を管理するリソース)の作成

      参考チュートリアル:アプリを GKE クラスタにデプロイする

      まず、Google CloudのコンソールからCloud Shellを選択します。
      GoogleCloudデモ画像0

      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の画面でプッシュしたイメージが確認できます。
      GoogleCloudデモ画像1

      GKEクラスタの作成

      ここからはGoogle Cloud コンソールで操作していきます。
      GKEクラスタを作成からクラスタを作成していきます。任意のクラスタ名とイメージを保存したリージョンを選択します。
      GoogleCloudデモ画像2

      クラスタ内のPodアドレス範囲なども設定できますが、今回はデフォルトで作成します。
      GoogleCloudデモ画像3
      GoogleCloudデモ画像4

      ワークロードの作成

      ワークロード>デプロイからワークロードを作成していきます。
      コンテナのイメージから既存のコンテナイメージを選択し、Google Artifact Registryにプッシュしたイメージを選択します。
      GoogleCloudデモ画像5
      Deployment名からワークロードの名前をつけます。
      GoogleCloudデモ画像6
      クラスタは先ほど作成したものを使います。
      GoogleCloudデモ画像7
      構成YAMLでは、今回の行った操作をYAML形式で定義されています。
      このYAMLファイルから同じワークロードをデプロイすることができます。
      GoogleCloudデモ画像8
      ブラウザからアクセスしたいので、8080ポートをターゲットとしておきます。
      また、サービスタイプロードバランサを選択します。これでロードバランサーの作成も自動で行ってくれます。
      GoogleCloudデモ画像9
      ここまでできたら、作成します。

      作成が完了したら、Podを確認します。マネージドPodが3つできていますが、この中でコンテナが起動しています。
      では、ロードバランサーのエンドポイントからブラウザでアクセスしてみます。
      GoogleCloudデモ画像10

      ページが問題なく表示されました。
      GoogleCloudデモ画像11

      まとめ

      前後編を通して、仮想化、コンテナ、クラウドサービスについて紹介してきました。 今後、さらに仮想化やコンテナの利用が活発化していくと考えられるので、本記事で紹介したことが少しでも参考になればと思います。