В 2026 году Kubernetes окончательно превратился из "оркестратора контейнеров" в полноценную операционную систему для датацентра. Если в 2020-м все радовались автоматическому рестарту Pod'ов, то сейчас инфраструктурщики обсуждают GPU scheduling, inference gateway, multi-cluster federation и стоимость токена у LLM-моделей так, будто это курс нефти Brent.
И вот здесь появляется Kubernetes Operator.
Не просто очередной контроллер. Не просто "скрипт в контейнере". А полноценный способ научить Kubernetes понимать ваш бизнес-домен.
В этой статье мы напишем настоящий Kubernetes Operator на Python для одной из самых хайповых тем 2026 года - управления AI Gateway для больших языковых моделей.
Да-да. Будем делать оператор, который автоматически:
-
создает inference endpoint
-
подключает GPU
-
масштабирует модели
-
обновляет routing
-
следит за latency
-
выключает дорогие модели ночью, что бы бухгалтерию удар не хватил, а то кто зарплату будет выплачивать?
И самое приятное - все это на Python. Потому что Go любят все, но иногда хочется писать оператор без ощущения, что ты собираешь двигатель от вертолета ключом на 10.
Почему Kubernetes Operator вообще стал главным паттерном инфраструктуры
Раньше инфраструктура выглядела так:
kubectl apply -f deployment.yaml
Чуть позже:
helm install
Ну и потом:
terraform apply
А потом все поняли страшную вещь.
Инфраструктура перестала быть статичной.
Теперь кластеру нужно:
-
реагировать на события
-
принимать решения
-
автоматически чинить сервисы
-
управлять сложными зависимостями
-
учитывать стоимость GPU
-
мигрировать нагрузки
-
следить за SLA
И обычные YAML-файлы тут уже не помогают.
Operator - это способ встроить "мозг" прямо внутрь Kubernetes.
По сути Kubernetes Operator - это:
-
контроллер
-
бизнес-логика
-
автоматизация
-
реакция на события
-
цикл согласования
То есть система постоянно приводит реальное состояние к желаемому. Именно поэтому почти все современные платформы используют operators:
-
Red Hat OpenShift
-
Elastic Elastic Cloud
-
MongoDB Atlas
-
NVIDIA GPU Operator
-
Grafana Labs Loki Operator
-
DataStax Cassandra Operator
В 2026 году Operator - это уже не "продвинутый Kubernetes". Это стандарт инфраструктурной инженерии.
Почему Python для Operator - это уже нормально
Раньше все говорили:
Operator надо писать только на Go.
И это было логично:
-
Kubernetes написан на Go
-
client-go очень мощный
-
controller-runtime великолепен
-
ecosystem огромная
Но потом появился мегабум и хайп на AI. И внезапно выяснилось:
-
ML-инженеры живут в Python
-
AI SDK живут в Python
-
observability AI tooling живет в Python
-
inference API живут в Python
А еще оказалось, что писать цикл согласования на Python в 10 раз быстрее.
Особенно для:
-
AI infrastructure
-
DataOps
-
MLOps
-
GPU orchestration
-
AI gateways
-
vector database automation
И тут начал набирать популярность фреймворк Kopf.
Что такое Kopf
Kopf - Kubernetes Operator Framework на Python. (Kopf Github)
Очень приятная штука. Он позволяет писать operator почти как обычный Python backend.
Например:
@kopf.on.create('ai.platform.io', 'v1', 'aigateways')
def create_fn(spec, name, namespace, logger, **kwargs):
logger.info(f"Creating AI Gateway {name}")
И все.
Без:
-
тонны boilerplate
-
controller-runtime магии
-
reconcile.Result
-
DeepCopyObject
-
client.ObjectKey
-
admission webhook страданий
Иногда после Go Operator'ов Kopf ощущается как отпуск в Провансе после аварии в production Ceph-кластере.
Что мы будем делать
Наш оператор будет управлять AI Gateway. Представим современную инфраструктуру LLM:
Users
↓
AI Gateway
↓
Routing Layer
↓
LLM Models
├── DeepSeek
├── Llama
├── Mistral
├── Qwen
└── OpenAI-compatible API
Оператор будет:
-
создавать inference deployment
-
подключать GPU node selector
-
создавать Service
-
создавать HPA
-
управлять ingress
-
переключать модели
-
делать autoscaling
Архитектура
Вот как это будет выглядеть:
Custom Resource
↓
AI Gateway Operator
↓
Creates:
- Deployment
- Service
- HPA
- ConfigMap
- Ingress
Установка окружения
Создаем структуру проекта:
mkdir ai-gateway-operator
cd ai-gateway-operator
Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["kopf", "run", "--all-namespaces", "operator.py"]
requirements.txt
kopf
kubernetes
aiohttp
pyyaml
prometheus-client
Установка CRD
Custom Resource Definition - это способ объяснить Kubernetes новый тип ресурса.
Например:
apiVersion: ai.platform.io/v1
kind: AIGateway
Kubernetes из коробки такого не знает.
Создаем CRD.
crd.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: aigateways.ai.platform.io
spec:
group: ai.platform.io
names:
kind: AIGateway
plural: aigateways
singular: aigateway
scope: Namespaced
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
model:
type: string
replicas:
type: integer
gpu:
type: boolean
image:
type: string
Применяем:
kubectl apply -f crd.yaml
Пишем оператор
Теперь начинается магия.
operator.py
import kopf
import kubernetes
from kubernetes import client, config
config.load_incluster_config()
apps = client.AppsV1Api()
core = client.CoreV1Api()
@kopf.on.create('ai.platform.io', 'v1', 'aigateways')
def create_ai_gateway(spec, name, namespace, logger, **kwargs):
image = spec.get("image")
replicas = spec.get("replicas", 1)
gpu = spec.get("gpu", False)
deployment = {
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": name
},
"spec": {
"replicas": replicas,
"selector": {
"matchLabels": {
"app": name
}
},
"template": {
"metadata": {
"labels": {
"app": name
}
},
"spec": {
"containers": [
{
"name": "gateway",
"image": image,
"ports": [
{
"containerPort": 8080
}
]
}
]
}
}
}
}
if gpu:
deployment["spec"]["template"]["spec"]["nodeSelector"] = {
"gpu": "true"
}
deployment["spec"]["template"]["spec"]["containers"][0]["resources"] = {
"limits": {
"nvidia.com/gpu": 1
}
}
apps.create_namespaced_deployment(
namespace=namespace,
body=deployment
)
logger.info(f"AI Gateway {name} created")
И вот это уже полноценный Kubernetes Operator.
Да, настолько все просто.
Создаем Service автоматически
Добавляем в оператор:
service = {
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": name
},
"spec": {
"selector": {
"app": name
},
"ports": [
{
"port": 80,
"targetPort": 8080
}
]
}
}
core.create_namespaced_service(
namespace=namespace,
body=service
)
Создаем Custom Resource
Теперь пользователь кластера может написать:
apiVersion: ai.platform.io/v1
kind: AIGateway
metadata:
name: deepseek-gateway
spec:
image: ghcr.io/company/ai-gateway:latest
replicas: 2
gpu: true
model: deepseek-r1
И оператор автоматически:
-
создаст deployment
-
создаст service
-
подключит GPU
-
выставит replicas
То есть Kubernetes начинает понимать AI-инфраструктуру как нативную сущность. И вот тут приходит очень странное ощущение. Ты больше не "деплоишь контейнеры". Ты создаешь платформу.
Добавляем autoscaling
AI без autoscaling - это билет в финансовую катастрофу. GPU стоят как подержанная машина.
Поэтому делаем HPA.
Создание HPA
autoscaling = client.AutoscalingV2Api()
hpa = {
"apiVersion": "autoscaling/v2",
"kind": "HorizontalPodAutoscaler",
"metadata": {
"name": name
},
"spec": {
"scaleTargetRef": {
"apiVersion": "apps/v1",
"kind": "Deployment",
"name": name
},
"minReplicas": 1,
"maxReplicas": 10,
"metrics": [
{
"type": "Resource",
"resource": {
"name": "cpu",
"target": {
"type": "Utilization",
"averageUtilization": 70
}
}
}
]
}
}
autoscaling.create_namespaced_horizontal_pod_autoscaler(
namespace=namespace,
body=hpa
)
А теперь самое модное - AI-aware scaling
Вот где начинается настоящий 2026 год. Оператор может масштабировать не CPU.
А:
-
queue depth
-
token latency
-
prompt throughput
-
GPU memory pressure
-
tokens/sec
Например:
if queue_size > 100:
scale_to = 10
Или:
if gpu_memory > 90:
move_model_to_another_node()
Вот это уже современный infrastructure engineering.
Добавляем reconciliation loop
Главная идея operator - не просто создать объект. А постоянно следить за состоянием.
Например:
@kopf.timer('ai.platform.io', 'v1', 'aigateways', interval=30)
def monitor_ai_gateway(spec, name, namespace, logger, **kwargs):
logger.info(f"Checking gateway {name}")
deployments = apps.list_namespaced_deployment(namespace)
for deployment in deployments.items:
if deployment.metadata.name == name:
ready = deployment.status.ready_replicas
if ready == 0:
logger.warning("No ready replicas!")
Добавляем обновление модели
Самая модная тема 2026 года - hot model swapping.
То есть:
-
модель обновляется
-
inference не падает
-
traffic переключается постепенно
Добавляем handler:
@kopf.on.update('ai.platform.io', 'v1', 'aigateways')
def update_model(spec, old, new, name, namespace, logger, **kwargs):
old_model = old.get("model")
new_model = new.get("model")
if old_model != new_model:
logger.info(f"Switching model {old_model} -> {new_model}")
Добавляем Prometheus метрики
Инфраструктурщик без метрик - это археолог без кисточки.
metrics.py
from prometheus_client import Counter
gateway_requests = Counter(
'gateway_requests_total',
'Total requests'
)
Production deployment
Теперь собираем контейнер:
docker build -t registry.local/ai-operator:latest .
Публикуем:
docker push registry.local/ai-operator:latest
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-operator
spec:
replicas: 1
selector:
matchLabels:
app: ai-operator
template:
metadata:
labels:
app: ai-operator
spec:
serviceAccountName: ai-operator
containers:
- name: operator
image: registry.local/ai-operator:latest
RBAC
И вот здесь многие начинающие operator-разработчики ловят экзистенциальный кризис от Kubernetes, а проще - бомбалейло. Потому что operator без RBAC работает примерно как DevOps без доступа в production. То есть чисто философски интересно, но бесполезно.
role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: ai-operator
rules:
- apiGroups: [""]
resources:
- services
- pods
verbs:
- "*"
- apiGroups: ["apps"]
resources:
- deployments
verbs:
- "*"
- apiGroups: ["ai.platform.io"]
resources:
- aigateways
verbs:
- "*"
Что получится в итоге
В итоге пользователь сможет создавать AI Gateway буквально одной YAML-манифестацией:
apiVersion: ai.platform.io/v1
kind: AIGateway
metadata:
name: qwen-production
spec:
image: ghcr.io/platform/qwen-gateway:latest
replicas: 4
gpu: true
model: qwen-3-235b
И вся инфраструктура поднимется автоматически. Вот это и есть настоящий Platform Engineering.
Почему Operator'ы стали новой Terraform
Очень интересный тренд последних лет. Terraform отлично создает инфраструктуру.
Но Operator:
-
живет внутри Kubernetes
-
реагирует на события
-
автоматически исправляет проблемы
-
умеет reconciliation
-
знает runtime state
То есть Terraform создает. А Operator управляет жизнью системы. Именно поэтому в 2026 году почти каждая серьезная платформа имеет:
-
Terraform для provisioning
-
Kubernetes Operator для lifecycle management
А стоит ли вообще писать Operator на Python?
Да. Но есть нюансы.
Когда Python Operator - отличная идея
-
AI infrastructure
-
MLOps
-
внутренние платформы
-
автоматизация
-
GPU orchestration
-
data pipelines
-
интеграции с AI SDK
Когда лучше Go
-
ultra high scale
-
сложные CRD
-
admission webhook
-
production-grade ecosystem operator
-
open source CNCF project
Главный инженерный вывод
Самое интересное в Operator'ах даже не автоматизация. А то, что Kubernetes начинает понимать предметную область бизнеса.
Например:
kind: PostgreSQLCluster
или:
kind: KafkaTopic
ну или:
kind: AIGateway
Кластер начинает мыслить бизнес-сущностями. И вот это уже не "оркестратор контейнеров". Это распределенная операционная система датацентра.
С очень нервным DevOps-инженером где-то рядом, который все еще боится делать kubectl delete pod в пятницу вечером.