Прежде чем писать о Kube-scheduler
предположении о кластерном балансировщике, я думаю, что несколько слов о Kubernetes обязательно сказать. Популярность Kubernetes выходит на новый уровень каждый день, и она становится де-факто решением многих обычных и необычных проблем распределенных систем.
Kubernetes (k8s) — это распределенная система с открытым исходным кодом для автоматизированного развертывания, масштабирования развертываний в соответствии с трафиком и другими потребностями доступности бизнеса и управления контейнеризованными приложениями.
Я хочу поделиться своим первоначальным опытом работы с контейнерным приложением, проблемами, с которыми я столкнулся при управлении им, и тем, как Марафон , а затем и Кубернетес стали спасителем для меня. Однако сегодня я выбираю немного продвинутую, хотя и не сложную, тему, связанную с управлением кластерами в Kubernetes. Хорошо, давайте начнем Kube-scheduler
углубляться в структуру планирования K8, и, наконец, я представлю не очень популярный, хотя и элегантный проект для балансировки кластера Kubernetes, названныйDescheduler.
Концепции Kube-scheduler
и структура планирования Kubernetes
Хорошо, мы знаем тот факт, что все распределенные системы нуждаются в процессе или программе, чтобы запланировать работу или задачу в кластере для выполнения; Точно так же Kubernetes нуждается в этом также, и как следует из названия, Kube-scheduler
выполняет ту же соответствующую роль для Kubernetes. Kube-планировщик работает как часть плоскости управления и отслеживает все вновь созданные модули , для которых не назначен ни один узел.
Проще говоря, Kube-scheduler
отвечает за обнаружение вновь созданного модуля и выбирает оптимальный узел для его запуска. В настоящее время вам, ребята, может быть интересно, как Kube-scheduler
определить лучший доступный узел, верно? Согласно официальной документации K8s, выбор узла для модуля состоит из двух этапов:
- Фильтрация : найдите набор узлов, в которых возможно запланировать модуль. Узлы, которые соответствуют критериям планирования модуля, известны как выполнимые узлы. Если этап фильтрации приводит к пустым допустимым узлам, установите модуль как незапланированный до тех пор, пока планировщик не найдет набор допустимых узлов. Пожалуйста, следуйте документации по фильтрации для получения дополнительной информации о критериях фильтрации.
- Оценка . На этом этапе планировщик ранжирует возможные наборы узлов, чтобы выбрать наиболее подходящий узел для размещения модуля. Планировщик следует активным правилам оценки для определения ранга узла.
После Kube-scheduler
определения наиболее подходящего узла для размещения модуля он уведомляет сервер API о решении в процессе, называемом связыванием . Согласно документации структуры планирования K8s , выбор узла и процесс привязки известны как цикл планирования и цикл привязки. Вместе цикл планирования и цикл привязки известны как scheduling context
.
Scheduling-framework — это новая подключаемая архитектура для планировщика k8s, которая упрощает настройку планировщика. Цикл планирования является последовательным; однако цикл привязки является параллельным. Следующая картинка изображает структуру планирования
Я планирую написать еще один пост, подробно описывающий каждую точку расширения в контексте планирования для введения пользовательской логики планирования.
Зачем нам нужен балансирующий кластер Kubernetes?
С точки зрения Kube-планировщика, он отлично справился с задачей, назначив каждый модуль на оптимальном узле. Планировщик принял решение на основе своего взгляда на кластер Kubernetes в тот момент, когда для планирования появляется новый модуль. Кластеры Kubernetes очень динамичны, и их состояние меняется со временем из-за изменений в кластере, таких как добавление или удаление узла, добавление или удаление ограничений на узлы, например, портение узла.
Из-за изменений в течение определенного периода кластер Kubernetes достигает несбалансированного состояния, и возникает необходимость в балансировке кластера.
Подход к решению
Балансировка кластера вручную — это утомительный процесс, потому что, во-первых, нам нужно определить неправильно расположенные блоки в соответствии с новым состоянием кластера, а затем выяснить стратегию их перемещения на оптимальном узле. Но, если мы посмотрим на вторую часть проблемы, она уже решена Kube-scheduler
. Нам просто нужен процесс, который определяет неправильно размещенные модули и удаляет их. Верный? Хорошо, вот и все, наша проблема сейчас элементарна. Нам нужен основанный на правилах descheduler.
Время для решения
Итак, самое время представить благотворителя, тада, роль барабана, пожалуйста. Герой назван Descheduler
. Без каких-либо задержек позвольте мне сначала представить репозиторий проекта GitHub . Как я уже сказал, Descheduler
нам может помочь требование о расписании модулей на основе правил и следующие пять настраиваемых стратегий .
- RemoveDuplicates : он гарантирует, что на одном узле выполняется только один модуль, связанный с объектом Replica Set (RS), Replication Controller (RC), Deployment или Job.
- LowNodeUtilization : найдите недостаточно используемые узлы и извлекают модули из других узлов, чтобы планировщик Kube разместил их на недостаточно используемых.
- RemovePodsViolatingNodeTaints : он обеспечивает удаление модулей, нарушающих NoSchedule.
- RemovePodsViolatingNodeAffinity : он обеспечивает удаление модулей, нарушающих анти-сродство между модулями .
- RemovePodsViolatingInterPodAntiAffinity : он обеспечивает удаление модулей, нарушающих сходство узлов.
Следующий вопрос, это выглядит многообещающе, как я могу его использовать?
Из
README.MD
самого Descheduler можно запустить как Job или CronJob внутри кластера k8s. Преимущество заключается в возможности запуска несколько раз без необходимости вмешательства пользователя. Модуль Descheduler работает как критический модуль вKube-system
пространстве имен, чтобы избежать его выселения самим или Kubelet.
Простой объект Kubernetes для запуска Descheduler
RBAC Object
YAML
1
---
2
kind ClusterRole
3
apiVersion rbac.authorization.k8s.io/v1
4
metadata
5
name descheduler-cluster-role
6
namespace kube-system
7
rules
8
apiGroups""
9
resources"events"
10
verbs"create" "update"
11
apiGroups""
12
resources"nodes"
13
verbs"get" "watch" "list"
14
apiGroups""
15
resources"pods"
16
verbs"get" "watch" "list" "delete"
17
apiGroups""
18
resources"pods/eviction"
19
verbs"create"
20
---
21
apiVersion v1
22
kind ServiceAccount
23
metadata
24
name descheduler-sa
25
namespace kube-system
26
---
27
apiVersion rbac.authorization.k8s.io/v1
28
kind ClusterRoleBinding
29
metadata
30
name descheduler-cluster-role-binding
31
namespace kube-system
32
roleRef
33
apiGroup rbac.authorization.k8s.io
34
kind ClusterRole
35
name descheduler-cluster-role
36
subjects
37
name descheduler-sa
38
kind ServiceAccount
39
namespace kube-system
40
ConfigMap Object
xxxxxxxxxx
1
---
2
apiVersion v1
3
kind ConfigMap
4
metadata
5
name descheduler-policy-configmap
6
namespace kube-system
7
data
8
policy.yaml
9
apiVersion: "descheduler/v1alpha1"
10
kind: "DeschedulerPolicy"
11
strategies:
12
"RemoveDuplicates":
13
enabled: true
14
"RemovePodsViolatingInterPodAntiAffinity":
15
enabled: true
16
"LowNodeUtilization":
17
enabled: true
18
params:
19
nodeResourceUtilizationThresholds:
20
thresholds:
21
"cpu" : 20
22
"memory": 20
23
"pods": 20
24
targetThresholds:
25
"cpu" : 50
26
"memory": 50
27
"pods": 50
28
ConfigMap Object
xxxxxxxxxx
1
---
2
apiVersion batch/v1
3
kind Job
4
metadata
5
name descheduler-job
6
namespace kube-system
7
spec
8
parallelism1
9
completions1
10
template
11
metadata
12
name descheduler-pod
13
spec
14
priorityClassName system-cluster-critical
15
containers
16
name descheduler
17
image us.gcr.io/k8s-artifacts-prod/descheduler/descheduler v0.10.0
18
volumeMounts
19
mountPath /policy-dir
20
name policy-volume
21
command
22
"/bin/descheduler"
23
args
24
"--policy-config-file"
25
"/policy-dir/policy.yaml"
26
"--v"
27
"3"
28
restartPolicy"Never"
29
serviceAccountName descheduler-sa
30
volumes
31
name policy-volume
32
configMap
33
name descheduler-policy-configmap
34
Наконец, я буду рекомендовать проект для балансировки кластера Kubernetes. Вы должны попробовать, если вы столкнулись с той же проблемой.