Sobes.tech
Middle

Jak rovnoměrně rozdělit pody v dostupnostních zónách?

sobes.tech AI

Odpověď od AI

Použijte topologySpreadConstraints v manifestu podu nebo nasazení.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 9
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: my-app:latest
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/zone # Klíč, který určuje rozložení v zónách
        whenUnsatisfiable: DoNotSchedule # Pokud rozložení není možné, pod nebude naplánován
        labelSelector:
          matchLabels:
            app: my-app # Omezí se na podu s tímto štítkem

maxSkew určuje maximální počet podů, které mohou překročit průměr v jakékoli doméně topologie (zóně). V tomto případě maxSkew: 1 znamená, že rozdíl v počtu podů mezi jakoukoli dvojicí zón nebude přesahovat 1.

topologyKey: topology.kubernetes.io/zone označuje, že rozložení by mělo být založeno na štítcích zón dostupnosti uzlů.

whenUnsatisfiable: DoNotSchedule znamená, že pokud plánovač nemůže splnit omezení topologySpreadConstraints, pod nebude naplánován. Alternativně lze použít ScheduleAnyway, který se pokusí naplánovat pod, ale může porušit omezení.

labelSelector definuje sadu podů, na které se toto omezení vztahuje.

Pro rovnoměrné rozložení podů do tří zón (například us-east-1a, us-east-1b, us-east-1c) s 9 replikami, každá zóna obdrží 3 pod.

Takové rozložení zvyšuje odolnost aplikace, protože selhání jedné zóny nezpůsobí úplnou nedostupnost služby.