Learning Platform
Глоссарий Troubleshooting
Урок 19.05 · 18 мин
Средний
extensionCRDoperatoradmissionaggregated APICSICNICRI

Summary: способы расширить Kubernetes

Большая часть «полезного», что ставят в production-кластер, — расширения, а не built-in компоненты. cert-manager, Prometheus, Istio, ArgoCD, Linkerd, External Secrets, KEDA, Strimzi — всё это extensions. Этот урок собирает все шесть механизмов расширения Kubernetes в один граф решений и даёт ясные критерии: «у меня есть задача X, какой механизм мне подходит?».


Архитектура Kafka Connect: source/sink connectors, plugin API

Шесть механизмов расширения Kubernetes

  1. CRD + Custom Controller (Operator) — 99% случаев. Декларативный новый kind в API + Pod-controller, реконсилирующий состояние.
  2. Aggregated API server — отдельный API server рядом с kube-apiserver. Для случаев, когда нужно custom storage или нестандартные subresources.
  3. Admission webhooks (mutating и validating) — middleware между authn/authz и записью в etcd. Для validation/mutation на admission time.
  4. Authentication webhooks — custom authentication (token validators). Если корпоративная identity не покрывается built-in OIDC.
  5. Authorization webhooks — custom authorization (Sentinel, OPA-style RBAC поверх external policy engine).
  6. CSI / CNI / CRI / Device plugins — расширения для storage drivers, network plugins, container runtimes, hardware devices (GPU, FPGA, RDMA).
Карта механизмов расширения Kubernetes
CRD + OperatorДекларативный новый resource type через CustomResourceDefinition + custom controller. 99% всех extensions: cert-manager, Prometheus, ArgoCD, Istio, Strimzi, операторы баз данных.
Aggregated APIОтдельный API server, проксируется kube-apiserver через APIService. Для custom storage или специальных subresources. Примеры: metrics-server, custom-metrics-apiserver, KubeVirt subresources.
Admission webhooksMutating / Validating webhooks через MutatingWebhookConfiguration / ValidatingWebhookConfiguration. ValidatingAdmissionPolicy (CEL) с v1.30 для simple cases. Примеры: Istio injector, Kyverno, OPA Gatekeeper.
Auth webhooksAuthentication webhook (--authentication-token-webhook-config-file) — для custom token validators. Authorization webhook (--authorization-webhook-config-file) — для policy engine вне RBAC. Реже встречаются.
CSI / CNI / CRIContainer Storage Interface — storage drivers (AWS EBS, Ceph, Longhorn). Container Network Interface — networking (Calico, Cilium, Flannel). Container Runtime Interface — runtimes (containerd, CRI-O). Это infrastructure plugins, не application extensions.
Device pluginsDevice Plugin API — для exposing hardware resources в кластере: NVIDIA GPU, AMD GPU, RDMA NICs, FPGA, TPU. kubelet регистрирует devices, scheduler учитывает их в resources.requests.

Decision tree: какой механизм для какой задачи

ЗадачаМеханизмПример инструмента
Управлять stateful-приложением в K8s (БД, message broker, ML platform)Operator (CRD + controller)CloudNative-PG, Strimzi, KubeRay
Автоматизировать TLS-сертификатыOperatorcert-manager
GitOps (declarative deploy из Git)OperatorArgoCD, Flux
Service meshOperator + sidecar injection (mutating webhook)Istio, Linkerd
Enforce policy при creation (require labels, deny :latest, etc)Admission webhook или ValidatingAdmissionPolicyKyverno, OPA Gatekeeper, VAP
Pod Security StandardsBuilt-in admission (PodSecurity)в kube-apiserver, namespace labels
Image verification (cosign signatures)Admission webhook или OperatorKyverno (verifyImages), Sigstore Policy Controller
Sidecar injectionMutating webhookIstio, Linkerd, OpenTelemetry Operator
Sync secrets из external store (Vault, AWS SM)OperatorExternal Secrets Operator, Vault Agent Injector
Provisioning cloud-ресурсов через K8s APIOperatorCrossplane, AWS Controllers for K8s (ACK)
Custom metrics для HPAAggregated APIPrometheus Adapter, KEDA (Operator + AAS)
Custom storage backend для своего APIAggregated APIKubeVirt subresources, service catalog
New container runtimeCRI plugincontainerd, CRI-O, gVisor, Kata
New CNI pluginCNI pluginCalico, Cilium, Flannel, AWS VPC CNI
New storage driverCSI pluginEBS CSI, Ceph CSI, Longhorn
Expose GPU/FPGA в кластереDevice pluginNVIDIA Device Plugin, AMD GPU Plugin
Custom auth providerAuthentication webhookPinniped, dex (через OIDC), кастомные SSO
Custom RBAC engineAuthorization webhookOPA через webhook (вместо Gatekeeper), Pomerium

