🐈

Azureでコンテナサービスを使ってみる

2021/12/06に公開

はじめに

今回は、前回作成したJavaのDockerイメージを、Azureで提供されているコンテナサービス(Azure Contener Instance, Azure Web App for Container)にデプロイするところまでを紹介します。

実際にテストで利用する場合は、以下の月額費用が時間割(Azure Contener Registory以外)で請求されるので、早めに削除することをお勧めします。

Azureでのコンテナサービス

Azureで提供されているコンテナサービスは、いろいろ存在し、自分なりにIass, Passに分けて、サービス内容および特定プランの月額費用(2021年12月時点、小数切り捨て)を整理してみました。正確な費用計算は、公式サイトを利用してください。

ちなみに、以前、紹介したAzure Static Web App(記事) + Azure FunctionはFass(Function as a Service)の位置づけになります。

Iaas(Infrastructure as a Service)

  • Azure Vertual Machines(VM)
    • 普通にVMにDockerをインストールして利用する。社内だけなら、GitLabと連携すれば十分使える。
    • 月額は、D2s_v3(vCPUx2,Mem8G,4G)だと$94。さらに、1,3年予約やSpotVMを利用すると、$19まで下がる。シリーズによって、様々な価格帯がある。
  • Azure Contener Registory ... 2018年6月GA
    • Dockerイメージをプライベートで管理できる。
    • OCI(Open Container Initiative)というコンテナ標準規格にも対応。
    • 月額は、Basicは10Gで$5, Premiumは500Gで$50 + $0.0001/秒のビルド(日割計算)
       ※プライベートアクセスは、Premiumのみ利用できる。
  • Azure Contener Instance(ACI) ... 2018年4月GA
    • Registoryに登録されたDockerイメージを利用し、ネットワーク設定を行い、デプロイすると利用できる。
    • YMLやJSON, Docker Composeを使用すると、複数コンテナもデプロイできる。Docker Composeだと、一部の機能はサポートされていないらしい。
    • 月額は、1コンテナグループあたりvCPUx1,Mem4Gで$52
  • Azure Kubernetes Service(AKS) ... 2018年6月GA
    • コンテナをKubernetes(k8s)上で動作できるサービス。
    • 複数のノード(サーバ)をクラスタとして統合し、複数のコンテナをクラスタ上で実行することで、拡張性/可用性の高いアーキテクチャを提供でき、無駄なくサーバが使える。その分、設定が難しい。
    • 月額は、F4s v2(vCPUx4,Mem8G,32G)で$154

Pass(Platform as a Service)

  • Azure Web App for Containers ... (Linux版)2017年9月GA, (Windows版)2020年9月GA
    • Azure App Serviceで、作成時にコードではなく、Dockerを選択したときの別の呼び方。
    • 通常のApp Serviceと比べ、任意の言語およびバージョンを利用できるので、便利。
    • 月額は、テスト:Basic A0(vCPUx1,Mem1.75,10G)で$13、CPUx2で倍
      本番:Standard A0(vCPUx1,Mem1.75,50G)で$81、CPUx2で倍
      ※Premium V3以降は3年予約で40%割引もある。
  • Azure Red Hat OpenShift ... 2019年5月GA
    • Red Hat OpenShiftを使って、k8sが利用できる。k8sを直接使うより高機能。
    • 月額は、マスターノード:D8s v3(vCPUx8,Mem32G)で$376
      + ワーカーノード:F4s v2(vCPUx4,Mem8G)で$281
  • Azure Spring Cloud ... 2020年9月GA
    • Springに特化したサービスで、k8s上で動かすことができる。
    • ソースをデプロイするだけで、自動でイメージを作成し、k8s上にデプロイできる。
    • 利用しているSpring Cloudのバージョンにより、ソースのバージョンも依存する。
    • 月額は、テスト:Basic(vCPUx2,Mem4GB)で約$224,+vCPUx1=$64,+Mem1G=$7
      本番:Standard(vCPUx8,Mem16GB)で約$861,+vCPUx1=$82,+Mem1G=$8
  • Azure Container Apps Service ... 2021年11月プレビュー版
    • コンテナ化したアプリをk8s上で簡単に動かすことができる。今後、要注目。
    • Daprとの組み合わせで、様々な言語やバージョンに対応できる。
    • 月額は、未定。プレビュー版は無料。現時点のリージョンはCanada, Europeのみ。

Azure Contener Registory

