Affinity and Anti-affinity
nodeSelector
๋ ํน์ ๋ ์ด๋ธ์ด ์๋ ๋
ธ๋๋ก ํ๋๋ฅผ ์ ํํ๋ ๋งค์ฐ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. Affinity / anti-affinity ๊ธฐ๋ฅ์ ํํํ ์ ์๋ ์ ์ฝ ์ ํ์ ํฌ๊ฒ ํ์ฅํฉ๋๋ค.
์ฃผ์ ๊ฐ์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ธ์ด๊ฐ ๋ ํํ๋ ฅ์ด ๋ฐ์ด๋ฉ๋๋ค (๋จ์ โAND of ์ ํํ ์ผ์นโ๊ฐ ์๋)
๊ท์น์ด ์๊ฒฉํ ์๊ตฌ ์ฌํญ์ด ์๋๋ผ โ์ํํธโ/ โ๊ธฐ๋ณธ ์ค์ โ์์ ๋ํ๋ผ ์ ์์ผ๋ฏ๋ก ์ค์ผ์ค๋ฌ๊ฐ ์ด๋ฅผ ์ถฉ์กฑ ํ ์ ์๋ ๊ฒฝ์ฐ ํ๋๋ ๊ณ์ ์์ฝ ๋ฉ๋๋ค.
๋ ธ๋ ์์ฒด์ ๋ ์ด๋ธ์ด ์๋ ๋ ธ๋ (๋๋ ๋ค๋ฅธ ํ ํด๋ก์ง ๋๋ฉ์ธ)์์ ์คํ์ค์ธ ๋ค๋ฅธ ํ๋์ ๋ ์ด๋ธ์ ๋ํด ์ ํ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ๋๊ฐ ํจ๊ป ๋ฐฐ์น ๋ ์ ์๊ณ ๋ฐฐ์น ๋ ์ ์๋ ๊ท์น์ด ํ์ฉ๋ฉ๋๋ค.
Affinity ๊ธฐ๋ฅ์ โ๋ ธ๋ affinityโ ๋ฐ โํ๋ ๊ฐ affinity / anti-affinityโ์ ๋ ๊ฐ์ง affinity ์ ํ์ผ๋ก ๊ตฌ์ฑ ๋ฉ๋๋ค. ๋ ธ๋ affinity๋ ๊ธฐ์กด์ โnodeSelectorโ์ ๋น์ทํ์ง๋ง (์์ ๋์ด๋ ์ฒ์ ๋ ๊ฐ์ง ์ด์ ์ด ์์) ์์ ๋์ด๋ ์ธ ๋ฒ์งธ ํญ๋ชฉ์ ์ค๋ช ๋ฐ๋ก ํ๋ ๊ฐ Affinity / anti-affinity๋ ๋ ธ๋ ๋ ์ด๋ธ์ด ์๋ ํ๋ ๋ ์ด๋ธ์ ๋ํด ์ ํ ํฉ๋๋ค.
1. Node Affinity
Node affinity๋ ๊ฐ๋ ์ ์ผ๋ก โnodeSelectorโ์ ์ ์ฌํ๋ ๋ ธ๋์ ๋ผ๋ฒจ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋๋ฅผ ์์ฝ ํ ์ ์๋ ๋ ธ๋๋ฅผ ์ ํ ํ ์ ์์ต๋๋ค.
ํ์ฌ โrequiredDuringSchedulingIgnoredDuringExecutionโ๊ณผ โpreferredDuringSchedulingIgnoredDuringExecutionโ์ด๋ผ๋ ๋ ๊ฐ์ง ์ ํ์ ๋ ธ๋ ์ ํธ๋๊ฐ ์์ต๋๋ค.
์ ์๋ ๋ ธ๋์์ ํ๋๋ฅผ ์์ฝํ๊ธฐ ์ํด ์ถฉ์กฑ ํด์ผํ๋ ๊ท์น์ ์ง์ ํ๋ค๋ ์ ์์ ๊ฐ๊ฐ โํ๋โ ๋ฐ โ์ํํธโ๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค (nodeSelector์ ๋น์ท ํ์ง๋ง ๋ณด๋ค ํํ์ ์ธ ๊ตฌ๋ฌธ ์ฌ์ฉ). ํ์๋ ์ค์ผ์ค๋ฌ๊ฐ ์ ์ฉํ๋ ค๊ณ ํ์ง๋ง ๋ณด์ฅํ์ง๋ ์๋ ๊ธฐ๋ณธ ์ค์ ์ ์ง์ ํฉ๋๋ค.
์ด๋ฆ์ โIgnoredDuringExecutionโ ๋ถ๋ถ์ nodeSelector๊ฐ ์๋ํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ ๋ ธ๋์ ๋ ์ด๋ธ์ด ๋ฐํ์์ ๋ณ๊ฒฝ๋์ด ํ๋์ affinity ๊ท์น์ด ๋ ์ด์ ์ถฉ์กฑ๋์ง ์๋ ๊ฒฝ์ฐ ํ๋๊ฐ ๋ ธ๋์์ ๊ณ์ ์คํ๋๋ค๋ ๊ฒ์ ์๋ฏธ ํฉ๋๋ค.
๋ฐ๋ผ์ โrequiredDuringSchedulingIgnoredDuringExecutionโ์ ์๋ โIntel CPU๊ฐ ์๋ ๋ ธ๋์์๋ง ํ๋ ์คํโ์ด๊ณ โpreferredDuringSchedulingIgnoredDuringExecutionโ์ ์๋ โ๊ฐ์ฉ ์์ญ XYZ์์ ์ด ํ๋ ์งํฉ์ ์คํํ๋ ค๊ณ ์๋ํ์ง๋ง ๊ฐ๋ฅํ์ง ์์ ๊ฒฝ์ฐ ์ผ๋ถ๊ฐ ๋ค๋ฅธ ๊ณณ์์ ์คํ ๋๋๋ก ํ์ฉ ํ์ญ์์ค.
Node affinity๋ PodSpec์์ ํ๋ affinity์ nodeAffinity ํ๋๋ก ์ง์ ๋ฉ๋๋ค.
๋ ธ๋ ์ ํธ๋๋ฅผ ์ฌ์ฉํ๋ ํ๋์ ์๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
๋ง์ง๋ง ์ค์ต์์์ ๋์ผํ ๋ ธ๋์ ๋ค๋ฅธ ๋ ์ด๋ธ์ ๋ง๋ญ๋๋ค.
# export the first node name as a variable
export FIRST_NODE_NAME=$(kubectl get nodes -o json | jq -r '.items[0].metadata.name')
kubectl label nodes ${FIRST_NODE_NAME} azname=az1
Pod์ affinity๋ฅผ ๋ง๋ญ๋๋ค.
cat <<EoF > ~/environment/pod-with-node-affinity.yaml
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: azname
operator: In
values:
- az1
- az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: us.gcr.io/k8s-artifacts-prod/pause:2.0
EoF
์ด node affinity ๊ท์น์ ํค๊ฐ โaznameโ์ด๊ณ ๊ฐ์ด โaz1โ๋๋ โaz2โ์ธ ๋ผ๋ฒจ์ด์๋ ๋ ธ๋์๋ง ํ๋๋ฅผ ๋ฐฐ์น ํ ์ ์์์ ๋ํ๋ ๋๋ค. ๋ํ ํด๋น ๊ธฐ์ค์ ์ถฉ์กฑํ๋ ๋ ธ๋ ์ค์์ ํค๊ฐ โanother-node-label-keyโ์ด๊ณ ๊ฐ์ด โanother-node-label-valueโ์ธ ๋ผ๋ฒจ์ด ์๋ ๋ ธ๋๋ฅผ ์ ํธํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ์ ์ฉํด ๋ด ๋๋ค
kubectl apply -f ~/environment/pod-with-node-affinity.yaml
๊ทธ๋ฆฌ๊ณ ์๋ํ๋์ง ํ์ธ ํฉ๋๋ค.
kubectl get pods -o wide

