KubernetesのDeploymentにおける replicas と revisionHistoryLimit は、アプリケーションの可用性とデプロイメントの管理に重要な役割を果たす設定項目です。
1. replicas (レプリカ数)
-
意味: Deploymentによって管理されるPodのDesired State(目標とする状態)におけるレプリカ(複製)の数を指定します。Kubernetesは、常に指定された数のPodが実行されるように維持しようとします。
-
使い方:
- replicas の値を増やすと、アプリケーションの可用性と負荷分散能力が向上します。
- replicas の値を減らすと、リソース消費量を削減できます。
- Kubernetesは、Podの障害やノードの障害が発生した場合、自動的に新しいPodを作成し、指定された replicas の数を維持します。
-
設定例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3 # 常に3つのPodが実行されるように維持
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:latest
この例では、replicas: 3 と指定されているため、Kubernetesは常に3つの my-app Podが実行されるように維持します。
2. revisionHistoryLimit (リビジョン履歴制限)
-
意味: Deploymentのロールアウト履歴を保持するリビジョンの最大数を指定します。ロールアウト履歴には、Deploymentの過去の設定(Podテンプレート、replicas の数など)が記録されています。
-
使い方:
- revisionHistoryLimit を設定することで、ロールバック時に利用可能なリビジョンの数を制限できます。
- revisionHistoryLimit を大きくすると、より多くのロールバックオプションが利用可能になりますが、etcdに保存されるデータ量が増加します。
- revisionHistoryLimit を小さくすると、etcdに保存されるデータ量を削減できますが、ロールバックオプションが制限されます。
- revisionHistoryLimit: 0 を設定すると、ロールアウト履歴は保持されません。
-
設定例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
revisionHistoryLimit: 3 # 最大3つのリビジョン履歴を保持
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:latest
この例では、revisionHistoryLimit: 3 と指定されているため、Deploymentは最大3つのリビジョン履歴を保持します。
revisionHistoryLimit の重要性:
- ロールバック: 問題が発生した場合、以前の安定したバージョンにロールバックするために、ロールアウト履歴は非常に重要です。
- 監査: ロールアウト履歴は、Deploymentの変更履歴を追跡し、監査を行うために役立ちます。
- リソース管理: ロールアウト履歴はetcdに保存されるため、revisionHistoryLimit を適切に設定することで、etcdのリソース消費量を管理できます。
推奨される設定
- replicas: アプリケーションの可用性と負荷分散要件に基づいて適切な値を設定します。
- revisionHistoryLimit: ロールバックの必要性とetcdのリソース消費量のバランスを考慮して適切な値を設定します。一般的には、3〜5程度が推奨されます。
Deploymentの履歴の確認
kubectl rollout history deployment/my-app
特定のRevisionへのロールバック
kubectl rollout undo deployment/my-app --to-revision=2