AKSにチュートリアル通りにデプロイしてみる～初心者がKubernetesでアプリをデプロイするまで3～

#はじめに
[前回](https://qiita.com/eisai-bs/items/59acc73592ee9d08a7a3)
ここでは、Microsoftが紹介しているチュートリアルに沿って、アプリをデプロイしてみます。
チュートリアルでは十分に説明されていない点を補足していきます。

[アプリケーションのデプロイ、管理、更新（チュートリアル）](https://docs.microsoft.com/ja-jp/azure/aks/)

###必須SW要件
- Azure CLI
- kubectl
- docker-compose

筆者は[その１](#)で作成したAzure VM上で実行しています。
AKSは、[前回](https://qiita.com/eisai-bs/items/59acc73592ee9d08a7a3)で作成し、AKSへの接続が完了しているものとします。

##全体の流れ
自作のWebアプリをAKSにデプロイする際は、以下のような流れになります。

- Dockerを使って、コンテナイメージをビルド
- コンテナイメージをACRにPush
- KubernetesのマニフェストファイルにACRにPushしたイメージを指定
- 上記のマニュアルを使って、kubectlでAKSにデプロイ

ACRは、[その1](https://qiita.com/eisai-bs/items/bdeeb26be766ffbdee24)でも述べましたが、コンテナイメージを保持するプライベートなレジストリとなります。逆にDocker Hubはパブリックレジストリで、指定すれば誰でもアクセスレジストリになります。
ACRを使わず、Docker Hubを使ってデプロイもできますが、ここではACRを使うことにします。

##コンテナイメージをビルドする

まずは、チュートリアルに沿って、コードを拾って、ビルドします。

```sh
##コードの取得
git clone https://github.com/Azure-Samples/azure-voting-app-redis.git
# docker-compose.yamlがあるディレクトリまで移動
cd azure-voting-app-redis
# docker-composeコマンドでビルドを実行
# -dはデーモン起動オプション、これを付けないと、コンソールが戻ってきません
docker-compose up -d
```

ローカルの開発用PCでビルドする際は、Docker Desktopの起動を忘れないようにしましょう。
さもなければ、以下のようなエラーが出てきます。一見、原因が分からないので、どうしたものかと考え込んでしまいます。

```sh
  ...
  File "site-packages\docker\api\client.py", line 188, in __init__
  File "site-packages\docker\api\client.py", line 213, in _retrieve_server_version
docker.errors.DockerException: Error while fetching server API version: (2, 'CreateFile', '指定されたファイルが見つかりません。')
[5240] Failed to execute script docker-compose
```

ビルドに成功したら、http://localhost:8080 にアクセスして、アプリが起動していることを確認しましょう。

##イメージをプッシュする
[その１](#)でACRへのログインが終了しているものとします。

ACRへDockerで作成したコンテナイメージをPushするには、作成したDockerのコンテナイメージにACRの名称付きでタグ付けして、Push先を指定する必要があります。

作成したDockerコンテナイメージを取得

```sh
docker images
```

```sh:出力結果
REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE
azure-vote-front                                    latest              64852c9a2e52        4 months ago        944MB
tiangolo/uwsgi-nginx-flask                          python3.6           a16ce562e863        5 months ago        944MB
redis                                               latest              1319b1eaa0b7        5 months ago        104MB
```
- azure-vote-frontは、アプリ
- tiangolo/uwsgi-nginx-flaskは、azure-vote-frontを作成するにあたって追加したベースOS環境
- redisは、DB(SQLではない)

ACRにPushが必要なのは、アプリ部分だけなので、azure-vote-frontにタグ付けし、イメージをACRにPushします。

```sh
# その１の例では<acrLoginServer>には、myakscrabcdefg.azurecr.ioを指定します
docker tag azure-vote-front:v1 <acrLoginServer>/azure-vote-front:v1
docker push <acrLoginServer>/azure-vote-front:v1
```

正常にACRにPushされたかどうかを確認するには、以下のコマンドを使用します。

```sh
# <acrName>は、.azurecr.ioを省略したものになります(付けていてもwarningが出るだけで正常に出力されます)
az acr repository list --name <acrName> --output table
```

##AKSへデプロイする

[その１](https://qiita.com/eisai-bs/items/bdeeb26be766ffbdee24)でAKSは準備しているものとします。
まずは、kubernetesのマニフェストファイルを編集します。
azure-vote-all-in-one-redis.yaml ファイルを適当なテキストエディタで開きます。

```yaml:azure-vote-all-in-one-redis.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: azure-vote-front
spec:
  replicas: 1
  selector:
    matchLabels:
      app: azure-vote-front
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  minReadySeconds: 5 
  template:
    metadata:
      labels:
        app: azure-vote-front
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
      - name: azure-vote-front
# 以下を編集します、その1の例では、<acrName>は myakscrabcdefg
#        image: microsoft/azure-vote-front:v1
        image: <acrName>.azurecr.io/azure-vote-front:v1
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 250m
          limits:
            cpu: 500m
        env:
        - name: REDIS
          value: "azure-vote-back"
```

以下のコマンドで、AKSにデプロイします。

```sh
kubectl apply -f azure-vote-all-in-one-redis.yaml
```

デプロイに成功すると、IPアドレスが払い出されて、無事にアクセスできるようになります。
以下でデプロイ状況を監視できます。

```sh
kubectl get service azure-vote-front --watch
```


```sh:出力結果
NAME               TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
azure-vote-front   LoadBalancer   10.0.34.242   52.179.23.131   80:30676/TCP   67s
```
上記のようにIPアドレスが払い出され、アクセス可能になります。
この例では、http://52.179.23.131 にアクセスして、アプリが表示されればOKです。

(続く)