[k8s] pod์˜ node ๋ฐฐ์น˜

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋ฉ€ํ‹ฐ ๋…ธ๋“œ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์‹œ์Šคํ…œ์ด๋‹ค.
๋ฉ€ํ‹ฐ๋…ธ๋“œ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์•Œ๋œฐํ•˜๊ฒŒ ์ฑ„์šฐ๋Š”๊ฑด ์ข‹์€๋ฐ, ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ํ•ญ์ƒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋žœ๋ค ๋…ธ๋“œ์— ํ• ๋‹น๋˜์–ด์„œ๋Š” ๋ชฉํ‘œ๋ฅผ ์ด๋ฃฐ ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์„ ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋ถ€ํ•˜๊ฐ€ ๋งŽ์€ ์„œ๋ฒ„๋ฅผ ์ŠคํŽ™์ด ๋„‰๋„‰ํ•œ ํŠน์ • ์„œ๋ฒ„์— ๋ชฐ์•„์ค˜์•ผ ํ•œ๋‹ค๋“ ์ง€, ์•„๋‹ˆ๋ฉด ํŠน์ • IP๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ์— ์„œ๋ฒ„๋ฅผ ๋„์›Œ์•ผ๋งŒ ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค๋“ ์ง€ ํ•˜๋Š” ํ˜„์‹ค์ ์ธ ์ œํ•œ์‚ฌํ•ญ๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์—ฌ๊ธฐ์—๋Š” 2๊ฐ€์ง€ ๋ฐฉํ–ฅ์„ฑ์ด ์žˆ๋‹ค.
Pod๊ฐ€ ์ง์ ‘ ํŠน์ • ๋…ธ๋“œ์— ๋ฐฐ์น˜๋˜๋„๋ก ์œ ๋„ํ•˜๋Š” ๊ธ์ •์ ์ธ ์ ‘๊ทผ๋ฒ•์ด ์žˆ๊ณ , ๋…ธ๋“œ๊ฐ€ Pod๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š” ๋ถ€์ •์ ์ธ ์ ‘๊ทผ๋ฒ•์ด ์žˆ๋‹ค.

์ „์ž๋Š” nodeName, nodeSelector๋‚˜ affinity๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ฐฉ๋ฒ•์ด๊ณ , ํ›„์ž๋Š” Taint๋ผ๊ณ  ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ด ํฌ์ŠคํŠธ์—์„œ ์ฃผ๋กœ ๋‹ค๋ฃฐ ๊ฒƒ์€ ์ „์ž๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ์—๋Š” ๋ณ„๋„ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
https://blog.naver.com/sssang97/223645592718




nodeSelector

nodeSelector๋Š” Pod๋ฅผ ํŠน์ • Node์— ๋œจ๋„๋ก ์œ ๋„ํ•˜๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

Node๋„ ๋‹ค๋ฅธ k8s ๋ฆฌ์†Œ์Šค๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ label์ด๋ผ๊ณ  ํ•˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ฐ’๋“ค์„ ๊ฐ–๋Š”๋‹ค. ์ด๊ฑธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

๋…ธ๋“œ์— ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜๋Š”๊ฑด ์–ด๋ ต์ง€ ์•Š๋‹ค.
๊ทธ๋ƒฅ ์ด๋ ‡๊ฒŒ ์น˜๋ฉด ๋œ๋‹ค.

kubectl label nodes ๋…ธ๋“œ๋ช… ํ‚ค=๊ฐ’

๊ทธ๋ฆฌ๊ณ  Pod์— node ์„ ํƒ ์ •๋ณด๋ฅผ ๋„ฃ์œผ๋ ค๋ฉด, spec.nodeSelector์— ํ‚ค๊ฐ’์Œ์„ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

  nodeSelector:
    ํ‚ค: ๊ฐ’

๋งŒ์•ฝ ์ € ์…€๋ ‰ํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด


