Приоритет
Теория
Приоритет в кубернетес — это не приоритет процессов в Линукс. Приоритет в Линукс показывает, как часто процесс будет выполняться процессором по сравнению с другими процессами в системе. Приоритет в кубернетес показывает, кого первым выкинут из кластера, если в кластере будут заканчиваться ресурсы.
Приоритет устанавливается на под. Это целое число, чем оно больше, тем важнее модуль для системы.
За распределение подов по нодам кластера отвечает планировщик (scheduler). В своей работе он учитывает приоритет подов. Если вы пытаетесь разместить новый под, планировщик смотрит, есть ли в системе необходимые для его размещения ресурсы. Если ресурсов нет, планировщик смотрит приоритет запускаемого процесса и ищет в системе процессы с меньшим приоритетом. Если он их находит, он их удаляет. И так до тех пор, пока в систем не появится достаточного ресурсов для запуска требуемого пода.
При деградации кластера, когда выходит из строя нода. Планировщик пытается восстановить поды с упавшей ноды на рабочих нодах. Если места для размещения не хватает, планировщик начинает выключать поды с меньшим приоритетом и восстанавливать поды с большим приоритетом.
Например, приоритет удобно использовать, когда у вас в одном кластере одновременно размещаются среда разработки и продуктивная среда. В случае деградации кластера, подами среды разработки можно пожертвовать.
PriorityClass
PriorityClass — это объект кластера, не привязываемый к namespace. Он присваивает имя целочисленному значению приоритета.
Значение (value) PriorityClass может иметь любое 32-разрядное целое число, меньшее или равное 1 миллиарду.
Так же можно определить не обязательные поля:
- globalDefault — означает, что этот PriorityClass будет назначаться по умолчанию для всех подов, у которых этот класс не определен.
- description — произвольное описание.
- preemptionPolicy — если этому полю присвоить значение Never, то поды с указанным PriorityClass, при добавлении в систему не будут вытеснять модули с меньшим приоритетом. Они будут запущены планировщиком после появления достаточных для их запуска ресурсов. Значение по умолчанию: PreemptLowerPriority.
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
preemptionPolicy: Never
description: "The maximal priority on the cluster"
Если вы первый раз применяете PriorityClass в кластере, необходимо учитывать следующее:
- У всех подов, созданных до введения PriorityClass приоритет равен нулю.
- При добавлении PriorityClass с globalDefault: true, у подов у которых не был явно установлен приоритет, он все равно остается равным нулю.
- При удалении PriorityClass, у подов, которых он был установлен, приоритет не обнуляется. Числовое значение приоритета остается прежним.
Даже если вы ни разу не использовали PriorityClass, система на самом деле использует приоритеты в своей работе. Посмотрите какие riorityClass уже определены:
# kubectl get pc
NAME VALUE GLOBAL-DEFAULT AGE
k8s-cluster-critical 1000000000 false 33d
system-cluster-critical 2000000000 false 33d
system-node-critical 2000001000 false 33d
# kubectl get pc system-node-critical -o yaml
Если убрать служебную информацию, то system-node-critical будет выглядеть так:
apiVersion: scheduling.k8s.io/v1
description: Used for system critical pods that must not be moved from their current
node.
kind: PriorityClass
metadata:
name: system-node-critical
value: 2000001000
Эти классы используются в системных подах, удалив которые вы нарушите работу кластера.
# kubectl -n kube-system describe pod calico-node-n5xtv | grep Priority
Priority: 2000001000
Priority Class Name: system-node-critical
# kubectl -n kube-system describe pod kube-scheduler-node1 | grep Priority
Priority: 2000000000
Priority Class Name: system-cluster-critical
Поэтому для своих PriorityClass используйте меньшие значения приоритета. Для пользовательских приоритетов принято устанавливать значения около 1000000.
priorityClassName
Для указания, какой PriorityClass необходимо присвоить поду, используют параметр priorityClassName.
apiVersion: v1
kind: Pod
metadata:
name: openresty
labels:
app: openresty
spec:
containers:
- name: openresty
image: openresty:latest
imagePullPolicy: IfNotPresent
priorityClassName: high-priority