ํ๋๋ฅผ ๋ค๋ฅธ ๋ ธ๋์ ๋ฐฐ์น ํ ๊ฒ์ด๋ฏ๋ก ๋จผ์ ๋ ์ด๋ธ์ ์ ๋ฆฌํ๊ณ ํ๋๋ฅผ ์ญ์ ํ๊ฒ ์ต๋๋ค.
kubectl delete -f ~/environment/pod-with-node-affinity.yaml
kubectl label nodes ${FIRST_NODE_NAME} azname-
์ด์ ๋ ์ด๋ธ์ ๋ ๋ฒ์งธ ๋ ธ๋์ ๋ฃ์ต๋๋ค.
export SECOND_NODE_NAME=$(kubectl get nodes -o json | jq -r '.items[1].metadata.name')
kubectl label nodes ${SECOND_NODE_NAME} azname=az1
kubectl apply -f ~/environment/pod-with-node-affinity.yaml
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ์๋ ํ๋์ง ํ์ธ ํฉ๋๋ค.
kubectl get pods -o wide

์์ ์์ ์ฌ์ฉ๋๋ ์ฐ์ฐ์ In
์ ๋ณผ ์ ์์ต๋๋ค.
์๋ก์ด ๋
ธ๋ affinity ๊ตฌ๋ฌธ์ In
,NotIn
,Exists
,DoesNotExist
,Gt
,Lt
์ฐ์ฐ์๋ฅผ ์ง์ ํฉ๋๋ค. NotIn
๋ฐ DoesNotExist
๋ฅผ ์ฌ์ฉํ์ฌ ๋
ธ๋ anti-affinity ๋์์ ํ ์ ์์ต๋๋ค.
nodeSelector
์nodeAffinity
๋ฅผ ๋ชจ๋ ์ง์ ํ๋ ๊ฒฝ์ฐ ํ๋๊ฐ ํ๋ณด ๋
ธ๋์ ์์ฝ ๋๋ ค๋ฉด ๋ ๋ค ์ถฉ์กฑ ๋์ด์ผ ํฉ๋๋ค.
nodeAffinity
์ ํ๊ณผ ์ฐ๊ฒฐ๋ ์ฌ๋ฌ nodeSelectorTerms
๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐ nodeSelectorTerms
์ค ํ๋๊ฐ ์ถฉ์กฑ๋๋ฉด ๋
ธ๋์ ํ๋๋ฅผ ์์ฝ ํ ์ ์์ต๋๋ค.
nodeSelectorTerms
์ ์ฐ๊ด๋ ์ฌ๋ฌmatchExpressions
๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐ ๋ชจ๋ matchExpressions
๋ฅผ ์ถฉ์กฑ ํ ์์๋ ๊ฒฝ์ฐ์๋ง ํ๋๋ฅผ ๋
ธ๋์ ์์ฝ ํ ์ ์์ต๋๋ค.
ํ๋๊ฐ ์์ฝ ๋ ๋ ธ๋์ ๋ ์ด๋ธ์ ์ ๊ฑฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ฉด ํ๋๊ฐ ์ ๊ฑฐ๋์ง ์์ต๋๋ค. ์ฆ, ์ ํธ๋ ์ ํ์ ํ๋๋ฅผ ์์ฝ ํ ๋๋ง ์๋ํฉ๋๋ค.
preferredDuringSchedulingIgnoredDuringExecution
์ ๊ฐ์ค์น ํ๋๋ 1-100 ๋ฒ์์ ์์ต๋๋ค. ๋ชจ๋ ์ค์ผ์ค๋ง ์๊ตฌ ์ฌํญ (์์ ์์ฒญ, RequiredDuringScheduling ์ ํธ๋ ํํ์ ๋ฑ)์ ์ถฉ์กฑํ๋ ๊ฐ ๋
ธ๋์ ๋ํด ์ค์ผ์ค๋ฌ๋์ด ํ๋์ ์์๋ฅผ ๋ฐ๋ณตํ๊ณ ๋
ธ๋๊ฐ ํด๋น MatchExpressions๊ณผ ์ผ์นํ๋ ๊ฒฝ์ฐ ํฉ๊ณ์ โ๊ฐ์ค์นโ๋ฅผ ์ถ๊ฐํ์ฌ ํฉ๊ณ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด ์ ์๋ ๋
ธ๋์ ๋ํ ๋ค๋ฅธ ์ฐ์ ์์ ํจ์์ ์ ์์ ๊ฒฐํฉ๋ฉ๋๋ค. ์ด ์ ์๊ฐ ๊ฐ์ฅ ๋์ ๋
ธ๋๊ฐ ๊ฐ์ฅ ์ ํธ ๋ฉ๋๋ค.
์ด์ ๋ ํ๋๋ฅผ ๋ชจ๋ ์ญ์ ๋ฅผ ํฉ๋๋ค.
kubectl delete -f ~/environment/pod-nginx.yaml
kubectl delete -f ~/environment/pod-with-node-affinity.yaml
Last updated
Was this helpful?