pod๋Š” ์Šค์ผ€์ค„๋˜์ง€ ๋ชปํ•˜๊ณ  ๋ฌดํ•œ ๋Œ€๊ธฐ์ƒํƒœ์— ๋น ์ง„๋‹ค.


์ผ์น˜ํ•˜๋Š”๋Œ€๋กœ ์ž…๋ ฅํ•œ๋‹ค๋ฉด


๊ทธ ๋…ธ๋“œ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐฐ์น˜๋  ๊ฒƒ์ด๋‹ค.




nodeName

nodeSelector๋Š” ๋ ˆ์ด๋ธ”์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋…ธ๋“œ ์„ ํƒ์ด์—ˆ๋‹ค.
๋ฐ˜๋ฉด, ์ง„์งœ ๋…ธ๋“œ ์ด๋ฆ„์„ ์ง์ ‘ ์ง€์ •ํ•ด์„œ ๋”ฑ ๊ทธ ๋…ธ๋“œ์— ๋œจ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค.

spec:
  nodeName: ๋…ธ๋“œ๋ช…

๊ทธ๋ƒฅ ์ด๋ ‡๊ฒŒ ๋…ธ๋“œ๋ช… ๋„ฃ๊ณ  ๋Œ๋ฆฌ๋ฉด

๋”ฑ ๊ทธ ๋…ธ๋“œ์— ๋ฐฐ์น˜๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด

nodeSelector์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฌดํ•œ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋น ์ง„๋‹ค.

nodeName์ด ๊ฐ„ํŽธํ•˜๊ธด ํ•˜์ง€๋งŒ, ์žฅ๊ธฐ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ์—๋Š” ์˜ ์ข‹์ง€ ์•Š์•„์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ถŒ์žฅ๋˜์ง€ ์•Š๊ณ , ์ž˜ ์‚ฌ์šฉ๋˜์ง€๋„ ์•Š๋Š”๋‹ค. ๊ทธ๋ƒฅ ์žˆ๊ธฐ๋งŒ ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.


์•„๋ฌดํŠผ nodeName์ด๋‚˜ nodeSelector ๊ธฐ๋ฐ˜์˜ ๋ฐฉ๋ฒ•์€ ์ง๊ด€์ ์ด๊ณ  ์ž˜ ๋™์ž‘ํ•˜๊ธด ํ•˜์ง€๋งŒ, ๋ณต์žกํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์ ์šฉํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ๋‹ค.
๋”ฑ ํŠน์ • ๋จธ์‹ ์— ๋ฐฐ์น˜๋˜๋Š”๊ฑธ ์›ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ทธ๋ƒฅ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠน์ • ๋จธ์‹ ์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์„ "์„ ํ˜ธ"ํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๊ฑธ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด affinity๋‹ค.




node affinity

node affinity๋Š” ๋ณต์žกํ•œ ํ˜•ํƒœ์˜ ๋…ธ๋“œ ๋ฐฐ์น˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

์ด๊ฑด nodeSelector์ฒ˜๋Ÿผ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์—๋งŒ ๋ฐฐ์น˜๋˜๋„๋ก ์—„๊ฒฉํ•œ ์ œํ•œ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋‹จ์ง€ "์„ ํ˜ธ"ํ•˜๋„๋ก ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” ์ •๋„๋กœ ๋๋‚ผ ์ˆ˜๋„ ์žˆ๋‹ค.

๋”ฑ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์—๋งŒ ๋ฐฐ์น˜๋˜๋„๋ก ํ•˜๋Š” ์˜ต์…˜์ด requiredDuringSchedulingIgnoredDuringExecution๊ณ , ์šฐ์„ ์ˆœ์œ„๋งŒ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด preferredDuringSchedulingIgnoredDuringExecution๋‹ค.

