【DevOpsLab 深堀】マルチコンテナアプリケーションを Azure Pipeline で AKS にデプロイする

マルチコンテナアプリケーションを Azure Pipelineで AKS にデプロイするラボがあったので、これを深堀してみたいと思います。

(参考)Deploying a multi-container application to Azure Kubernetes Services
https://azuredevopslabs.com/labs/vstsextend/kubernetes/

#今回やること整理
今回作成してみるアーキテクチャは以下のようなものです。ローカルで開発者が変更して Git Push したことをトリガーとしてビルド、AKS へのデプロイを自動化しています。ビルドされた Docker イメージは `Azure Container Registry` を使用しており、そのイメージをリリースパイプラインで AKS にプッシュ、それと同時に Azure SQL もDackpackしています。Pipeline から AKS のリリースパイプラインを作成するところが GUI ベースで簡単に作成できるのがこのラボの肝の部分かと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/2478599f-72cc-2135-b5a7-3922163ea1d4.png)

今回作成するサービスはすべて MS サービスで完結されていますが、Azure Container Registry を Docker Hub に置き換えたり、Azure Pipeline そのものを GitHub Actions に置き換えることも可能かと思います。ただその場合は Docker Hub 側の不具合があった場合の切り分けが大変だったり、GitHub Actions だと YAML ベースで Pipeline を作成する必要があるので、シンプルに MS サービスにまとめることを推奨します。

無事にアプリケーションがデプロイでいると、AKS の External IP にアクセスした際に以下のようなアプリケーションが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/536a17d5-2412-7e79-98c7-ea2a354f0a5c.png)
このアプリケーションは APS.NET Core で構成されている Docker ベースのアプリケーションでローカルにコードをクローンすることで実際のコードも確認することができます。ではコード変更、ビルド、デプロイを自動化するマルチコンテナアプリケーションを実際に構成していってみましょう！

#環境をセットアップする
環境のセットアップですが、Demo Generator でコードと基本的な Pipeline は自分の環境にコピーすることができます。今回使うテンプレートは `Azure Kubernetes Service` というテンプレートです。Azure DevOps の自分の環境を選択して Demo Generator から構成します。

(参考)Azure DevOps Demo Generator の AKS テンプレート作成リンク
https://azuredevopsdemogenerator.azurewebsites.net/environment/createproject

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/bf575586-6c4d-4885-9371-e8fce5112e13.png)

無事コピーされると自分の Azure DevOps 環境にコードやパイプラインの設定が生成されていることが確認できます。これはデモとかを作成する際に非常に便利ですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/8e1cf0f0-fb4e-212a-295c-df34e2ac47d9.png)

今回は一人の組織なので Borads 機能は使わないと思いますが、ストーリーなどもテンプレの中に含まれています。もろもろ改善しようとしている機能が見えますね。これは実際アジャイルのデモをする際にも参考になるデモかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/14988f66-03c7-45d5-5444-1ce744285225.png)

これで環境のセットアップは完了です。次にビルド、リリースパイプラインを構成していきましょ。

#ビルド、リリースパイプラインを構成する
では具体的に値を設定、、、と行きたいところですが、まだ Azure にリソースは作成されていませね。今回作成するリソースは 3つなのでひとつづつ作成してもよいですが、めんどくさいので Azure CLI を使ってコマンドコピペ一発で作成してしまいましょう。
##その前に Azure に必要なリソースをデプロイ
以下コマンドを Azure CLI に打ち込むだけで必要なリソースが 10 分くらいでデプロイできます。本当は ARM Templete でしっかり IaC をやるべきですが、今回のようにデモ環境を作りたいだけの場合はこれで十分でしょう。

まずはリソースグループと AKS を作成します

```
version=$(az aks get-versions -l <region> --query 'orchestrators[-1].orchestratorVersion' -o tsv)
az group create --name akshandsonlab --location <region>
az aks create --resource-group akshandsonlab --name <unique-aks-cluster-name> --enable-addons monitoring --kubernetes-version $version --generate-ssh-keys --location <region>
```
次に Azure Container Registry を作成します。

```
az acr create --resource-group akshandsonlab --name <unique-acr-name> --sku Standard --location <region>
az aks update -n $AKS_CLUSTER_NAME -g $AKS_RESOURCE_GROUP --attach-acr $ACR_NAME
```

最後に Azure SQL を作成します。

