/k8s-overcommit-operator

A Kubernetes operator designed to intelligently manage resource overcommit on pod resource requests.

Primary LanguageGoApache License 2.0Apache-2.0

๐Ÿš€ k8s-overcommit Operator

Intelligent resource overcommit management for Kubernetes clusters

GitHub License GitHub Release Go Version Build Status

Kubernetes Operator SDK Go Helm REUSE Compliance

GitHub Issues GitHub Pull Requests GitHub Stars GitHub Forks

๐Ÿš€ Quick Start โ€ข ๐Ÿ“– Documentation โ€ข ๐Ÿค Contributing โ€ข ๐Ÿ“ License

Logo

๐ŸŽฏ Overview

The k8s-overcommit Operator is a Kubernetes operator designed to intelligently manage resource overcommit on pod resource requests. It automatically adjusts CPU and memory requests based on configurable overcommit classes, enabling better cluster resource utilization while maintaining workload performance.

โœจ Key Features

  • ๐ŸŽ›๏ธ Flexible Overcommit Classes: Define different overcommit policies for different workload types
  • ๐Ÿท๏ธ Label-Based Configuration: Apply overcommit using pod or namespace labels
  • ๐Ÿ›ก๏ธ Namespace Exclusions: Protect critical namespaces from overcommit policies
  • ๐Ÿ“Š Default Policies: Fallback overcommit values when no specific class is defined
  • ๐Ÿ”’ Admission Webhooks: Seamless integration with Kubernetes admission controllers
  • ๐Ÿ“ˆ Resource Optimization: Improve cluster resource utilization efficiency

๐Ÿš€ Quick Start

๐ŸŽฏ Method 1: Helm Installation (Recommended)

1๏ธโƒฃ Clone the Repository

Clone the repository to your local machine:

git clone https://github.com/InditexTech/k8s-overcommit-operator.git
cd k8s-overcommit-operator

2๏ธโƒฃ Configure Values

Edit the values.yaml file to customize your deployment. Below is an example configuration:

# Example configuration
deployment:
  image:
    registry: ghcr.io
    image: inditextech/k8s-overcommit-operator
    tag: 1.0.0

3๏ธโƒฃ Install with Helm

Install the operator using Helm:

helm install k8s-overcommit-operator chart

๐Ÿ”ง Method 2: OLM Installation

1๏ธโƒฃ Install the CatalogSource

For OpenShift or clusters with OLM installed, apply the catalog source:

kubectl apply -f https://raw.githubusercontent.com/InditexTech/k8s-overcommit-operator/refs/heads/main/deploy/catalog_source.yaml

2๏ธโƒฃ Apply the OperatorGroup

Apply the operator group configuration:

kubectl apply -f https://raw.githubusercontent.com/InditexTech/k8s-overcommit-operator/refs/heads/main/deploy/operator_group.yaml

3๏ธโƒฃ Create the Subscription (Alternative)

You can create your own subscription or use the default subscription.yaml. Below is an example:

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

Apply the subscription:

kubectl apply -f https://raw.githubusercontent.com/InditexTech/k8s-overcommit-operator/refs/heads/main/deploy/subscription.yaml

4๏ธโƒฃ Validation

After installation, validate that the operator is running:

kubectl get pods -n k8s-overcommit

๐Ÿ“ Configuration

๐ŸŽฏ Overcommit Resource

Important

It's a singleton CRD: only can exist one, and it has to be called cluster

First, deploy the main Overcommit resource named "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 Resource

Define overcommit classes for different workload types:

apiVersion: overcommit.inditex.dev/v1alphav1
kind: OvercommitClass
metadata:
  name: high
spec:
  cpuOvercommit: 0.2        # 20% of limits as requests
  memoryOvercommit: 0.8     # 80% of limits as requests
  excludedNamespaces: ".*(^(openshift|k8s-overcommit|kube).*).*"
  isDefault: true
  labels:
    workload-type: batch
  annotations:
    description: "High-density workloads with aggressive overcommit"

๐Ÿ’ก How It Works

๐Ÿ” Label Resolution Priority

  1. Pod Level: Check if pod has the overcommit class label
  2. Namespace Level: If not found, check namespace labels
  3. Default Class: Apply default overcommit class if configured

๐Ÿ“Š Calculation Example

Original Pod Specification:

apiVersion: v1
kind: Pod
metadata:
  name: test
  labels:
    inditex.com/overcommit-class: high
spec:
  resources:
    limits:
      cpu: "2"
      memory: "2Gi"

With 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"           # Unchanged
      memory: "2Gi"      # Unchanged
    requests:
      cpu: "400m"        # 2 * 0.2 = 0.4 cores
      memory: "1638Mi"   # 2Gi * 0.8 = 1.6GiB

๐Ÿ›ก๏ธ Namespace Exclusions

Protect critical namespaces using regex patterns:

excludedNamespaces: ".*(^(openshift|k8s-overcommit|kube).*).*"

This excludes:

  • openshift-*
  • k8s-overcommit-*
  • kube-*

๐Ÿ“š Documentation

Topic Description Link
๐Ÿ—๏ธ Architecture Detailed architecture overview Architecture Guide
๐Ÿงช E2E Testing End-to-end testing guide E2E Testing
๐ŸŽฏ Helm Configuration Helm chart configuration options Helm Values
๐Ÿค Contributing How to contribute to the project Contributing Guide
๐Ÿ“‹ Code of Conduct Community guidelines Code of Conduct

๐Ÿค Contributing

We welcome contributions! Please see our Contributing Guide for details on how to:

  • ๐Ÿ› Report bugs
  • ๐Ÿ’ก Request features
  • ๐Ÿ”ง Submit pull requests
  • ๐Ÿ“ Improve documentation

๐Ÿš€ Development Quick Start

# Generate the manifests
make generate manifests

# Install the CRDs
make install

# Run locally
make run

# Run tests
make test

# Build image
make docker-build

๐Ÿš€ Develop with Tilt

Tilt is a tool that streamlines Kubernetes development by automating build, deploy, and live-update workflows.

./hack/tilt/run_tilt.sh

๐Ÿ“„ License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.


๐Ÿ™ Acknowledgments

  • Built with โค๏ธ by the Inditex Tech team
  • Powered by Operator SDK
  • Inspired by Kubernetes community best practices

โญ Star this project if you find it useful!

Made with โค๏ธ for the Kubernetes community


๐Ÿ—๏ธ Architecture

Architecture Diagram

๐Ÿ”„ Kubernetes API Flow

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
Loading

โฌ†๏ธ Back to Top