k8s-overcommit: переподписка ресурсов в Kubernetes

Логотип оператора k8s-overcommit

🎯 Обзор

Оператор 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"

💡 Принцип работы

🔍 Приоритет разрешения меток

  1. Уровень пода: проверяется наличие метки класса переподписки у пода

  2. Уровень пространства имён: если метка не найдена, проверяются метки пространства имён

  3. Класс по умолчанию: применяется класс переподписки по умолчанию, если он настроен

📊 Пример вычисления

Исходная спецификация пода:

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-тестирование

Руководство по сквозному тестированию

E2E-тестирование

🎯 Конфигурация Helm

Параметры конфигурации 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
© 2026 meganuke