728x90
반응형
파드 스케줄링
파드를 만들때 어떤 노드에서 실행할지 다양한 옵션으로 선택할 수 있다.
NodeSelector(노드 셀렉터)
- 설정
spec: containers: nodeSelector: key: value
Node Affinity
- 노드 레이블을 기반으로 파드를 스케줄링 한다.
- 노드 셀렉터를 함께 설정할 경우 둘다 만족하는 노드에 스케줄링된다.
- requiredDuringSchedulingIgnoredDuringExecution : 스케줄링 하는동안 꼭 필요한 조건
- preferredDuringSchedulingIgnoredDuringExecution : 만족하면 좋은 조건. (필수아님)
- 스케줄링 하는 동안 조건이 변경되더라도 무시한다.
- 설정
spec: 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
- operators : In, NotIn, Exists, DoesNotExist, Gt(Greater than), Lt(Lower than)
Pod affinity, antiAffinity
- affinity: 서로 연관성이 있는 Pod 를 같은 노드에 배치
- antiAffinity: 자원을 많이 차지 하는 Pod 를 서로 다른 노드에 배치
- 설정
spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - store topologyKey: "kubernetes.io/hostname"
- app 필드 값이 store 인 노드는 피해서 스케줄링 한다.
- topologyKey : affinity 를 만족하면 topologyKey 기준으로 같은 노드에 pod 를 실행하고 anitiAffinity를 만족하면 topologyKey 기준으로 다른 노드에 pod 를 실행한다.
taint, toleration
- 테인트를 설정한 노드는 스케줄링 하지 않는다.
- 테인트를 설정한 노드에 스케줄링 하려면 톨러레이션을 설정해야 한다.
- kubectl taint nodes 노드명 key01=value01:NoSchedule (key=value:효과)
- kubectl taint nodes 노드명 key01=value01:NoSchedule- (테인트 제거)
- 톨러레이션
spec: tolerations: - key: "key01" operator: "Equal" value: "value01" effect: "NoSchedule"
- effect
- NoSchedule : 톨러레이션 설정 없으면 스케줄링 안함.
- PreferNoSchedule : 스케줄링 안하지만 자원 부족하면 할수도 있음
- NoExecute : 스케줄링 안하며 기존 파드도 설정이 없는경우 종료시킴
- effect
cordon, drain
- cordon
- 지정한 노드에 추가로 파드를 스케줄링 하지 않는다.
- kubectl cordon 노드명
master01@master01-VirtualBox:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01-virtualbox Ready master 79d v1.19.2 worker01-virtualbox Ready <none> 79d v1.19.2 worker02-virtualbox NotReady <none> 79d v1.19.2 master01@master01-VirtualBox:~$ kubectl cordon worker01-virtualbox node/worker01-virtualbox cordoned master01@master01-VirtualBox:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01-virtualbox Ready master 79d v1.19.2 worker01-virtualbox Ready,SchedulingDisabled <none> 79d v1.19.2 worker02-virtualbox NotReady <none> 79d v1.19.2 master01@master01-VirtualBox:~$ kubectl uncordon worker01-virtualbox node/worker01-virtualbox uncordoned master01@master01-VirtualBox:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01-virtualbox Ready master 79d v1.19.2 worker01-virtualbox Ready <none> 79d v1.19.2 worker02-virtualbox NotReady <none> 79d v1.19.2
- drain
- 지정된 노드에 있는 파드를 다른 노드로 옮긴다.
- 노드에 데몬셋이 존재할 경우 적용 불가능
- 데몬셋 무시하고 적용할 경우 --ignore-daemonsets=true 옵션 추가
- 컨트롤러를 이용하지 않은 파드들도 drain 불가능
출처 : 쿠버네티스 입문 - 90가지 예제로 배우는 컨테이너 관리자 자동화 표준 (동양북스)
728x90
반응형
'Development > Docker&Kubernetes' 카테고리의 다른 글
[K8S] static pod 에 대해서 몇가지. (0) | 2021.02.04 |
---|---|
[K8S] apiserver 에 SAN(Subject Alternative Name) 추가 (0) | 2021.01.05 |
쿠버네티스 입문 11장 secret (0) | 2020.12.30 |
쿠버네티스 입문 9장 레이블&애너테이션 (0) | 2020.12.30 |
쿠버네티스 입문 10장 컨피그맵 (0) | 2020.12.30 |