๋์ ์ญํ ๋น๊ต
๊ธฐ๋ฅ | ๋ชฉ์ | ์ฌ์ฉ ์ | ์ ์ด ๋ฐฉ์ |
Pod Anti-Affinity | ํน์ ํ๋์ ๊ฐ์ ๋
ธ๋์ ๋ฐฐ์น๋์ง ์๋๋ก ์ ํ | ๊ฐ์ ์ฑ์ ํ๋๋ฅผ ๋
ธ๋์ 1๊ฐ์ฉ๋ง ๋ฐฐ์น | ์ ํ์ (์ ํ ์์ฃผ) |
Topology Spread Constraints | ํ๋๋ค์ ์ง์ ๋ ๋ฒ์(๋
ธ๋, ์กด ๋ฑ)์ ๊ท ๋ฑํ๊ฒ ๋ถ์ฐ | ํ๋๋ค์ ๊ฐ๋ฅํ ํ ๋ชจ๋ ๋
ธ๋/์กด์ ํผ๋จ๋ฆฌ๊ธฐ | ๋ถ์ฐ ์ค์ฌ (์ ์ฑ
๊ธฐ๋ฐ) |
์ ํจ๊ป ์ฐ๋๊ฐ?
์์: ๊ณ ๊ฐ์ฉ์ฑ์ด ์ค์ํ ์น ์ ํ๋ฆฌ์ผ์ด์
๋ชฉํ:
โข
๋์ผํ ์ฑ์ ํ๋๊ฐ ํ ๋
ธ๋/์กด์ ๋ชฐ๋ฆฌ์ง ์๊ฒ
โข
์ฅ์ ๊ฐ ๋ฐ์ํด๋ ๋ค๋ฅธ ๋
ธ๋/์กด์์ ์๋น์ค ์ ์ง ๊ฐ๋ฅ
์ฌ์ฉํ๋ ๋ฐฉ์
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: myapp
topologyKey: "kubernetes.io/hostname" # ๋
ธ๋ ๋จ์ ๋ถ์ฐ
topologySpreadConstraints:
- maxSkew: 1
topologyKey: "topology.kubernetes.io/zone"
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: myapp
YAML
๋ณต์ฌ
๊ฒฐ๊ณผ
โข
Pod Anti-Affinity: ๋์ผ ๋
ธ๋์๋ ๊ฐ์ ์ฑ ํ๋๋ฅผ ๋์ง ์์ โ ๋
ธ๋ ๋จ์ ๊ฒฉ๋ฆฌ
โข
Topology Spread: ์ ์ฒด ๊ฐ์ฉ ์์ญ(zone) ๊ฐ์ ํ๋๋ฅผ ๊ณ ๋ฅด๊ฒ ๋ถ์ฐ โ ์ฅ์ ๋๋ฉ์ธ ๊ฐ ๊ฒฉ๋ฆฌ
์ฃผ์ํ ์
โข
๋ ๋ค ๋๋ฌด ๊ฐํ๊ฒ ์ค์ ํ๋ฉด โ ํ๋๊ฐ Pending ์ํ์ ๋น ์ง ์ ์์
(ํนํ ํด๋ฌ์คํฐ ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ๊ฑฐ๋ ๋
ธ๋ ์๊ฐ ์ ์ ๊ฒฝ์ฐ)
โข
๊ทธ๋ด ๋ preferred / ScheduleAnyway๋ก ์ํ ํ์
์ค์ ์ ์ฉ ์ ๊ถ์ฅ ์ ๋ต
์ ๋ต | ์ค์ |
๋
ธ๋ ๊ฐ ๋ถ์ฐ | Pod Anti-Affinity + topologyKey: kubernetes.io/hostname |
Zone ๊ฐ ๋ถ์ฐ | TopologySpreadConstraints + topologyKey: topology.kubernetes.io/zone |
์ํ๋ ์กฐ๊ฑด | TopologySpreadConstraints with ScheduleAnyway, AntiAffinity with preferred |
๊ฒฐ๋ก
๋์ ๊ฐ์ ๋ชฉ์ (๋ถ์ฐ ๋ฐฐ์น)์ ์ถ๊ตฌํ์ง๋ง, ์ญํ ๊ณผ ์ ์ด ๋ฐฉ์์ด ๋ฌ๋ผ ๋ณด์์ ์ผ๋ก ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
ํนํ ๋๊ท๋ชจ ์๋น์ค, StatefulSet, ReplicaSet ๋ฑ์์ ๋ง์ด ํ์ฉ๋ฉ๋๋ค.