ํ•œ๋ฒˆ ์˜ˆ์ œ๋ฅผ ๊นŒ๋ณด๋ฉด์„œ ๊ธฐ๋ณธ ํ˜•ํƒœ๋ฅผ ์ดํ•ดํ•ด๋ณด์ž.

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/os
            operator: In
            values:
            - linux
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: label-1
            operator: In
            values:
            - key-1
      - weight: 50
        preference:
          matchExpressions:
          - key: label-2
            operator: In
            values:
            - key-2

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ requiredDuringSchedulingIgnoredDuringExecution๋Š” must ์กฐ๊ฑด์ด๋‹ค.

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/os
            operator: In
            values:
            - linux

์ด๊ฑด kubernetes.io/os=linux๋ผ๋Š” ๋ ˆ์ด๋ธ”์ด ํฌํ•จ๋œ node์—๋งŒ pod๊ฐ€ ๋ฐฐ์น˜๋  ๊ฒƒ์ž„์„ ๋œปํ•˜๋Š” ๊ตฌ๋ฌธ์ด๋‹ค.
์ด ๋ถ€๋ถ„์€ ๊ฝค ๋‹จ์ˆœ๋ช…๋ฃŒํ•˜๋‹ค.

preferredDuringSchedulingIgnoredDuringExecution๋Š” ๋‹จ์ˆœํžˆ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.
์ด ์šฐ์„ ์ˆœ์œ„์™€ ๋งž์ง€ ์•Š๋”๋ผ๋„ ์ ์ ˆํ•œ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด๊ฑฐ๋‚˜ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ฐฐ์น˜ํ•œ๋‹ค.

      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: label-1
            operator: In
            values:
            - key-1
      - weight: 50
        preference:
          matchExpressions:
          - key: label-2
            operator: In
            values:
            - key-2

๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ด๊ฑด ๊ฐ€์ค‘์น˜(weight) ๊ธฐ๋ฐ˜์œผ๋กœ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, label-1:key-1 ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๋…ธ๋“œ์— 1์ ์„ ์ฃผ๊ณ , label-2:key-2 ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๋…ธ๋“œ์— 50์ ์„ ์ค˜์„œ ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.




pod affinity & pod anti affinity

์ด๊ฑด ์ข€ ๋” ๋ณต์žกํ•œ ์‚ฌ์šฉ์‚ฌ๋ก€๋ฅผ ์ƒ์ •ํ•œ ๋…ธ๋“œ ์„ ํƒ ๋งค์ปค๋‹ˆ์ฆ˜์ด๋‹ค.
node affinity์˜ ๊ฒฝ์šฐ์—๋Š” ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋…ธ๋“œ์˜ ๋ ˆ์ด๋ธ”์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ–ˆ๋‹ค. ๋…ธ๋“œ๊ฐ€ pod๊ฐ€ ๋ช‡๊ฐœ ๋– ์žˆ๋“ , ๋ฆฌ์†Œ์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋‚จ์•˜๋“  ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ pod๊ฐ€ ์ด๋ฏธ ๋– ์žˆ๋Š” ๊ฒƒ๊นŒ์ง€ ๊ณ ๋ คํ•ด์„œ ๋…ธ๋“œ ๋ฐฐ์น˜๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด ํŠน์ • Pod๊ฐ€ ๋– ์žˆ๋Š” ๋…ธ๋“œ๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•  ํ…Œ๋‹ˆ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋ฐฐ์น˜ํ•˜๊ฒŒ๋” ํ•˜๊ณ  ์‹ถ๋‹ค๋“ ์ง€ ํ•˜๋Š” ๊ทธ๋Ÿฐ ์ƒํ™ฉ ๋ง์ด๋‹ค.
pod affinity๋Š” ์ด๋Ÿฐ ์ƒํ™ฉ์— ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

pod affinity๋„ node affinity์™€ ๋น„์Šทํ•˜๊ฒŒ 2๊ฐ€์ง€ ์˜ต์…˜์„ ๊ฐ€์ง„๋‹ค.

ํ•œ๋ฒˆ ์‹ค์ œ์ ์ธ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด์„œ ๋ณด์—ฌ๋ณด๊ฒ ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: topology.kubernetes.io/zone