まずは、公式サイトを元に、Azure上に前回作成したDcokerイメージを登録してみます。

  1. ポータルサイトで、「コンテナー レジストリ」を検索し、[作成]ボタンを押す。
  2. 以下の内容を設定し、[確認および作成]ボタンを押した後、[作成]ボタンを押す。
    ・リソースグループ ... いつも使っているグループ
    ・名前 ... training
    ・レジストリ名 ... 任意の名前(xxxx.azurecr.ioでアクセスできる)
    ・場所 ... 東日本(リソースグループにて自動選択)
    ・SKU ... Basic
  3. 作成したレジストリのメニューからアクセスキーを選択し、管理者ユーザをONに変更し、そこに表示されるユーザー名とpasswordを保持する。
  4. Ubuntu上で、今回作成したコンテナレジストリにログインする。ここからはメニューにあるクイックスタートの内容と同じ。
$ docker login xxxx.azurecr.io
Username: <3で取得したユーザー名>
Password: <3で取得したpassword>
  1. 前回作成したDockerイメージにタグをつけて、プッシュする。
$ docker tag hello-world:0.0.1-SNAPSHOT xxxx.azurecr.io/hello-world:v1
$ docker push xxxx.azurecr.io/hello-world:v1
  1. 動作確認として、タグで作成したDockerイメージを削除し、レジストリから取得してみる。また、ポータル画面のレジストリにもhello-worldが追加されていることを確認する。
docker rmi xxxx.azurecr.io/hello-world:v1
docker pull xxxx.azurecr.io/hello-world:v1

Azure Contener Instance

次に、Contener InstanceでDockerイメージを起動してみます。
色々やってみましたが、まだ使い方がよくわかっていないので、単純にPublic IPにアップロードする手順のみ掲載しました。

  1. Azure CLIをPowerShellにてアップデートする。2.28.0は、既知の問題#19475でコンテナ削除ができなかった。
> az upgrade
Your current Azure CLI version is 2.28.0. Latest version available is 2.30.0.
→ 要再起動
> az --version
  1. 以下のコマンドで、Contener Registoryのイメージからコンテナを作成する。
$ az container create --resource-group <リソース名> --name hello-world --image xxxx.azurecr.io/hello-world:v1 --cpu 1 --memory 1 --registry-login-server xxxx.azurecr.io --registry-username <ユーザID> --registry-password <パスワード> --dns-name-label <DNS名> --ports 8080 --os-type linux
→ リソース名、ユーザID、パスワード、DNS名は、適切な値に変更する。
→ ポータルからはユーザID, パスワードの指定ができなかったので、作成できなかった。
$ az container show --resource-group <リソース名> --name hello-world --out table
→ 一覧表示
$ az container attach --resource-group <リソース名> --name hello-world
→ ログ確認
  1. 以下のURLでアクセスできることを確認する。
    http://<DNS名>.japaneast.azurecontainer.io:8080/hello
  2. ポータルからコンテナを削除する。
$ az container delete --resource-group traning2 --name hello-world 
→ yを押すと削除される。

Azure Web App for Container

次に、Azure App ServiceでDockerイメージを起動してみます。簡単なアプリ起動なら、こっちのほうが簡単です。Docker Composeもアップロードできます。

  1. ポータルサイトで、「App Service」を検索し、[作成]ボタンを押す。
  2. 以下の内容を設定し、[作成]ボタンを押す。
    基本
    ・リソースグループ ... いつも利用しているグループ
    ・名前 ... 任意の名前(xxxx.azurewebsite.netでアクセスできる)
    ・公開 ... Dockerコンテナー
    ・地域 ... Japan East or West
    ・Linuxプラン ... 新規作成で、開発/テストにあるB1を選択。(Freeは起動せず)
    Docker
    ・イメージソース ... Azure Container Registry
    ・レジストリ ... 作成したレジストリ名
    ・イメージ ... hello-world(自動選択)
    ・レジストリ ... v1(自動選択)
  3. メニューにある[構成]から、[+新しいアプリケーション設定]を選択し、以下の設定を追加する。
    ・名前 ... WEBSITES_PORT
    ・値 ... 8080
  4. 設定後に[保存]ボタンを押すと、アプリケーションが再起動する。
  5. 以下のURLで、画面が表示されるか確認する。見れるまで、1~2分かかりました。
    https://<任意の名前>.azurewebsites.net/hello
    ※URLが繋がらない場合は、メニューのログストリームを見て、ログが動いてないようであれば、概要から再起動で繋がりました。

おわりに

今回は、Azureを使ったコンテナサービスを紹介しました。コストだけで考えると、VMで構築したほうが安いのかもしれませんが、k8sを使って拡張性/可用性の高いサービスを構築したいときは、色々な専門知識が必要になるので、Paasでのコンテナ利用が進んでいくのだと思いました。

引き続き、VMとGitLabを使った社内で利用するコンテナサービスについても、記事にしてみたいと思います。

Discussion