Kubernetes Deployment の Pod 分散配置の確認

必要な障害ドメインにレプリカを分散し、実際の配置を確認してください。

説明

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 を自動的に再配置するルールではありません。

参考資料