説明
Deployment の複数の Pod が同じノードに配置されると、一つのノード障害がサービスの可用性に大きく影響する場合があります。レプリカ数を増やすだけでは高可用性は確保できません。
Pod anti-affinity や topology spread constraints で分散要件を指定できます。anti-affinity を明記していないことが、必ず同じノードに集中していることを意味するわけではありません。
想定される影響
- 一つのノード障害で複数のレプリカが同時に影響を受ける場合があります。
- 厳しすぎる配置条件では、適切なノードが足りないと Pod を起動できません。
対処方法
- 可用性の要件に合わせて affinity.podAntiAffinity または topology spread constraints を構成し、selector とノードの topology ラベルを確認してください。
- preferred ルールは分散を優先しますが、保証はしません。required ルールの配置制約と必要な容量を検討し、実際の Pod 配置を確認してください。
例
過去のイメージバージョンは、デプロイ前に保守されている検証済みバージョンへ置き換えてください。変更後の設定には、hostname が異なる適切なノードが少なくとも 3 台必要です。
変更前
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
replicas: 3
selector:
matchLabels:
app: web-store
template:
metadata:
labels:
app: web-store
spec:
containers:
- name: web-app
image: nginx:1.16-alpine
明示的な分散ルールがないため、複数のレプリカが同じノードに配置される場合があります。
変更後
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
replicas: 3
selector:
matchLabels:
app: web-store
template:
metadata:
labels:
app: web-store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: web-store
topologyKey: kubernetes.io/hostname
containers:
- name: web-app
image: nginx:1.16-alpine
同じ名前空間の app=web-store の Pod を、同じ hostname にスケジューリングしないよう制限します。実行中の Pod を自動的に再配置するルールではありません。