前回の記事では、Deployment の基本を見てきました。今回は、コンテナーアプリケーションをバージョンアップしながらデプロイしていく仕組みを試してみたいと思います。ここでは、この記事の AKS シリーズの初期に投稿した、サンプル ACR を使用します。二つの ACR が必要なので、もしまだデプロイできていない場合は、下記の記事を参考にしてデプロイしてください。
Azure Kubernetes Services 環境を構築する
https://qiita.com/komiyasa/items/3c1cd47dd0d53e5253ef
ロールアウト
ロールアウトとは、アプリケーションをクラスター内にデプロイして、サービスを稼働させることです。以下がロールアウトのサンプルマニフェストファイルになります。作成したら、kubectl apply -f
コマンドを使用してデプロイを実施してください。
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 アドレスにブラウザからアクセスすると無事にアプリケーションがデプロイされているのが分かります。
バージョン管理
先ほどデプロイしたアプリケーションを 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 となっていることが分かります。これはローリングアップデートをするたびに変わっていきます。先ほど作成したマニフェストをファイルを以下の様に編集してみましょう。
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