Discovery: что установлено в кластере

Все extension механизмы оставляют следы в API server discovery — kubectl api-resources показывает всё:

# Полный список — built-in + CRDs + aggregated
kubectl api-resources

# Только CRDs
kubectl get crd

# Только определённая group (всё в этой group — либо built-in, либо CRD, либо AAS)
kubectl api-resources --api-group=cert-manager.io
kubectl api-resources --api-group=metrics.k8s.io

# Webhook configurations
kubectl get mutatingwebhookconfigurations
kubectl get validatingwebhookconfigurations
kubectl get validatingadmissionpolicy
kubectl get validatingadmissionpolicybinding

# Aggregated APIs
kubectl get apiservice                 # status Available покажет, какие работают
kubectl get apiservice | grep -v Local # только aggregated

# CSI drivers
kubectl get csidriver
kubectl get csinode

# Device plugins регистрируются через kubelet — проверить через node capacity
kubectl describe node | grep -A 10 Capacity
# Capacity: nvidia.com/gpu: 4 — есть Device Plugin для NVIDIA

Почему extensibility — это killer feature K8s

Сравнение с предшественниками:

  • Apache Mesos — мощный планировщик, но extensibility — через Mesos frameworks (Marathon, Chronos), каждый — свой dialect. Нет единого API для third-party.
  • Docker Swarm — простой и закрытый. Extensions через Swarm plugins ограничены networking/storage.
  • HashiCorp Nomad — конкурент K8s по orchestration; имеет plugin system, но экосистема меньше.

Kubernetes выиграл потому, что дал universal extension API: любой vendor может написать operator под свой продукт, и пользователи получают единообразный интерфейс — kubectl get <my-thing>. Это превратило K8s в универсальный control plane: не «оркестратор контейнеров», а «декларативная платформа для любых ресурсов». Crossplane даже provisioning AWS S3 buckets через K8s API делает.

NOTE

Бизнес-эффект extensibility: на 2026 год CNCF landscape содержит более 1500 проектов, многие из которых — операторы или admission webhooks для специфичных доменов (ML, edge, security, compliance, finops). Без CRD-механизма ни одного из них не существовало бы в текущем виде.


CKAD task examples

Типичные задачи на экзамене (или production) по теме extension:

  1. Discover, что в кластере установлено:

    kubectl get crd
    kubectl api-resources | grep -v 'true' | head -50  # фильтр built-in
    kubectl get apiservice | grep -v Local
  2. Найти CR instances данного типа:

    kubectl get certificates -A
    kubectl get prometheuses -A
    kubectl get applications -n argocd
  3. Понять, почему CR не реконсилируется:

    # Описание CR — что в .status?
    kubectl describe certificate my-cert
    # Если status пустой / Pending → controller не работает
    kubectl get deployment -A | grep -i controller
    kubectl logs -n cert-manager deployment/cert-manager --tail=100
  4. Диагностика admission блока:

    # 'Error from server: admission webhook denied: ...' — ясно из текста
    kubectl create -f my-deployment.yaml
    # 'admission webhook "policy.kyverno.io" denied the request: require-labels'
  5. Diagnose metrics-server:

    kubectl top pod  # Error: Metrics API not available
    kubectl get apiservice v1beta1.metrics.k8s.io  # Available=False
    kubectl logs -n kube-system deployment/metrics-server