์ด๊ฑด security:S1๋ผ๋Š” pod๊ฐ€ ์žˆ๋Š” ์˜์—ญ(zone)์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด zone์˜ ๊ธฐ์ค€์ด topologyKey๋กœ ์„ค์ •ํ•œ "topology.kubernetes.io/zone"๋‹ค. ์ด๊ฑด ๋…ธ๋“œ๋ฅผ ๋ฌถ๋Š” ๊ธฐ์ค€์ด ๋˜๋Š” ๋ ˆ์ด๋ธ” ๊ฐ’์ด๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ๋‹ค์‹œ ๋งํ•ด ์ด ๊ฒฝ์šฐ์—๋Š” security:S1๋ผ๋Š” pod๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์™€ ๋™์ผํ•œ "topology.kubernetes.io/zone" ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋ง ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

"topology.kubernetes.io/zone"๋Š” ํด๋ผ์šฐ๋“œ ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์—์„œ ์ž๋™์œผ๋กœ ์ฃผ์ž…๋˜๋Š” ๋ ˆ์ด๋ธ” ๊ฐ’์ด๊ณ , ์˜จํ”„๋ ˆ๋ฏธ์Šค์—์„œ๋Š” ์ง์ ‘ ์ ์ ˆํžˆ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
๊ด€๋ก€์ ์œผ๋กœ kubernetes.io/hostname๋„ ๋งŽ์ด ์“ด๋‹ค. ์ด๊ฑด ๋ณดํ†ต ๋…ธ๋“œ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ง“๋Š”๋‹ค.

podAntiAffinity๋„ ์›๋ฆฌ๊ฐ€ ๊ฑฐ์˜ ๊ฐ™๋‹ค. ์ •ํ™•ํžˆ ๊ทธ ๋ฐ˜๋Œ€๋กœ, ๊ทธ zone์— ์†ํ•˜๋Š” ๊ฒƒ๋“ค์— pod๊ฐ€ ๋ฐฐ์น˜๋˜์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ผ ๋ฟ์ด๋‹ค.

spec:
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security
              operator: In
              values:
              - S2
          topologyKey: topology.kubernetes.io/zone



pod anti affinity ์‘์šฉ - ๋…ธ๋“œ ๋ถ„์‚ฐ

๊ทธ๋Ÿผ ์ € ๋ณต์žกํ•œ ๋†ˆ๋“ค์„ ์–ด๋–ป๊ฒŒ ์จ๋จน์–ด์•ผ ํ• ๊นŒ?

anti affinity๋Š” ํŠน์ • ์กฐ๊ฑด์˜ pod๊ฐ€ ๋– ์žˆ๋Š” ์ƒํ™ฉ์„ ๊ธฐํ”ผํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ์ด ํŠน์„ฑ์„ ์‘์šฉํ•˜๋ฉด deployment ๊ฐ™์€ ๊ทธ๋ฃน ๋‹จ์œ„์˜ pod๊ฐ€ ๋…ธ๋“œ๋ณ„๋กœ ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ๋˜๋Š” ๊ฒƒ์„ ๊ฐ•์š”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์€ redis๋กœ ๋…ธ๋“œ ๋ถ„์‚ฐ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋‹ค.
redis ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์‹ค์ œ๋กœ ๊ฐ ๋…ธ๋“œ์˜ ์›น ์„œ๋ฒ„๋“ค์ด ์ตœ์ ์˜ ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ๋…ธ๋“œ๋ณ„๋กœ ๋ฐฐ์น˜๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-cache
spec:
  selector:
    matchLabels:
      app: store
  replicas: 3
  template:
    metadata:
      labels:
        app: store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: redis-server
        image: redis:3.2-alpine

