Hi, I'm Brendan and I'm going to talk to you today about how the scheduler in Kubernetes works.
First of all it's probably worth noting what the scheduler actually is.
Well, in Kubernetes you have a bunch of machines, and a single container that has a single pod that a user is asked the Kubernetes API to run.
Well now the scheduler's job is to figure out if we have a scheduler over here, it says where in which specific machine should this container actually execute.
Should I place it here, should I place it here, should I place it here or should I place it here? This is one of the more important jobs that any binary does in Kubernetes because without it the containers really would have no idea where they should be executing.
It's very similar to the fact that in most modern PC's, your laptop or your phone or anything else there's multiple cores that a program could execute on, and the operating system scheduler is responsible for determining when and where a particular program should execute.
So, let's take a look at how the scheduler works.
Well, ultimately when you create a pod that object exists in the Kubernetes API, but it doesn't have a node associated with it.
The API object for that pod doesn't have a machine that has been scheduled onto.
The scheduler is continually watching for pods that are in this condition.
It's continually watching for pods that have been created but haven't been successfully scheduled.
It is also continually watching the state of all of the machines.
Because of course where to schedule the container has a lot to do with the current existing state of a particular machine.
What it's thinking about when it makes a scheduling decision, is a mixture of two things.
There are predicates, and there are priorities.
Predicates are hard constraints.
They are things that cannot be violated.
It might be something like I need to run on a machine with at least four gigabytes of memory.
If a machine doesn't have four gigabytes of memory there is no way that that container can be scheduled there.
They eliminate machines entirely from consideration by the scheduler.
Priorities on the other hand are softer.
They say things like, "It would be nice if my application was spread across a large number of failure domains.
It would be nice if every machine in the cluster roughly had the same amount of workload assigned to it." So, priorities are soft constraints.
They can be violated but give you some sense of the badness or goodness of either satisfying or not satisfying the constraint.
The hard constraints are a mix of things that are system supplied and things that a user can supply.
So, for example a system supplied hard constraint might be what I was talking about earlier, the memory requirement.
When you create a pod and you say I need four gigabytes of memory that implies a hard requirement.
But likewise, when you create a pod you could say I want to have a node selector, and that node selector is SSD.
I want to only schedule onto machines that have a label of SSD that indicates that they have flash hard drive available to them.
In that case, this hard constraint is a node selector hard constraint that says only machines that have that label pass the predicate for this particular node selector.
That's specified by the end-user.
Now, in terms of soft constraints we mentioned one which is something like spreading.
Spreading is the desire in general for an application to be spread across multiple machines.
So, that if one machine happens to fail the entire application doesn't fail.
This is obviously not a requirement if I have no space, if I had absolutely no space to run three replicas of your application without putting two of them on the same machine, would you rather that the scheduler didn't run one replica? No, I think you'd rather than it placed two replicas onto a specific machine.
So that's why it's a soft constraint that can be violated.
Another example of a soft constraint might be using what's called a taint.
So, a machine can have a taint which says, "Slightly sick".
Maybe a machine software has detected that this machine seems like it might be going bad.
It's not quite so bad that we need to take it out of rotation, but we've noticed an increase number of error rate when talking to memory for example or we've noticed that there may be some bad sectors on one of the disks.
A soft constraint would say, "I would generally prefer that it's not a sick machine." But again, if this is the only place where you can possibly play something, it's okay with me.
Now the actual scoring associated with this priority can give you some notion of how the scheduler behaves.
So, if I prefer spreading, if spreading is worth more to me than avoiding a sick machine, then I'm going to actually place my application here, not here because I prefer spreading.
I'll take the fact that the machine is a little bit sick.
If on the other hand, I prefer to avoiding sick machines over my desire for spreading, well, then I'm going to not place the container onto the machine that has been marked sick.
And instead place the container over here where I violated the spreading constraint but I have satisfied the sickness constraint.
Ultimately, it's this mixture of predicates that eliminate whole machines from consideration and priorities which give you the relative value of the different machines that indicate where the container is actually going to be scheduled.
In fact, the way that this works is the first cut is; if I start out with a complete list of nodes, I'm going to filter those nodes by the predicates then I'm going to sort those filtered nodes by the priorities and then ultimately the number one node that comes out of this sort, is going to be the place where I schedule my container.
So, I hope that's given you a rough introduction to the role of the scheduler in Kubernetes, and how it figures out where to place the containers you create through the Kubernetes API.
안녕하세요, 저는 Brendan입니다. 오늘 Kubernetes의 스케줄러가 작동하는 방식에 대해 말씀 드리겠습니다.
우선 스케줄러가 실제로 무엇인지 주목할 가치가 있습니다.
Kubernetes에는 여러 머신과 사용자에게 Kubernetes API 실행을 요청하는 단일 pod가있는 단일 컨테이너가 있습니다.
이제 스케줄러의 임무는 여기에 스케줄러가 있는지 알아내는 것입니다.이 컨테이너가 실제로 어떤 특정 기계에서 실행되어야하는지 알려줍니다.
여기에 두어야하나요, 여기에 두어야하나요, 여기에 두어야하나요, 아니면 여기에 두어야하나요? 바이너리가 없으면 컨테이너가 실제로 실행해야 할 위치를 알 수 없기 때문에 바이너리가 Kubernetes에서 수행하는 더 중요한 작업 중 하나입니다.
대부분의 최신 PC, 랩톱 또는 휴대폰 또는 기타 모든 것에는 프로그램이 실행될 수있는 여러 코어가 있고 운영 체제 스케줄러가 특정 프로그램을 실행해야하는시기와 위치를 결정한다는 사실과 매우 유사합니다.
이제 스케줄러가 어떻게 작동하는지 살펴 보겠습니다.
음, 궁극적으로 pod를 만들 때 객체는 Kubernetes API에 있지만 연결된 노드가 없습니다.
해당 포드의 API 개체에 예약 된 머신이 없습니다.
스케줄러는이 상태에있는 포드를 계속 감시합니다.
생성되었지만 성공적으로 예약되지 않은 포드를 지속적으로 감시하고 있습니다.
또한 모든 기계의 상태를 지속적으로 관찰하고 있습니다.
물론 컨테이너를 예약 할 위치는 특정 시스템의 현재 기존 상태와 많은 관련이 있습니다.
스케줄링 결정을 내릴 때 생각하는 것은 두 가지가 혼합 된 것입니다.
술어가 있고 우선 순위가 있습니다.
술어는 엄격한 제약입니다.
위반할 수없는 것입니다.
적어도 4GB의 메모리가있는 컴퓨터에서 실행해야하는 것과 같을 수 있습니다.
시스템에 4GB의 메모리가 없으면 해당 컨테이너를 거기에서 예약 할 수있는 방법이 없습니다.
스케줄러의 고려에서 기계를 완전히 제거합니다.
반면에 우선 순위는 더 부드럽습니다.
그들은 "내 응용 프로그램이 많은 장애 도메인에 분산되어 있으면 좋을 것입니다.
클러스터의 모든 시스템에 대략 동일한 양의 워크로드가 할당되어 있으면 좋을 것입니다. "따라서 우선 순위는 소프트 제약입니다.
그것들은 위반 될 수 있지만 제약을 만족하거나 만족하지 못하는 것의 나쁘거나 선함을 당신에게 약간의 감각을줍니다.
하드 제약은 시스템에서 제공하는 것과 사용자가 제공 할 수있는 것의 혼합입니다.
예를 들어 시스템에서 제공하는 하드 제약은 제가 이전에 말했던 메모리 요구 사항 일 수 있습니다.
포드를 만들 때 어려운 요구 사항을 의미하는 4GB의 메모리가 필요하다고 말씀 하셨을 때.
하지만 마찬가지로 pod를 만들 때 노드 선택기를 원하고 그 노드 선택기가 SSD라고 말할 수 있습니다.
사용 가능한 플래시 하드 드라이브가 있음을 나타내는 SSD 레이블이있는 컴퓨터에만 예약하고 싶습니다.
이 경우이 하드 제약은 해당 레이블이있는 머신 만이 특정 노드 선택기에 대한 조건자를 전달한다는 것을 나타내는 노드 선택기 하드 제약입니다.
최종 사용자가 지정합니다.
이제 소프트 제약의 관점에서 우리는 확산과 같은 제약을 언급했습니다.
분산은 일반적으로 응용 프로그램이 여러 시스템에 분산되기를 원하는 것입니다.
따라서 하나의 시스템이 실패하더라도 전체 애플리케이션이 실패하지 않습니다.
공간이없는 경우에는 분명히 요구 사항이 아닙니다. 동일한 시스템에 두 개를 배치하지 않고 애플리케이션의 복제본 세 개를 실행할 공간이 전혀없는 경우 스케줄러가 하나의 복제본을 실행하지 않는 것이 낫습니까? 아니요, 특정 컴퓨터에 두 개의 복제본을 배치하는 것보다 낫다고 생각합니다.
그래서 그것은 위반 될 수있는 소프트 제약 인 이유입니다.
소프트 제약의 또 다른 예는 taint를 사용하는 것입니다.
따라서 기계에는 "약간 아파"라는 오염이있을 수 있습니다.
기계 소프트웨어가이 기계가 고장난 것처럼 보이는 것을 감지했을 수 있습니다.
로테이션에서 제거해야 할 정도로 나쁘지는 않지만, 예를 들어 메모리와 대화 할 때 오류율이 증가하는 것을 발견했거나 디스크 중 하나에 불량 섹터가있을 수 있음을 발견했습니다.
소프트 제약은 "나는 일반적으로 그것이 아픈 기계가 아니라는 것을 선호합니다."라고 말할 것입니다. 하지만 다시 말하지만, 이것이 당신이 무언가를 할 수있는 유일한 장소라면, 저도 괜찮습니다.
이제이 우선 순위와 관련된 실제 점수는 스케줄러가 어떻게 작동하는지에 대한 개념을 제공 할 수 있습니다.
따라서 확산을 선호하고 확산이 병든 기계를 피하는 것보다 나에게 더 가치가 있다면 실제로 응용 프로그램을 여기에 배치 할 것입니다. 확산을 선호하기 때문입니다.
기계가 조금 아프다는 사실을 받아들이겠습니다.
다른 한편으로, 확산에 대한 욕구보다 아픈 기계를 피하는 것을 선호한다면, 병이라고 표시된 기계에 용기를 놓지 않을 것입니다.
그리고 대신에 내가 퍼짐 제약을 위반했지만 병 제약을 만족시킨 곳에 용기를 여기에 놓습니다.
궁극적으로 컨테이너가 실제로 예약 될 위치를 나타내는 서로 다른 시스템의 상대적인 값을 제공하는 고려 사항 및 우선 순위에서 전체 시스템을 제거하는 조건 자의 혼합입니다.
사실, 이것이 작동하는 방식이 첫 번째 컷입니다. 전체 노드 목록으로 시작하면 조건 자별로 해당 노드를 필터링 한 다음 우선 순위별로 필터링 된 노드를 정렬 한 다음 궁극적으로 이런 종류에서 나오는 첫 번째 노드는 다음과 같습니다. 컨테이너를 예약하는 장소가 될 것입니다.
이 글을 통해 Kubernetes에서 스케줄러의 역할에 대한 대략적인 소개와 Kubernetes API를 통해 생성 한 컨테이너를 배치 할 위치를 파악하는 방법을 알 수 있기를 바랍니다.
Add Comment