쿠버네티스 입문 12장을 정리한 내용입니다.
가장 간단한 스케줄링 옵션으로는 파드의 spec 필드에 설정할 수 있는 노드셀렉터가 있다.
$ kubectl get nodes --show-labels

$ kubectl label nodes minikube disktype=ssd
$ kubectl get nodes --show-labels

minikube라는 노드에 disktype=ssd라는 라벨이 추가된 것을 확인할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: k8s
spec:
containers:
# ~~
nodeSelector:
disktype: ssd
다음과 같이 파드의 nodeSelector를 지정하게 되면 해당 키밸류 쌍을 라벨로 가지고 있는 노드에서 파드가 실행된다.
(해당 키밸류를 가지고 있는 노드가 여러 개인 경우에는 어떤 노드가 우선순위를 가지는 지는 모르겠다. 아마도 자원이 많은 노드에 할당하거나 랜덤으로 배치할 것 같다.)
노드어피니티는 노드셀렉터와 비슷하게 노드의 레이블 기반으로 파드를 스케줄링한다. 노드어피니티와 노드셀렉터를 함께 설정할 수 있으며 이때는 노드어피티니와 노드셀렉터의 조건을 모두 만족하는 노드에 파드를 스케줄링한다.
노드어피니티에는 두가지의 필드가 존재
requiredDuringSchedulingIgnoredDuringExecution
스케줄링하는 동안 꼭 필요한 조건
preferredDuringSchedulingIgnoredDuringExecution
스케줄링하는 동안 만족하면 좋은 조건. 꼭 이 조건을 만족해야 하는 것은 아니다.
두 유형에서, IgnoredDuringExecution는 쿠버네티스가 파드를 스케줄링한 뒤에 노드 레이블이 변경되어도 파드는 계속 해당 노드에서 실행됨을 의미한다. RequiredDuringExecution 필드도 생길 예정이지만 아직 구현되지는 않았다.
apiVersion: v1
kind: Pod
metadata:
name: k8s
spec:
containers:
# ~~~
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/os
operator: In
values:
- linux
- window
- key: disktype
operator: Exists
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 10
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker-node01
requiredDuringSchedulingIgnoredDuringExecution 필드 하위에는 nodeSelectorTerms[], 그 하위에는 matchExpressions[] 필드가 있다. 그 하위 필드로는 key, operator, values[]가 있다.
실제 노드 라벨의 키밸류 쌍이 key, operator, values에 포함될 때 선택된다.
operator는 key가 만족해야하는 조건이며 다음과 같다.
In
values[] 필드에 설정한 값 중 레이블에 있는 값과 일치하는 것이 하나라도 있는지 확인
NotIn
In과 반대로, values[] 필드에 있는 값 모두와 맞지 않는지 확인
Exists
values[] 필드는 필요하지 않다. key 필드에 설정한 값이 레이블에 있는지만 확인. 위의 예제에서는 노드의 레이블에 disktype이라는 키가 있는지만 확인하게 된다.
DoesNotExist
Exists와 반대로 노드의 레이블에 key 필드 값이 없는지만 확인
Gt
Greater than. values[] 필드에 설정된 값보다 큰 숫자형 데이터인지를 확인. values[] 필드는 배열 타입이지만 이때는 값이 하나만 있어야 한다.
- key: core operator: Gt values: - "4"
Lt
Lower than. values[] 필드에 설정된 값보다 작은 숫자형 데이터인지를 확인. values[] 필드는 배열 타입이지만 이때는 값이 하나만 있어야 한다.
위의 requiredDuringSchedulingIgnoredDuringExecution 부분을 해석하면 결국 beta.kubernetes.io/os 레이블에 해당하는 값이 linux 혹은 window이면서, disktype 레이블에 해당하는 값이 존재해야 한다.
preferredDuringSchedulingIgnoredDuringExecution은 하위 필드로 weight 필드가 있다는 점과 nodeSelectorTerms 필드 대신 preference 필드를 사용하는 점을 빼면 requiredDuringSchedulingIgnoredDuringExecution 필드와 설정이 비슷하다.
preference 필드는 해당 조건에 맞는 걸 선호한다는 뜻이다.
weight 필드는 1부터 100까지의 값을 지정할 수 있다. 여러개 matchExpressions[] 필드 안 설정 각각이 노드의 설정과 맞을 때마다 weight 필드 값을 더한다. 그리고 모든 노드 중에서 weight 필드 값의 합계가 가장 큰 노드를 선택한다.
위의 preferredDuringSchedulingIgnoredDuringExecution 부분을 해석하면 결국 kubernetes.io/hostname 레이블에 해당하는 값이 worker-node01인 경우에만 weight 10을 추가한다는 뜻이다.
https://kubernetes.io/ko/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/