```
az sql server create -l <region> -g akshandsonlab -n <unique-sqlserver-name> -u sqladmin -p P2ssw0rd1234
az sql db create -g akshandsonlab -s <unique-sqlserver-name> -n mhcdb --service-objective S0
```

これで OKです。Azure Portal の作成したリソースグループを確認すると、Database を含めて 4つのリソースが作成できていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/b4aec717-6411-d62b-d565-50ee6c6a4d2a.png)
ではパイプラインに具体的な値を設定していきます。

##リソースの値をもとにパイプラインを設定していく
###ビルドパイプランを設定
以下のような感じでビルドパイプランを設定します。テンプレートからのデプロイで必要な値は設定されているので、サブスクリプション設定や、バイナリ設定を中心に変更を加えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/fce0d695-9572-8ba9-6831-b98cf2ae43a6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/4cd21c8c-8926-d0c0-a986-436cf92678fc.png)

設定を変更できたら実際にビルドを走らせてみます。成功するとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/c3606288-2413-4cde-0726-83c9e5de4428.png)
###リリースパイプラインを設定
では次にリリースパイプラインを設定します。
リリースパイプラインも基本的にはテンプレからコピーされているので、リソース名、バイナリの値を中心に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/dafd3701-1e37-b989-243b-36f10f1e88bf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/94a79a60-fa09-25ff-a781-e900fb3f2abd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/b6c585fa-76f5-7ebc-63f3-450317a9b8bb.png)
これでリリースパイプラインの設定は完了です。

#ビルドをトリガーとしてアプリケーションをデプロイする
では実際にファイルを少しいじってみてアプリケーションをデプロイしてみましょう！今回は適当に Head の部分の値を少しいじってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/8a615ff3-9f44-ca80-b1d8-ec203856cb49.png)
そのまま Azure DevOps 上で Master ブランチへ Commit してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/ccd317b4-9209-bbd2-d105-e1c95fff7470.png)
すると自動的にパイプラインが走り始めます。自動的に走らない場合は CI の設定を有効化させてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/20085c6f-bee5-0bd1-2a41-89c3c54fbb3f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/d193b596-e61e-9f2c-25ab-eeb46461f78e.png)

無事に完了すると、リリースパイプラインで AKS、AzureSQL へのデプロイが完了していることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/443ae1ad-46d8-a7cc-a849-185c36bb0a6e.png)

これでマルチコンテナアプリケーション を AKS にデプロイするパイプランを作成し、アプリケーションが AKS 上で無事に動き始めました。

#デプロイされたサービスを確認する
デプロイされたサービスは Azure Portal の AKS のサービスから確認できます。このあたりも GUI ベースで確認できるのは便利ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/71f31f8c-53f3-fc5c-cadf-cce0e9f1f76a.png)
mhc-frount の外部 IP にアクセスすることで実際に動いているアプリケーションにアクセスすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/fc1497b9-566c-1d19-b8e0-ab5f6c6533af.png)

また Azure CLI を使用して動いている Pods を確認することができます。
その場合はこんな感じのコマンドを使用します。

まずはアクセスするためのクレデンシャル情報をマージします。

```
kosuke@Azure:~$ az aks get-credentials --resource-group akshandsonlab --name komiyasaaks
Merged "komiyasaaks" as current context in /home/kosuke/.kube/config
```

そのあとで kubectl を使用して Pods の情報、サービスの情報を確認します。

```
kosuke@Azure:~$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
mhc-back-6fb48fb97b-5bssf    1/1     Running   0          2d17h
mhc-front-6cbfd68457-ln8t9   1/1     Running   0          2d16h
kosuke@Azure:~$ kubectl get service mhc-front --watch
NAME        TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
mhc-front   LoadBalancer   10.0.90.108   20.44.163.93   80:32479/TCP   2d17h
```

こんな感じで確認できました。変更を加えて Git Push すれば自動的にマルチコンテナアプリケーションのアプリのビルド、AKS へのデプロイができるのは非常にクールですね！
実際に日本でマイクロサービス化したアプリケーションをゴリゴリ開発している企業はまだまだ少ないですが、これから先必要になってくる技術だと思いますので、今回紹介したデモを通してマルチコンテナアプリのビルド、デプロイの自動化は体験してみるのはおすすめです！

#参考情報
(参考)Deploying a multi-container application to Azure Kubernetes Services
https://azuredevopslabs.com/labs/vstsextend/kubernetes/

(参考)Azure DevOps Demo Generator の AKS テンプレート作成リンク
https://azuredevopsdemogenerator.azurewebsites.net/environment/createproject