🎯 Обзор
Оператор k8s-overcommit — это Kubernetes-оператор (Kubernetes operator), предназначенный для интеллектуального управления переподпиской (overcommit) ресурсов в запросах подов (pod resource requests). Он автоматически корректирует запросы CPU и памяти на основе настраиваемых классов переподписки, обеспечивая более эффективное использование ресурсов кластера без ущерба для производительности рабочих нагрузок.
✨ Ключевые возможности
-
🎛️ Гибкие классы переподписки: определяйте разные политики переподписки для различных типов рабочих нагрузок
-
🏷️ Настройка через метки: применяйте переподписку с помощью меток подов или пространств имён
-
🛡️ Исключения пространств имён: защищайте критически важные пространства имён от политик переподписки
-
📊 Политики по умолчанию: резервные значения переподписки при отсутствии конкретного класса
-
🔒 Допускающие вебхуки (Admission Webhooks): бесшовная интеграция с контроллерами допуска Kubernetes
-
📈 Оптимизация ресурсов: повышение эффективности использования ресурсов кластера
🚀 Быстрый старт
🎯 Способ 1: установка через Helm (рекомендуется)
1️⃣ Клонирование репозитория
Склонируйте репозиторий на локальный компьютер:
git clone https://github.com/InditexTech/k8s-overcommit-operator.git
cd k8s-overcommit-operator
2️⃣ Настройка значений
Отредактируйте файл values.yaml, чтобы адаптировать развёртывание под свои нужды. Пример конфигурации:
# Пример конфигурации
deployment:
image:
registry: ghcr.io
image: inditextech/k8s-overcommit-operator
tag: 1.3.3
3️⃣ Установка через Helm
Установите оператор с помощью Helm:
helm install k8s-overcommit-operator chart
🔧 Способ 2: установка через OLM
1️⃣ Установка CatalogSource
Для OpenShift или кластеров с установленным OLM (Operator Lifecycle Manager) примените источник каталога:
kubectl apply -f https://raw.githubusercontent.com/InditexTech/k8s-overcommit-operator/refs/heads/main/deploy/catalog_source.yaml
2️⃣ Применение OperatorGroup
Примените конфигурацию группы операторов:
kubectl apply -f https://raw.githubusercontent.com/InditexTech/k8s-overcommit-operator/refs/heads/main/deploy/operator_group.yaml
3️⃣ Создание подписки
Вы можете создать собственную подписку или воспользоваться готовым subscription.yaml. Пример:
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: k8s-overcommit-operator
namespace: operators
spec:
channel: alpha
name: k8s-overcommit-operator
source: community-operators
sourceNamespace: olm
Примените подписку:
kubectl apply -f https://raw.githubusercontent.com/InditexTech/k8s-overcommit-operator/refs/heads/main/deploy/subscription.yaml
4️⃣ Проверка
После установки убедитесь, что оператор запущен:
kubectl get pods -n k8s-overcommit
📝 Конфигурация
🎯 Ресурс Overcommit
|
Важно
|
Это одиночный CRD (singleton CRD): может существовать только один экземпляр, и он должен называться cluster |
Сначала разверните основной ресурс Overcommit с именем "cluster":
apiVersion: overcommit.inditex.dev/v1alphav1
kind: Overcommit
metadata:
name: cluster
spec:
overcommitLabel: inditex.com/overcommit-class
labels:
environment: production
annotations:
description: "Main overcommit configuration"
🏷️ Ресурс OvercommitClass
Определите классы переподписки для различных типов рабочих нагрузок:
apiVersion: overcommit.inditex.dev/v1alphav1
kind: OvercommitClass
metadata:
name: high
spec:
cpuOvercommit: 0.2 # 20% от лимитов как запросы
memoryOvercommit: 0.8 # 80% от лимитов как запросы
excludedNamespaces: ".*(^(openshift|k8s-overcommit|kube).*).*"
isDefault: true
labels:
workload-type: batch
annotations:
description: "High-density workloads with aggressive overcommit"
💡 Принцип работы
🔍 Приоритет разрешения меток
-
Уровень пода: проверяется наличие метки класса переподписки у пода
-
Уровень пространства имён: если метка не найдена, проверяются метки пространства имён
-
Класс по умолчанию: применяется класс переподписки по умолчанию, если он настроен
📊 Пример вычисления
Исходная спецификация пода:
apiVersion: v1
kind: Pod
metadata:
name: test
labels:
inditex.com/overcommit-class: high
spec:
resources:
limits:
cpu: "2"
memory: "2Gi"
С применением OvercommitClass (cpuOvercommit: 0.2, memoryOvercommit: 0.8):
apiVersion: v1
kind: Pod
metadata:
name: test
labels:
inditex.com/overcommit-class: high
spec:
resources:
limits:
cpu: "2" # Без изменений
memory: "2Gi" # Без изменений
requests:
cpu: "400m" # 2 * 0.2 = 0.4 ядра
memory: "1638Mi" # 2Gi * 0.8 = 1.6GiB
🛡️ Исключения пространств имён
Защищайте критически важные пространства имён с помощью регулярных выражений:
excludedNamespaces: ".*(^(openshift|k8s-overcommit|kube).*).*"
Это исключает:
-
openshift-* -
k8s-overcommit-* -
kube-*
📚 Документация
| Тема | Описание | Ссылка |
|---|---|---|
🏗️ Архитектура |
Подробный обзор архитектуры |
|
🧪 E2E-тестирование |
Руководство по сквозному тестированию |
|
🎯 Конфигурация Helm |
Параметры конфигурации Helm-чарта |
|
🤝 Участие в проекте |
Как вносить вклад в проект |
|
📋 Кодекс поведения |
Правила сообщества |
🤝 Участие в разработке
Мы рады любому вкладу! Подробнее о том, как:
-
🐛 сообщать об ошибках,
-
💡 предлагать новые функции,
-
🔧 отправлять pull request-ы,
-
📝 улучшать документацию,
— читайте в руководстве по участию.
🚀 Быстрый старт для разработчиков
# Сгенерировать манифесты
make generate manifests
# Установить CRD
make install
# Запустить локально
make run
# Запустить тесты
make test
# Собрать образ
make docker-build
🚀 Разработка с Tilt
Tilt — инструмент, упрощающий разработку под Kubernetes за счёт автоматизации сборки, развёртывания и обновления в реальном времени.
./hack/tilt/run_tilt.sh
📄 Лицензия
Проект распространяется под лицензией Apache License 2.0 — подробности в файле LICENSE.
🙏 Благодарности
-
Создано с ❤️ командой Inditex Tech
-
Работает на базе Operator SDK
-
Вдохновлено лучшими практиками сообщества Kubernetes
🏗️ Архитектура
🔄 Поток запросов через Kubernetes API
flowchart LR
subgraph "Main Flow"
A[📝 API Request] --> B[🔧 API HTTP Handler]
B --> C[🔐 Authentication & Authorization]
C --> D[🔄 Mutating Admission]
D --> E[✅ Object Schema Validation]
E --> F[🛡️ Validating Admission]
F --> G[💾 Persisted to etcd]
end
subgraph "Mutating Webhooks"
direction LR
D --> MW1[🔄 Overcommit Webhook]
D --> MW2[🔄 Other Webhooks]
end
subgraph "Validating Webhooks"
direction LR
F --> VW1[✅ Validation Webhook 1]
F --> VW2[✅ Validation Webhook 2]
F --> VW3[✅ Validation Webhook 3]
end