Стадия жизненного цикла модуля: Preview
Руководство администратора
Это руководство предназначено для администраторов кластера Deckhouse Kubernetes Platform, которые управляют инфраструктурой Memcached для пользователей.
Основной инструмент администратора — ресурс MemcachedClass. Этот cluster-scoped Custom Resource определяет, какие конфигурации Memcached могут быть развернуты пользователями, устанавливает политики ресурсов, ограничения и правила валидации. Все пользовательские инстансы Memcached создаются на основе классов, которые вы определяете как администратор.
Содержание
- Описание
- Назначение MemcachedClass
- Структура ресурса MemcachedClass
- Поля спецификации
- Как MemcachedClass ограничивает пользовательские ресурсы
- Примеры конфигураций
- Управление классами
- Рекомендации
- Диагностика
Описание
MemcachedClass — это cluster-scoped Custom Resource, который определяет политики и ограничения для создаваемых пользователями ресурсов Memcached.
По сути, MemcachedClass является конструктором для managed-service Memcached — он задает набор правил и значений по умолчанию, на основе которых будут создаваться конкретные инстансы Memcached. Каждый ресурс Memcached, созданный пользователем, обязан ссылаться на один из существующих классов через поле memcachedClassName.
Администратор кластера создает и управляет классами, чтобы контролировать, какие конфигурации Memcached могут быть развернуты в кластере.
Назначение MemcachedClass
Ресурс MemcachedClass позволяет администратору:
- Определить допустимые диапазоны CPU и памяти для инстансов Memcached
- Задать конфигурацию Memcached по умолчанию
- Ограничить параметры, которые пользователи могут переопределять
- Настроить правила размещения подов (node affinity, tolerations, node selector)
- Определить политики топологии для обеспечения высокой доступности
- Установить кастомные правила валидации с использованием CEL (Common Expression Language)
Структура ресурса MemcachedClass
Базовый пример (default класс из модуля)
apiVersion: managed-services.deckhouse.io/v1alpha2
kind: MemcachedClass
metadata:
name: default
spec:
topology:
allowedTopologies:
- Zonal
- TransZonal
- Ignored
defaultTopology: "Ignored"
overridableConfiguration:
- maxItemSize
- slabMinSize
validations:
- message: "max item size must be smaller than 1/2 memory size"
rule: "configuration.maxItemSize <= (instance.memory.size / 2)"
- message: "maxItemSize must be greater than 512k"
rule: "configuration.maxItemSize >= (1024 * 512)"
- message: "maxItemSize must divisible by slabChunkMax (default 524288 bytes 512kB)"
rule: "(configuration.maxItemSize % (1024 * 512)) == 0"
configuration:
threads: 5
maxConnections: 2000
maxItemSize: "4Mi"
slabMinSize: "Short"
lockMemory: false
sizingPolicies:
- cores:
min: 1
max: 4
memory:
min: 100Mi
max: 1Gi
step: 1Mi
coreFraction:
- "1%"
- "5%"
- "10%"
- cores:
min: 5
max: 10
memory:
min: 400Mi
max: 10Gi
coreFraction:
- "5%"
- "10%"
- "15%"Поля спецификации
1. sizingPolicies (обязательное)
Определяет допустимые комбинации CPU и памяти. Пользовательский Memcached ресурс должен попадать в один из определенных sizing policies.
sizingPolicies:
- cores:
min: 1 # Минимальное количество ядер
max: 4 # Максимальное количество ядер
memory:
min: 256Mi # Минимальный объем памяти
max: 8Gi # Максимальный объем памяти
step: 256Mi # Шаг изменения памяти (опционально)
coreFraction: # Допустимые значения coreFraction (опционально)
- "5%"
- "10%"
- "25%"Правила валидации:
- CPU и память пользовательского инстанса должны попадать в диапазон одного из sizing policies
- Если указан
coreFraction, значение пользователя должно быть в списке - Если указан
step, размер памяти пользователя должен быть кратен этому шагу - Диапазоны CPU разных sizing policies не должны пересекаться
Пример ошибки:
Если пользователь создает Memcached с 3 cores и 16Gi памяти при указанном выше sizing policy:
haven't found matching size policy in class default2. configuration (опционально)
Конфигурация Memcached по умолчанию. Эти значения используются, если пользователь не указывает свои или если пользователю запрещено указывать свои через overridableConfiguration
configuration:
threads: 4 # Количество рабочих потоков Memcached (только для администратора)
maxConnections: 1024 # Максимальное количество одновременных подключений (только для администратора)
maxItemSize: "4Mi" # Максимальный размер элемента в кеше
slabMinSize: "Medium" # Размер slab (Short: 50 bytes, Medium: 100 bytes, Long: 200 bytes)
lockMemory: false # Блокировка памяти (mlockall)Важно: Параметры threads и maxConnections доступны только для администратора и не могут быть добавлены в overridableConfiguration. Пользователи не могут переопределять эти параметры.
Параметры:
| Параметр | Тип | Описание | Значения | Доступность |
|---|---|---|---|---|
threads |
integer | Количество рабочих потоков сервера Memcached | Положительное число | Только администратор |
maxConnections |
integer | Максимальное количество одновременных подключений | Положительное число | Только администратор |
maxItemSize |
Quantity | Максимальный размер элемента в кеше | Например: “512k”, “1Mi”, “4Mi” | Может быть в overridableConfiguration |
slabMinSize |
string | Минимальный размер slab-страницы | “Short” (50 bytes), “Medium” (100 bytes), “Long” (200 bytes) | Может быть в overridableConfiguration |
lockMemory |
boolean | Блокировать память (использовать mlockall) | true/false | Может быть в overridableConfiguration |
3. overridableConfiguration (опционально)
Список параметров конфигурации, которые пользователь может переопределить в своем Memcached ресурсе.
overridableConfiguration:
- maxItemSize
- slabMinSize
- lockMemoryДопустимые значения:
lockMemoryslabMinSizemaxItemSize
Важно: Если пользователь попытается переопределить параметр, не указанный в overridableConfiguration, валидация завершится с ошибкой:
ValidationError: configuration field [<field_name>] is not allowed to be overridden by user4. validations (опционально)
Кастомные правила валидации на основе CEL (Common Expression Language).
Важно: В дефолтном классе default уже созданы CEL-правила, которые предотвращают запуск невалидных конфигураций Memcached (например, когда maxItemSize слишком большой или не кратен требуемому значению). Эти правила основаны на ограничениях самого сервера Memcached и помогают избежать ошибок конфигурации.
Рекомендация: При создании собственных классов настоятельно рекомендуется копировать эти правила валидации из дефолтного класса в ваши кастомные классы. Это обеспечит базовую проверку корректности конфигурации и предотвратит создание инстансов с некорректными параметрами.
validations:
- message: "max item size must be smaller than 1/2 memory size"
rule: "configuration.maxItemSize <= (instance.memory.size / 2)"
- message: "maxItemSize must be greater than 512k"
rule: "configuration.maxItemSize >= (1024 * 512)"
- message: "maxItemSize must be divisible by 512k"
rule: "(configuration.maxItemSize % (1024 * 512)) == 0"Доступные переменные в CEL:
| Переменная | Тип | Описание |
|---|---|---|
instance.memory.size |
int | Размер памяти в байтах |
instance.cpu.cores |
int | Количество ядер CPU |
configuration.maxItemSize |
int | Максимальный размер элемента в байтах |
configuration.lockMemory |
bool | Флаг блокировки памяти |
configuration.cpu.coreFraction |
int | Доля ядра CPU (1-100) |
configuration.slabMinSize |
string | Размер slab (“Short”, “Medium”, “Long”) |
configuration.maxConnections |
int | Максимальное количество подключений |
configuration.threads |
int | Количество потоков |
Примеры правил:
# Проверка, что maxItemSize не превышает половину памяти
- message: "maxItemSize too large"
rule: "configuration.maxItemSize <= (instance.memory.size / 2)"
# Проверка соотношения потоков и ядер
- message: "threads should not exceed cores * 2"
rule: "configuration.threads <= (instance.cpu.cores * 2)"5. topology (обязательное)
Определяет политики топологии для высокой доступности.
topology:
allowedTopologies:
- Zonal
- TransZonal
- Ignored
defaultTopology: "TransZonal"
allowedZones:
- zone-a
- zone-b
- zone-cПараметры:
-
allowedTopologies— список разрешенных топологий:- Zonal: все поды кластера размещаются в одной зоне (требует ровно 1 зону в
allowedZones) - TransZonal: поды кластера размещаются в разных зонах (требует минимум 2 зоны)
- Ignored: поды размещаются без учета зон, используются стандартные правила k8s
- Zonal: все поды кластера размещаются в одной зоне (требует ровно 1 зону в
-
defaultTopology— топология по умолчанию (если пользователь не указал) -
allowedZones— список разрешенных зон доступности (опционально)
Правила валидации:
-
Для TransZonal:
- Требуется минимум 2 зоны в
allowedZones - Размер группы (
group.size) не должен превышать количество зон
- Требуется минимум 2 зоны в
-
Для Zonal:
- Требуется ровно 1 зона в
allowedZones
- Требуется ровно 1 зона в
-
defaultTopologyдолжна быть в спискеallowedTopologies
Примеры ошибок:
ValidationError: topology TransZonal not allowed by class default
TransZonal Topology can't be used with less than 2 AllowedZones in selected memcachedClass
You need to have at least 3 allowed zones in memcached class default. You have only 26. Правила размещения подов
Важно о мердже правил размещения:
Правила размещения подов из класса (affinity, tolerations, topologySpreadConstraints, nodeSelector и т.д. и параметры topology) объединяются с правилами из пользовательского ресурса Memcached:
-
Стандартное поведение: Применяются одновременно и правила из класса (заданные администратором), и правила из пользовательского ресурса. Это позволяет администратору установить базовые требования к размещению, которые пользователь может дополнить своими специфичными требованиями.
-
Особый случай (Ignored topology): Если пользователь явно указывает топологию
Ignoredв своем ресурсе, и это разрешено вallowedTopologiesкласса, то для размещения будут применены только правила администратора из класса (affinity,tolerations,topologySpreadConstraints), без автоматического распределения по зонам.
nodeSelector (опционально)
Позволяет размещать поды Memcached только на узлах с определенными метками.
nodeSelector:
node-role.kubernetes.io/memcached: ""
disktype: ssdaffinity (опционально)
Настройка node affinity для более гибкого управления размещением.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node.deckhouse.io/group
operator: In
values:
- memcachedtolerations (опционально)
Позволяет подам размещаться на узлах с taint’ами.
tolerations:
- key: "memcached"
operator: "Equal"
value: "true"
effect: "NoSchedule"
- key: "high-memory"
operator: "Exists"
effect: "NoSchedule"Как MemcachedClass ограничивает пользовательские ресурсы
Важное замечание о несуществующих классах
Важно: Если пользователь указал в memcachedClassName класс, которого не существует в кластере, ресурс Memcached будет успешно создан, но сервис не будет развернут до тех пор, пока указанный класс не появится в кластере.
Когда администратор создаст требуемый класс:
- Автоматически запустятся все валидации пользовательского ресурса
- Если будут обнаружены ошибки валидации, они будут записаны в
status.conditionsресурсаMemcached - Пользователь сможет увидеть эти ошибки через
kubectl describe memcached <name>или проверив conditions в статусе
Это позволяет пользователям заранее создавать ресурсы в ожидании появления нужного класса, но администратору следует информировать пользователей о создании новых классов.
Процесс валидации
Когда пользователь создает или обновляет ресурс Memcached, оператор выполняет следующие проверки:
-
Валидация Sizing Policy
- Проверяет, что CPU и память попадают в один из
sizingPolicies - Проверяет
coreFraction, если указан в policy - Проверяет
stepпамяти, если указан в policy
- Проверяет, что CPU и память попадают в один из
-
Валидация пользовательской конфигурации
- Проверяет, что пользователь переопределяет только поля из
overridableConfiguration
- Проверяет, что пользователь переопределяет только поля из
-
Валидация топологии
- Проверяет, что выбранная топология есть в
allowedTopologies - Проверяет соответствие количества зон требованиям топологии
- Проверяет, что выбранная топология есть в
-
CEL валидации
- Выполняет все правила из
validations
- Выполняет все правила из
Примеры валидации
Пример 1: Несоответствие sizing policy
MemcachedClass:
sizingPolicies:
- cores:
min: 1
max: 4
memory:
min: 256Mi
max: 8GiMemcached (ошибка):
spec:
instance:
cpu:
cores: 8 # Превышает max: 4
memory:
size: 16GiОшибка: haven't found matching size policy in class
Пример 2: Попытка переопределить запрещенный параметр
MemcachedClass:
configuration:
threads: 4
maxItemSize: "4Mi"
overridableConfiguration:
- maxItemSizeMemcached (ошибка):
spec:
configuration:
maxItemSize: "2Mi" # OK - в списке overridableConfiguration
lockMemory: true # ERROR - не в списке overridableConfigurationОшибка: configuration field [lockMemory] is not allowed to be overridden by user
Пример 3: Нарушение CEL правила
MemcachedClass:
validations:
- message: "maxItemSize must be less than half of memory"
rule: "configuration.maxItemSize <= (instance.memory.size / 2)"Memcached (ошибка):
spec:
instance:
memory:
size: 1Gi
configuration:
maxItemSize: "600Mi" # Больше чем 512Mi (половина от 1Gi)Ошибка: ValidationError: maxItemSize must be less than half of memory
Примеры конфигураций
Пример 1: Класс для development окружения
apiVersion: managed-services.deckhouse.io/v1alpha2
kind: MemcachedClass
metadata:
name: dev
spec:
sizingPolicies:
- cores:
min: 1
max: 2
memory:
min: 128Mi
max: 2Gi
coreFraction:
- "5%"
- "10%"
configuration:
threads: 2
maxConnections: 500
maxItemSize: "1Mi"
slabMinSize: "Short"
lockMemory: false
overridableConfiguration:
- maxItemSize
- slabMinSize
topology:
allowedTopologies:
- Ignored
defaultTopology: "Ignored"
validations:
- message: "maxItemSize must be smaller than 1/2 memory size"
rule: "configuration.maxItemSize <= (instance.memory.size / 2)"Пример 2: Класс для production окружения
apiVersion: managed-services.deckhouse.io/v1alpha2
kind: MemcachedClass
metadata:
name: production
spec:
sizingPolicies:
- cores:
min: 4
max: 16
memory:
min: 4Gi
max: 64Gi
step: 4Gi
coreFraction:
- "50%"
- "100%"
configuration:
threads: 8
maxConnections: 4096
maxItemSize: "8Mi"
slabMinSize: "Medium"
lockMemory: true
overridableConfiguration:
- maxItemSize
- slabMinSize
nodeSelector:
node-role.kubernetes.io/memcached: ""
tolerations:
- key: "memcached"
operator: "Equal"
value: "true"
effect: "NoSchedule"
topology:
allowedTopologies:
- TransZonal
defaultTopology: "TransZonal"
allowedZones:
- zone-a
- zone-b
- zone-c
validations:
- message: "maxItemSize must be smaller than 1/2 memory size"
rule: "configuration.maxItemSize <= (instance.memory.size / 2)"
- message: "maxItemSize must be greater than 1Mi"
rule: "configuration.maxItemSize >= (1024 * 1024)"
- message: "maxItemSize must be divisible by 512k"
rule: "(configuration.maxItemSize % (1024 * 512)) == 0"
- message: "production requires minimum 4 cores"
rule: "instance.cpu.cores >= 4"Пример 3: Класс с несколькими sizing policies
apiVersion: managed-services.deckhouse.io/v1alpha2
kind: MemcachedClass
metadata:
name: flexible
spec:
sizingPolicies:
# Политика для малых инстансов
- cores:
min: 1
max: 4
memory:
min: 256Mi
max: 4Gi
step: 256Mi
coreFraction:
- "5%"
- "10%"
- "25%"
# Политика для средних инстансов
- cores:
min: 5
max: 8
memory:
min: 4Gi
max: 16Gi
step: 1Gi
coreFraction:
- "25%"
- "50%"
# Политика для больших инстансов
- cores:
min: 9
max: 16
memory:
min: 16Gi
max: 64Gi
step: 4Gi
coreFraction:
- "50%"
- "100%"
configuration:
threads: 4
maxConnections: 2048
maxItemSize: "4Mi"
slabMinSize: "Medium"
lockMemory: false
overridableConfiguration:
- maxItemSize
- slabMinSize
- lockMemory
topology:
allowedTopologies:
- Zonal
- TransZonal
- Ignored
defaultTopology: "TransZonal"
allowedZones:
- zone-a
- zone-b
- zone-c
validations:
- message: "maxItemSize must be smaller than 1/2 memory size"
rule: "configuration.maxItemSize <= (instance.memory.size / 2)"
- message: "maxItemSize must be at least 512k"
rule: "configuration.maxItemSize >= (1024 * 512)"Управление классами
Создание класса
kubectl apply -f memcached-class.yamlПросмотр классов
kubectl get memcachedclass
kubectl get memcachedclass default -o yamlОбновление класса
Важно: Поле spec в MemcachedClass является immutable (неизменяемым). Это означает, что после создания класса изменить его спецификацию нельзя.
Если нужно изменить класс:
- Создайте новый класс с другим именем
- Переключите пользовательские ресурсы на новый класс
- Удалите старый класс
Удаление класса
kubectl delete memcachedclass <name>Внимание: Перед удалением класса убедитесь, что нет активных ресурсов Memcached, использующих этот класс.
Рекомендации
Для production окружения
-
Используйте строгие sizing policies
- Определите четкие диапазоны CPU и памяти
- Используйте
stepдля контроля гранулярности - Ограничьте
coreFractionразумными значениями
-
Минимизируйте overridableConfiguration
- Позволяйте переопределять только критически важные параметры
- Держите под контролем
threadsиmaxConnections
-
Используйте CEL валидации
- Добавьте правила для проверки соотношений параметров
- Предотвращайте некорректные конфигурации
-
Настройте topology
- Для критичных сервисов используйте
TransZonal - Указывайте конкретные
allowedZones
- Для критичных сервисов используйте
-
Используйте node placement
- Изолируйте Memcached на выделенных узлах
- Используйте
nodeSelectorиtolerations
Для development окружения
-
Используйте гибкие sizing policies
- Широкие диапазоны CPU и памяти
- Не ограничивайте
coreFraction
-
Разрешайте больше overridableConfiguration
- Позволяйте разработчикам экспериментировать с настройками
-
Простая topology
- Используйте
Ignoredдля упрощения
- Используйте
-
Минимум валидаций
- Только базовые проверки безопасности
Диагностика
Проверка валидации
Если пользовательский Memcached не создается, проверьте события:
kubectl describe memcached <name> -n <namespace>Ищите условие ConfigurationValid:
status:
conditions:
- type: ConfigurationValid
status: "False"
message: "ValidationError: max item size must be smaller than 1/2 memory size"