kubernetes schedule
21 Jun 2019
쿠버네티스 클러스터의 특정 노드에 taint를 지정할 수 있습니다. taint가 걸린 노드에 포드들을 스케쥴링 하려면 toleration을 이용해서 지정해 주어야합니다.
node의 트인트와 일치하는 pod의 톨러레이션이 있는 경우에만 노드에 pod가 스케줄됩니다. 그렇지 않은 경우 node에서 pod를 스케줄하지 않습니다.
테인트는 {key}={value}:{effect} 형식으로 표시됩니다.
kubectl describe node master.k8s
Name: master.k8s
...
Taints: node-role.kubernetes.io/master:NoSchedule
kubectl describe po kube-pod-drbdv
...
Tolerations: node-role.kubernetes.io/master:NoSchedule # 위 node의 taint와 일치
node-role.kubernetes.io/notReady:NoExcute for 300s # 준비되지 않았거나 도달할 수 없는 노드에서 포드가 실행되는 시간을 정의합니다.
node-role.kubernetes.io/unreachable:NoExcute for 300s # 준비되지 않았거나 도달할 수 없는 노드에서 포드가 실행되는 시간을 정의합니다.
테인트 effect
- NoSchedule: 노드가 테인트를 허용하지 않는 경우 포드가 노드에 스케줄되지 않음
- PreferNoSchedule: 스케줄러가 노드 스케줄을 피하려고 하지만 다른 곳에서 스케줄할 수 없는 경우 스케줄합니다.
- NoExcute: 노드에 NoExcute 테인트를 추가하면 노드에서 이미 실행 중인 포드중 NoExcute 톨러레이션하지 않은 포드가 제거됩니다.
노드에 사용자 정의 테인트 추가
kubectl taint node node1 node-type=production:NoSchedule
# node 테인트에 맞게 pod deploy
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: prod
spec:
replicas: 5
template:
spec:
...
tolerations:
- key: node-type
opertaion: Equal # 특정 값을 허용 # Exists 연산자를 사용하는 경우에는 특정 테인트의 값을 허용
vale: production
effect: NoSchedule
노드 친화성
apiVersion: v1
kind: Pod
metadata:
name: kubia-gpu
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDurationExcution: # 친화성이 현재 포드 스케줄링에만 영향을 주고 이미 실행 중인 포드가 노드에서 계속 실행할 수 있음을 알려준다.
nodeSelectorTerms:
- matchExpressions:
- key: gpu
operator: In
values:
- "true"
노드 친화성 기능의 장점은 특정 포드를 스케줄할 때 스케줄러가 선호하는 노드를 지정할 수 있다는 점입니다. 이것은 preferredDuringSchedulingIgnoredDurationExcution 필드에서 수행됩니다.
apiVersion: v1
kind: Pod
metadata:
name: kubia-gpu
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDurationExcution: # 선호도
- weight: 80
preference:
matchExpressions:
- key: availability-zone
operator: In
values:
- zone1
- weight: 20
preference:
matchExpressions:
- key: share-type
operator: In
values:
- dedicated
포드 친화성 및 반친화성
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 5
template:
...
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDurationExcution:
# app=backend 라벨이 있는 포드와 디플로이먼트가 동일한 노드에 배포돼야 한다는 엄격한 요구 사항을 갖는 포드를 생성한다.
- topologyKey: kubernetes.io/hostname # label이 app=backend인 pod가 속한 node의 kubernetes.io/hostname 값을 확인하고 kubernetes.io/hostname 값이 같은 node에 배포한다.
labelSelector:
matchLables:
app: backend
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 5
template:
...
spec:
affinity:
podAffinity: # podAntiAffinity -> 반친화성
preferredDuringSchedulingIgnoredDurationExcution: # 선호도
- weight: 80
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchLables:
app: backend