๋ณด๋‹ค์‹œํ”ผ ์ด deploement๋Š” ๊ฐ๊ฐ์˜ pod์— app: store ๋ ˆ์ด๋ธ”๊ฐ’์„ ๊ฐ–๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ podAntiAffinity๋กœ๋Š” app: store๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋ฌด์‹œํ•˜๋„๋ก ํ–ˆ์œผ๋‹ˆ, ์ด 3๊ฐœ์˜ ๋…ธ๋“œ์— ๋žœ๋ค์œผ๋กœ ๋ถ„์‚ฐ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด์ฒ˜๋Ÿผ ๋ณต์žกํ•  ์ˆ˜๋„ ์žˆ๋Š” ํ”„๋กœ๋น„์ €๋‹ ๊ตฌ์„ฑ์„ ๋น„๊ต์  ๊ฐ„ํŽธํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.




pod affinity ์‘์šฉ - ๋ถ„์‚ฐ ๋…ธ๋“œ ๋”ฐ๋ผ๊ฐ€๊ธฐ

๋ฐฉ๊ธˆ ์œ„์—์„œ๋Š” redis๋ฅผ 3๊ฐœ์˜ ๋…ธ๋“œ์— ๋ถ„์‚ฐํ•ด์„œ ๋ฐฐ์น˜ํ•˜๋„๋ก ๊ตฌ์„ฑ์„ ํ–ˆ์—ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ redis๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์›น์„œ๋ฒ„๋“ค์„ ์ตœ์ ์˜ ๊ฒฝ๋กœ๋กœ ๋ถ™๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์ด๊ฒƒ๋„ pod affinity๋ฅผ ์‘์šฉํ•˜๋ฉด ๋น„๊ต์  ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  selector:
    matchLabels:
      app: web-store
  replicas: 3
  template:
    metadata:
      labels:
        app: web-store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web-store
            topologyKey: "kubernetes.io/hostname"
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: web-app
        image: .../web-server-image

์ข€ ๊ธธ๊ณ  ๋ณต์žกํ•ด๋ณด์ผ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ๊ตฌ์กฐ๋ฅผ ์•ˆ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€๋Š” ์•Š๋‹ค.

podAntiAffinity์—๋Š” ๋ฐฉ๊ธˆ redis ๊ตฌ์„ฑ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋…ธ๋“œ๋ณ„๋กœ ํ•˜๋‚˜์”ฉ๋งŒ ๋œจ๋„๋ก ๋ถ„์‚ฐ ๊ตฌ์„ฑ์ด ๋˜์–ด์žˆ๋‹ค. ์ด๊ฑด ์–ด๋ ค์šธ ๊ฑด ์—†๋‹ค.

๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋” ๋‚˜์•„๊ฐ€์„œ, ๊ฐ redis๊ฐ€ ์œ„์น˜ํ•œ ๊ณณ์— ์›น์„œ๋ฒ„๋ฅผ ์œ„์น˜์‹œ์ผœ์„œ ์ตœ์†Œํ•œ์˜ ๋ ˆ์ดํ„ด์‹œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค.
๊ทธ๋ž˜์„œ podAffinity๋ฅผ ํ†ตํ•ด์„œ app: store๊ฐ€ ์žˆ๋Š”, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ redis๊ฐ€ ์žˆ๋Š” node์—๋งŒ ๋ฐฐ์น˜ํ•˜๋„๋ก ํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•  ๊ฒฝ์šฐ redis๊ณผ ์›น์„œ๋ฒ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒฉํŠธํ•˜๊ฒŒ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.




์ฐธ์กฐ
https://kubernetes.io/ko/docs/tasks/configure-pod-container/assign-pods-nodes/
https://kubernetes.io/ko/docs/concepts/scheduling-eviction/assign-pod-node/#%EC%96%B4%ED%94%BC%EB%8B%88%ED%8B%B0-affinity-%EC%99%80-%EC%95%88%ED%8B%B0-%EC%96%B4%ED%94%BC%EB%8B%88%ED%8B%B0-anti-affinity
https://kubernetes.io/ko/docs/concepts/scheduling-eviction/pod-priority-preemption/
https://stackoverflow.com/questions/72240224/what-is-topologykey-in-pod-affinity