Killer-моменты

  • CRD + Operator покрывают 99% задач. Прежде чем рассматривать AAS / authn-webhook / etc — проверь, можно ли решить через CRD.
  • Все extension механизмы интегрированы в discovery. kubectl api-resources показывает built-in рядом с CRDs рядом с aggregated. Пользователю не нужно знать, как именно реализован resource.
  • Extensibility — это причина победы Kubernetes. Crossplane делает K8s universal control plane; cert-manager + Prometheus Operator + ArgoCD делают K8s self-contained platform. Без extension механизмов это был бы просто оркестратор контейнеров.
  • Расширения тоже могут сломать кластер. Webhook с failurePolicy: Fail и упавшим Pod-ом блокирует все matching requests. Сложный operator с багом может удалить нужный StatefulSet. К extensions нужно относиться как к production code.
  • CKAD требует discovery скиллы, не development. Знать команды kubectl get crd, kubectl api-resources, читать .status CR — всё, что нужно.

Проверка знанийKnowledge check
Команда выбирает: реализовать новый workflow для деплоя ML моделей. Какой extension механизм лучше всего подходит и почему?
ОтветAnswer
CRD + Operator. Создать CRD MLModel с полями spec.modelURI, spec.framework (pytorch/tf), spec.replicas, spec.resources.gpu — это desired state. Operator watches MLModel объекты и создаёт нужные built-in ресурсы: Deployment с GPU requests, Service для inference, HPA для autoscaling, ConfigMap с model config. Status.conditions показывает Ready/NotReady. Это classic operator pattern. Aggregated API не нужен — данные простые и помещаются в etcd. Admission webhook не нужен сам по себе (он мог бы дополнить — например, validate, что spec.framework только из whitelist), но это secondary. CSI/CNI совершенно не подходят — это infrastructure plugins. Operator — правильный ответ для 'declarative app management'.
Проверка знанийKnowledge check
После apply нового Deployment в namespace production получаешь error 'admission webhook denied: missing label cost-center'. Что это и куда смотреть?
ОтветAnswer
Сработал validating admission webhook, который проверяет, что Deployments в namespace production имеют label cost-center. Это policy enforcement (вероятно через Kyverno, OPA Gatekeeper, или custom ValidatingAdmissionPolicy). Чтобы найти источник: (1) kubectl get validatingwebhookconfigurations — список webhook configs, читать rules, какая соответствует Deployments. (2) kubectl get validatingadmissionpolicy и validatingadmissionpolicybinding — если используется VAP. (3) kubectl get clusterpolicy если Kyverno. Fix — добавить label cost-center: 'my-team' в metadata.labels Deployment и Pod template. Это типичный policy-driven workflow: компания хочет cost attribution, поэтому требует label у всех workloads.
Проверка знанийKnowledge check
В чём практическая разница между CRD-based extension и Aggregated API server для пользователя, который пишет kubectl команды?
ОтветAnswer
Никакой — кроме небольших нюансов. Discovery (kubectl api-resources, kubectl explain) работает одинаково. CRUD (get, create, delete, watch) — одинаково. RBAC применяется одинаково. Различия только в edge cases: (1) AAS может иметь нестандартные subresources, недоступные в CRD (например, kubectl virt console для KubeVirt VM). (2) AAS может падать независимо от kube-apiserver — kubectl get на эту group вернёт 503, в то время как CRD-based resources работают, пока kube-apiserver работает. (3) Производительность под высокой нагрузкой: AAS может быть оптимизированнее, но это редко заметно. С точки зрения user experience kubectl команды — extensions выглядят как built-in, и в этом сила: единый API, единый CLI.
Проверка знанийKnowledge check
Назови три причины, почему extensibility сделала Kubernetes стандартом, а не Mesos / Swarm / Nomad.
ОтветAnswer
(1) Универсальный API. CRD позволяет любому vendor написать operator под свой продукт, и пользователи получают единообразный kubectl-интерфейс. Это создало network effect: каждый новый operator укрепляет ecosystem. Mesos требовал писать framework — другой API на каждый use case. (2) Декларативная extension model. CRD — это declarative YAML, не imperative код. Это резко снижает barrier to entry: чтобы добавить простой ресурс не нужно писать API сервер с нуля. (3) Composable extensions. Operator + admission webhook + aggregated API + CNI/CSI работают независимо и комбинируются. cert-manager + Istio + ArgoCD ставятся на один кластер без конфликтов, потому что они operate на разных уровнях. Mesos / Swarm — closed model: extension только через утверждённые plugins, ограниченный scope, vendor lock-in.

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 5. Команда планирует deploy ML workflow платформы в K8s: declarative описание training jobs, inference deployments, model versions. Какой extension механизм подходит лучше всего?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5