Node 생성 시 Label을 등록하고 Pod에 해당 node의 label을 작성
apiVersion: v1
kind: Pod
metadata:
name: pod-3
spec:
nodeSelector:
hostname: node1
containers:
- name: container
image: kube/something
현재 node들의 남은 자원을 기준으로 판단하여 적절한 Node에 배치
node1의 잉여 메모리: 1Gi
node2의 잉여 메모리: 4Gi
새로운 Pod의 필요 메모리: 2Gi
→ 스케쥴러가 node2에 pod를 배치함
pod 안에 있는 app에 부하가 생길 때 node의 자원을 무한정 사용하려 할 경우 해당 Node의 다른 pod들도 함께 죽을 수 있음
apiVersion: v1
kind: Pod
metadata:
name: pod-3
spec:
containers:
- name: container
image: kube/something
resources:
requests:
memoty: 2Gi
limits:
memory: 3Gi
Node의 label의 key를 선택하여 배포
일치하는 Key의 node 중 스케쥴러가 판단하여 더 자원이 많은 node에 배포
일치하는 Key가 없을 경우 스케쥴러가 판단하여 전체 node 중 가장 자원이 많은 곳에 배포
옵션
matchExpressions
: 조건을 만족하는 label을 가진 node에 배포
required
: 지정한 Key와 동일한 node가 없을 경우 배포 x
apiVersion: v1
kind: Pod
metadata:
name: pod-match-expressions1
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- {key: kr, operator: Exists}
containers:
- name: container
image: something
preferred
: 지정한 Key와 동일한 node가 없을 경우에도 스케쥴러가 배포
apiVersion: v1
kind: Pod
metadata:
name: pod-match-expressions1
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- {key: kr, operator: Exists}
containers:
- name: container
image: something
preferred weight
: 지정한 Key와 동일한 node가 다수일 경우 가중치를 줄 점수
podAffinity.matchExpressions
에 찾을 Pod의 key와 expressions를 명시topologyKey
에 해당하는 node에서만 Pod을 찾음예시) 같은 hostpath를 사용하는 다수의 Pod이 있을 경우
apiVersion: v1
kind: Pod
metadata:
name: server1
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: a-team
labelSelector:
matchExpressions:
- {key: type, operator: In, values: [web1]}
containers:
- name: container
image: something
podAntiAffinity.matchExpressions
에 찾을 Pod의 key와 expressions를 명시→ 해당 node에 배포 XtopologyKey
에 해당하는 node에서만 Pod을 찾음apiVersion: v1
kind: Pod
metadata:
name: slave
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: a-team
labelSelector:
matchExpressions:
- {key: type, operator: In, values: [master]}
containers:
- name: container
image: something
nodeSelector
옵션으로 Taint node를 선택해주어야 한다.NoExecute
로 종료 가능Toleration.tolerationSec
, Toleration.effect: NoExecute
가 설정되어 있다면 Node에 NoExecute가 걸려도 tolerationSec
이후에 종료$ kubectl taint nodes node1 hw=gpu;NoSchedule
apiVersion: v1
kind: Pod
metadata:
name: pod-with-toleration
spec:
nodeSelector:
gpu: no1
tolerations:
- effect: NoSchedule
key: hw
operator: Equal
value: gpu
containers:
- name: container
image: something