이 기사는 Huawei Cloud 커뮤니티 "kube-scheduler가 일정을 완료하고 일정 가중치를 조정하는 방법"에서 공유되었습니다. 작성자: 친구를 사귈 수 있습니다. .
I. 개요
Kube-scheduler는 k8s 클러스터의 기본 스케줄러로, kube-apiserver를 모니터링(감시 메커니즘)하고, 예약되지 않은 포드를 쿼리하고, 예약 정책에 따라 클러스터 내 가장 적합한 노드에 포드를 예약합니다.
2. 일정 수립 과정
먼저 API 또는 kubectl 도구를 통해 Pod를 생성합니다. Kube-apiserver는 요청 정보를 수신하여 etcd에 저장합니다. 스케줄러는 watch 메커니즘을 통해 apiserver를 모니터링하여 아직 예약되지 않은 Pod 목록을 확인합니다. 을 통해 각 Pod에 노드 할당을 시도하며 할당 프로세스는 다음과 같습니다.
-
kube-scheduler의 Informer 구성 요소 목록 감시 apiserver, spec.nodeName=""을 사용하여 아직 예약되지 않은 Pod를 필터링합니다.
-
사전 선택(predicate): 스케줄러는 Predicate 알고리즘을 통해 조건에 맞지 않는 노드를 필터링합니다.
-
우선순위: 사전 선택을 통과한 노드의 경우 채점 메커니즘을 사용하여 점수가 가장 높은 노드를 필터링합니다.
-
스케줄러가 Pod에 적합한 노드를 선택한 후 Pod를 노드에 바인딩합니다(Pod의 spec.nodeName 필드에 노드 이름 할당).
참고: Pod.spec.nodeName은 지정된 노드에 Pod를 예약하도록 제약조건을 강제하는 데 사용됩니다. nodeName을 지정하면 스케줄러를 직접 우회할 수 있으며 아무 작업도 수행하지 않습니다. 리소스 필터링 및 검사
3. kuble-scheduler 스케줄링 원리
Kube-scheduler의 스케줄링 프레임워크를 Kubernetes에서는 Scheduler Framework라고 합니다. 스케줄링 프로세스 동안 Pod는 다음 단계를 순차적으로 거쳐야 합니다. 각 단계에는 자체 스케줄링 알고리즘이 있습니다. 스케줄링 알고리즘은 플러그인에서 제공됩니다. 지정된 단계에서 자체 플러그인을 개발할 수도 있습니다. 각 플러그인은 지정된 단계에서 특정 스케줄링 알고리즘을 구현할 수 있습니다. 예를 들어 NodeAffinity 플러그인은 필터 단계에서 포드와 호환되지 않는 노드를 필터링합니다.
-
PreFilter: Pod 관련 정보를 전처리하거나 클러스터 또는 Pod가 충족해야 하는 특정 조건을 확인합니다. PreFilter 플러그인이 오류를 반환하면 예약 주기가 종료됩니다.
-
필터: 포드를 실행할 수 없는 노드를 필터링합니다. 각 노드에 대해 스케줄러는 구성된 순서대로 이러한 필터 플러그인을 호출합니다. 필터 플러그인이 노드를 실행 불가능으로 표시하면 노드가 직접 제외되고 해당 노드에 대해 나머지 필터 플러그인이 호출되지 않습니다.
-
PostFilter: 필터 단계 후에 호출되지만 포드에 실행 가능한 노드가 없는 경우에만 호출됩니다. 일반적인 사후 필터링 구현은 다른 포드의 리소스를 선점하여 이 포드 스케줄러를 만들려고 시도하는 선점입니다.
-
PreScore: 점수 매기기 작업을 실행하여 점수 매기기 가능한 플러그인의 공유 상태를 생성합니다. PreScore 플러그인이 오류를 반환하면 예약 주기가 종료됩니다.
-
점수: 각 채점 플러그인을 호출하여 예약 가능한 노드의 점수를 매깁니다.
-
NormalizeScore: 각 플러그인의 점수를 [0, 100] 사이로 표준화합니다.
-
예약: 바인딩 주기 전에 예약 노드 선택
-
허용: 포드 예약 주기 결과 승인 또는 거부
-
PreBind: 포드가 바인딩되기 전에 필요한 작업을 수행하는 데 사용됩니다. 예를 들어 사전 바인딩된 플러그인은 네트워크 볼륨을 제공하고 대상 노드에서 포드를 실행하기 전에 이를 대상 노드에 마운트해야 할 수 있습니다.
-
바인드: 포드를 노드에 바인딩하는 데 사용됩니다. Bind 플러그인은 모든 PreBind 플러그인이 완료될 때까지 호출되지 않습니다.
-
PostBind: 정보 확장 지점입니다. 바인딩 후 플러그인은 포드가 성공적으로 바인딩된 후에 호출됩니다. 이는 바인딩 주기의 끝이며 관련 리소스를 정리하는 데 사용될 수 있습니다.
스케줄러의 사전 선택 단계는 주로 Pod 스케줄링 조건을 충족하지 않는 노드를 필터링하는 데 사용되는 필터에 해당하고, 최적화 단계는 각 노드의 점수를 매기는 데 주로 사용되는 점수에 해당합니다.노드 점수 = 플러그인 점수 * 플러그인 가중치; 점수가 가장 높은 노드를 정렬하여 선택합니다.
스케줄링 단계 |
플러그인 이름 구현 |
플러그인 기능 소개 |
필터 |
포드토폴로지확산 |
노드가 Pod의 토폴로지 분포를 만족하는지 확인하고, 그렇지 않으면 노드를 필터링합니다. |
인터팟어피니티 |
노드가 포드의 어피니티 구성을 충족하는지 확인하고 그렇지 않은 경우 노드를 필터링합니다. |
|
NodePort |
노드가 포드의 포트 요청을 충족하는지 확인하고 그렇지 않은 경우 노드를 필터링합니다. |
|
노드어피니티 |
노드가 포드의 노드 어피니티 구성을 충족하는지 확인하고 그렇지 않은 경우 노드를 필터링합니다. |
|
볼륨바인딩 |
노드가 pv의 노드 선호도를 충족하는지 확인하고, 다음 단계에서 사용할 수 있도록 동적으로 PVC(예: 토폴로지)를 생성하기 위한 조건을 충족하는 노드를 저장합니다. |
|
TaintToleration |
Pod 허용 오차 및 노드 오염을 기반으로 하는 NoSchedule 및 NoExecute 필터 노드 |
|
점수 |
노드어피니티 |
플러그인 가중치를 기준으로 점수를 계산하고, 전략 가중치 비율을 기준으로 노드 점수를 계산하며, 점수 범위는 0~100이고 가중치는 기본적으로 2로 설정됩니다. |
노드리소스균형 할당 |
점수는 노드 용량에 대한 다양한 리소스(cpu, mem, 볼륨)의 비율에 해당 리소스의 가중치를 더한 값으로 계산되며, 점수 범위는 0~100이고 가중치는 기본적으로 1입니다. |
|
이미지 지역성 |
점수는 Pod에 있는 이미지의 크기와 모든 노드의 이미지 분포를 기준으로 하며 점수 범위는 0~100이고 가중치는 기본적으로 1입니다. |
|
인터팟어피니티 |
플러그인 가중치를 기준으로 점수를 계산하고, 전략 가중치 비율을 기준으로 노드 점수를 계산하며, 점수 범위는 0~100이고 가중치는 기본적으로 2로 설정됩니다. |
|
TaintToleration |
PreferNoSchedule 전략에 따라 점수를 계산하며, 점수 범위는 0~100, 가중치 기본값은 3입니다. |
|
NodeResourcesFit |
세 가지 전략: LeastAllocation(할당량이 적을수록 점수가 높음), MostAllocation(할당량이 많을수록 점수가 높음), RequestedToCapacityRatio(요청 값 대 용량 비율) |
|
포드토폴로지확산 |
위상적 매칭 정도와 가중치에 따라 점수를 획득하며, 점수 범위는 0~100, 가중치 기본값은 2이다. |
3.1 kubernetes 1.23 버전 스케줄러 필터 단계 및 점수 단계 소스 코드 분석
3.2 스케줄러 플러그인의 기본 가중치 수정 예
3.2.1 환경 준비
환경: 클러스터에 k8s-0001과 k8s-0002라는 두 개의 노드가 있으며 기존 워크로드 nginx는 노드 k8s-0002에 예약되어 있으며 워크로드 테스트 및 yaml 파일은 다음과 같습니다.
api버전: apps/v1 종류: 배포 메타데이터: 이름: 테스트 사양: 선택기: matchLabels: 앱: 테스트 템플릿: 메타데이터: 라벨: 앱: 테스트 사양: 컨테이너: - 이름: 컨테이너-1 이미지: nginx:최신 dnsPolicy: ClusterFirst 선호도: nodeAffinity: #사용 가능한 정보 선호하는DuringSchedulingIgnoredDuringExecution: - 무게: 1 선호사항: matchExpressions: - 키: kubernetes.io/hostname 연산자: In 값: - k8s-0001 podAffinity: #利사용정보 선호하는DuringSchedulingIgnoredDuringExecution: - 무게: 1 podAffinityTerm: labelSelector: matchExpressions: - 키: 앱 연산자: In 값: - nginx 네임스페이스: - 기본값 토폴로지키: kubernetes.io/hostname
3.2.2 워크로드 테스트가 노드 k8s-0002에 예약되도록 InterPodAffinity 가중치를 조정합니다.
api버전: v1 종류: ConfigMap 메타데이터: 이름: Scheduler-config 네임스페이스: kube-system 데이터: Scheduler-config.yaml: | api버전: kubescheduler.config.k8s.io/v1beta3 #1.23以上版本集群可用v1beta3 종류: KubeSchedulerConfiguration 프로필: - 스케줄러 이름: default-scheduler 플러그인: 점수: 비활성화됨: - 이름: InterPodAffinity - 이름: NodeAffinity 활성화됨: - 이름: InterPodAffinity #提高负载亲화权중 무게: 100 - 이름: NodeAffinity 무게: 1
kube-scheduler 스케줄링 로그를 확인하면 k8s-002 점수는 점수 100 * 가중치 100으로 총 10,000점이며 k8s-002 노드에 예약됩니다.
3.2.3 워크로드 테스트가 노드 k8s-0001에 예약되도록 NodeAffinity 가중치를 조정합니다.
api버전: v1 종류: ConfigMap 메타데이터: 이름: Scheduler-config 네임스페이스: kube-system 데이터: Scheduler-config.yaml: | api버전: kubescheduler.config.k8s.io/v1beta3 종류: KubeSchedulerConfiguration 프로필: - 스케줄러 이름: default-scheduler 플러그인: 점수: 비활성화됨: - 이름: InterPodAffinity - 이름: NodeAffinity 활성화됨: - 이름: InterPodAffinity 무게: 1 - 이름: NodeAffinity #提高节点亲화权중 무게: 100
SenseTime 창립자 Tang Xiaoou, 55세의 나이로 사망 2023년에는 PHP 정체 Wi-Fi 7이 완전히 출시됩니다 2024년 초 데뷔, Wi-Fi 6보다 5배 빠름 홍멍 시스템은 곧 독립을 앞두고 있으며 많은 대학에서 '홍멍 수업'을 설치했습니다 Zhihui Jun의 스타트업 회사 재융자, 금액 6억 위안 초과, 사전 평가액 35억 위안 Quark Browser PC 버전 내부 테스트 시작 AI 코드 도우미 인기 많고 프로그래밍 언어 순위는 다 별거 없어요 Mate 60 Pro의 5G 모뎀과 무선 주파수 기술이 훨씬 앞서 있습니다 MariaDB가 SkySQL을 분할하여 설립되었습니다 독립 회사로서 Xiaomi는 Yu Chengdong의 화웨이의 "용골 피벗" 표절 발언에 대응