AKS アプリケーションのロールアウトを実行する

前回の記事では、Deployment の基本を見てきました。今回は、コンテナーアプリケーションをバージョンアップしながらデプロイしていく仕組みを試してみたいと思います。ここでは、この記事の AKS シリーズの初期に投稿した、サンプル ACR を使用します。二つの ACR が必要なので、もしまだデプロイできていない場合は、下記の記事を参考にしてデプロイしてください。

Azure Kubernetes Services 環境を構築する
https://qiita.com/komiyasa/items/3c1cd47dd0d53e5253ef

#ロールアウト
ロールアウトとは、アプリケーションをクラスター内にデプロイして、サービスを稼働させることです。以下がロールアウトのサンプルマニフェストファイルになります。作成したら、`kubectl apply -f` コマンドを使用してデプロイを実施してください。

```rolloutsample.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rollout-deployment

spec:
  replicas: 10
  selector:
    matchLabels:
      app: photo-view

  template:
    metadata:
      labels:
        app: photo-view

    spec:
      containers:
      - image: XXXXXXXXXXXX.azurecr.io/photo-view:v1.0
        name: photoview-container
        ports:
        - containerPort: 80
---

apiVersion: v1
kind: Service
metadata:
  name: rollout

spec:
  type: LoadBalancer
  ports:   # ポート番号
    - port: 80
      targetPort: 80
      protocol: TCP
  
  selector:
    app: photo-view
```

これでロールアウトが完了しました。次に`kubectl rollout status` コマンドを実行します。

```
$ kubectl rollout status deploy rollout-deployment
deployment "rollout-deployment" successfully rolled out
```

ロールアウトは少し時間かかかるため、しばらく待ち、`kubectl get pod` コマンドを実行します。定義した 10 個の Pod が動いています。

```
$ kubectl get pod
NAME                                  READY   STATUS    RESTARTS   AGE
rollout-deployment-66d4b8d755-58ffp   1/1     Running   0          2m9s
rollout-deployment-66d4b8d755-75dwv   1/1     Running   0          2m9s
rollout-deployment-66d4b8d755-84jxg   1/1     Running   0          2m9s
rollout-deployment-66d4b8d755-fm7fl   1/1     Running   0          2m9s
rollout-deployment-66d4b8d755-jjspv   1/1     Running   0          2m9s
rollout-deployment-66d4b8d755-kmhqq   1/1     Running   0          2m9s
rollout-deployment-66d4b8d755-kxvqq   1/1     Running   0          2m9s
rollout-deployment-66d4b8d755-lkhzh   1/1     Running   0          2m9s
rollout-deployment-66d4b8d755-mzdls   1/1     Running   0          2m9s
rollout-deployment-66d4b8d755-zvchc   1/1     Running   0          2m9s
```

pod を確認するとマニフェストファイルで定義した Pod がデプロイされていることが分かります。また、`kubectl get service` コマンドでサービスの状況を確認することで、外部からアクセスするための IP アドレスを確認することが出来ます。

```
$ kubectl get service
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
kubernetes   ClusterIP      10.0.0.1       <none>           443/TCP        6d3h
rollout      LoadBalancer   10.0.230.209   52.155.118.225   80:31834/TCP   3m13s
```

デプロイされた IP アドレスにブラウザからアクセスすると無事にアプリケーションがデプロイされているのが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/115a25f0-2a8d-828c-6613-dfb20cf3c8da.png)



#バージョン管理
先ほどデプロイしたアプリケーションを `kubectl describe deploy rollout-deployment` で確認してみます。

```
$ kubectl describe deploy rollout-deployment
Name:                   rollout-deployment
Namespace:              default
CreationTimestamp:      Mon, 25 Nov 2019 14:28:41 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
                        kubectl.kubernetes.io/last-applied-configuration:
                        
~省略~
```

これを確認すると、リビジョン番号が 1 となっていることが分かります。これはローリングアップデートをするたびに変わっていきます。先ほど作成したマニフェストをファイルを以下の様に編集してみましょう。

```rolloutsample.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rollout-deployment

spec:
  replicas: 10
  selector:
    matchLabels:
      app: photo-view

  template:
    metadata:
      labels:
        app: photo-view

    spec:
      containers:
      - image: XXXXXXXXXXXX.azurecr.io/photo-view:v2.0 # ここを 2.0 に変更しています！
        name: photoview-container
        ports:
        - containerPort: 80
---

apiVersion: v1
kind: Service
metadata:
  name: rollout

spec:
  type: LoadBalancer
  ports:   # ポート番号
    - port: 80
      targetPort: 80
      protocol: TCP
  
  selector:
    app: photo-view
```

先ほどと同様に `kubectl apply -f` を実行しデプロイします。ここまで完了したら `describe` コマンドを実行し、詳細を確認しましょう。

```
$ kubectl describe deploy rollout-deployment
Name:                   rollout-deployment
Namespace:              default
CreationTimestamp:      Mon, 25 Nov 2019 14:28:41 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 2
                        kubectl.kubernetes.io/last-applied-configuration:
```

リビジョンがアップデートされているのが分かります。
またイベントを見てみましょう。

```
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  7m8s  deployment-controller  Scaled up replica set rollout-deployment-66d4b8d755 to 10
  Normal  ScalingReplicaSet  43s   deployment-controller  Scaled up replica set rollout-deployment-8848688b8 to 3
  Normal  ScalingReplicaSet  43s   deployment-controller  Scaled down replica set rollout-deployment-66d4b8d755 to 8
  Normal  ScalingReplicaSet  43s   deployment-controller  Scaled up replica set rollout-deployment-8848688b8 to 5
```

これを確認すると、以下が実行されていることが分かります。
- 新しいレプリカセットの作成
- 新しいレプリカセットの Pod を増やす
- 古いレプリカセットの Pod を減らす
- 古いレプリカセットの Pod がゼロになるまで、上ふたつを繰り返す

これはサービスが停止しないようにコンテナー内で自動的に実行されています。素晴らしいですね！！

次回の記事では、デプロイするアプリケーションの設定情報を詳しく見ていきたいと思います。

#参考
Updating a Deployment
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#updating-a-deployment