2025. 1. 1. 00:39ㆍ쿠버네티스/쿠버네티스
1. Kubernetes 기본 스케줄러 동작 방식
Kubernetes의 기본 스케줄러는 Pod를 클러스터 내 노드에 배치하는 역할을 합니다. 이 과정은 다음과 같은 단계로 이루어집니다:
- 스케줄링 큐(Scheduling Queue):
- 새로 생성된 Pod는 스케줄링 큐에 추가됩니다.
- 큐는 Pod의 **우선순위(Priority)**에 따라 정렬됩니다.
- 우선순위는 "PriorityClass"를 통해 설정하며, 높은 값일수록 우선순위가 높습니다.
- 필터링 단계(Filter Phase):
- Pod의 요구사항(예: CPU, 메모리)에 맞지 않는 노드는 필터링됩니다.
- 예: NodeResourcesFit 플러그인은 노드의 자원이 Pod 요구사항을 충족하지 못하면 해당 노드를 제외합니다.
- 점수 매기기 단계(Scoring Phase):
- 남은 자원량, 이미지 로컬리티 등 다양한 기준으로 각 노드에 점수를 부여합니다.
- 점수가 가장 높은 노드가 선택됩니다.
- 바인딩 단계(Binding Phase):
- 선택된 노드에 Pod가 바인딩됩니다.
2. 스케줄링 플러그인과 확장 포인트
Kubernetes는 스케줄링 과정을 플러그인을 통해 확장할 수 있습니다. 주요 플러그인과 확장 포인트는 다음과 같습니다:
- 큐 정렬(Queue Sort):
- PrioritySort 플러그인이 사용됩니다.
- 필터(Filter):
- NodeResourcesFit, NodeUnschedulable 등 여러 플러그인이 사용됩니다.
- 점수 매기기(Score):
- NodeResourcesFit, ImageLocality 등이 점수를 부여합니다.
- 바인딩(Bind):
- DefaultBinder 플러그인이 사용됩니다.
추가적으로, 사전/사후 확장 포인트(PreFilter, PostFilter, PreScore, PostScore 등)를 활용해 커스텀 로직을 삽입할 수 있습니다.
3. 다중 스케줄러 배포
(1) 다중 스케줄러란?
- Kubernetes 클러스터에서 기본 스케줄러 외에도 추가적인 스케줄러를 배포할 수 있습니다.
- 특정 애플리케이션이 특별한 조건으로 Pod를 배치해야 할 경우, 커스텀 스케줄러를 작성하여 사용할 수 있습니다.
(2) 배포 방법
- Pod로 배포:
- 커스텀 스케줄러를 Pod로 실행합니다.
- 예제 YAML 파일:
apiVersion: v1
kind: Pod
metadata:
name: custom-scheduler
namespace: kube-system
spec:
containers:
- name: kube-scheduler
image: registry.k8s.io/kube-scheduler:v1.27.0
command:
- /usr/local/bin/kube-scheduler
- --config=/etc/kubernetes/my-scheduler-config.yaml
volumeMounts:
- name: config-volume
mountPath: /etc/kubernetes/
volumes:
- name: config-volume
configMap:
name: my-scheduler-config
Deployment로 배포:
- 고가용성을 위해 Deployment 리소스를 사용해 여러 복사본을 실행할 수 있습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: custom-scheduler-deployment
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
component: custom-scheduler
template:
metadata:
labels:
component: custom-scheduler
spec:
containers:
- name: kube-scheduler
image: registry.k8s.io/kube-scheduler:v1.27.0
command:
- /usr/local/bin/kube-scheduler
- --config=/etc/kubernetes/my-scheduler-config.yaml
volumeMounts:
- name: config-volume
mountPath: /etc/kubernetes/
volumes:
- name: config-volume
configMap:
name: my-scheduler-config
ConfigMap 활용:
- 커스텀 스케줄러 설정 파일(my-scheduler-config.yaml)을 ConfigMap으로 생성하고 이를 볼륨으로 마운트하여 사용합니다.
kubectl create configmap my-scheduler-config --from-file=/root/my-scheduler-config.yaml -n kube-system
community/contributors/devel/sig-scheduling/scheduling_code_hierarchy_overview.md at master · kubernetes/community
Kubernetes community content. Contribute to kubernetes/community development by creating an account on GitHub.
github.com
https://kubernetes.io/blog/2017/03/advanced-scheduling-in-kubernetes/
Advanced Scheduling in Kubernetes
Editor’s note: this post is part of a series of in-depth articles on what's new in Kubernetes 1.6 The Kubernetes scheduler’s default behavior works well for most cases -- for example, it ensures that pods are only placed on nodes that have sufficient f
kubernetes.io
https://jvns.ca/blog/2017/07/27/how-does-the-kubernetes-scheduler-work/
How does the Kubernetes scheduler work?
How does the Kubernetes scheduler work? July 27, 2017 Hello! We talked about Kubernetes’ overall architecture a while back. This week I learned a few more things about how the Kubernetes scheduler works so I wanted to share! This kind of gets into the we
jvns.ca
https://stackoverflow.com/questions/28857993/how-does-kubernetes-scheduler-work
How does Kubernetes' scheduler work?
How does Kubernetes' scheduler work? What I mean is that Kubernetes' scheduler appears to be very simple? My initial thought is that this scheduler is just a simple admission control system, not a...
stackoverflow.com
'쿠버네티스 > 쿠버네티스' 카테고리의 다른 글
Storage - Introduction to Docker Storage (0) | 2025.01.13 |
---|---|
Secrets test/Encrypting Confidential Data at Rest (0) | 2025.01.09 |
Scheduling-Multiple Schedulers (1) | 2024.12.31 |
Scheduling-Static Pods (0) | 2024.12.31 |
Scheduling-DaemonSets (0) | 2024.12.31 |