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
- CRD + Custom Controller (Operator) — 99% случаев. Декларативный новый kind в API + Pod-controller, реконсилирующий состояние.
- Aggregated API server — отдельный API server рядом с kube-apiserver. Для случаев, когда нужно custom storage или нестандартные subresources.
- Admission webhooks (mutating и validating) — middleware между authn/authz и записью в etcd. Для validation/mutation на admission time.
- Authentication webhooks — custom authentication (token validators). Если корпоративная identity не покрывается built-in OIDC.
- Authorization webhooks — custom authorization (Sentinel, OPA-style RBAC поверх external policy engine).
- CSI / CNI / CRI / Device plugins — расширения для storage drivers, network plugins, container runtimes, hardware devices (GPU, FPGA, RDMA).
Decision tree: какой механизм для какой задачи
| Задача | Механизм | Пример инструмента |
|---|---|---|
| Управлять stateful-приложением в K8s (БД, message broker, ML platform) | Operator (CRD + controller) | CloudNative-PG, Strimzi, KubeRay |
| Автоматизировать TLS-сертификаты | Operator | cert-manager |
| GitOps (declarative deploy из Git) | Operator | ArgoCD, Flux |
| Service mesh | Operator + sidecar injection (mutating webhook) | Istio, Linkerd |
Enforce policy при creation (require labels, deny :latest, etc) | Admission webhook или ValidatingAdmissionPolicy | Kyverno, OPA Gatekeeper, VAP |
| Pod Security Standards | Built-in admission (PodSecurity) | в kube-apiserver, namespace labels |
| Image verification (cosign signatures) | Admission webhook или Operator | Kyverno (verifyImages), Sigstore Policy Controller |
| Sidecar injection | Mutating webhook | Istio, Linkerd, OpenTelemetry Operator |
| Sync secrets из external store (Vault, AWS SM) | Operator | External Secrets Operator, Vault Agent Injector |
| Provisioning cloud-ресурсов через K8s API | Operator | Crossplane, AWS Controllers for K8s (ACK) |
| Custom metrics для HPA | Aggregated API | Prometheus Adapter, KEDA (Operator + AAS) |
| Custom storage backend для своего API | Aggregated API | KubeVirt subresources, service catalog |
| New container runtime | CRI plugin | containerd, CRI-O, gVisor, Kata |
| New CNI plugin | CNI plugin | Calico, Cilium, Flannel, AWS VPC CNI |
| New storage driver | CSI plugin | EBS CSI, Ceph CSI, Longhorn |
| Expose GPU/FPGA в кластере | Device plugin | NVIDIA Device Plugin, AMD GPU Plugin |
| Custom auth provider | Authentication webhook | Pinniped, dex (через OIDC), кастомные SSO |
| Custom RBAC engine | Authorization webhook | OPA через 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 делает.
Бизнес-эффект extensibility: на 2026 год CNCF landscape содержит более 1500 проектов, многие из которых — операторы или admission webhooks для специфичных доменов (ML, edge, security, compliance, finops). Без CRD-механизма ни одного из них не существовало бы в текущем виде.
CKAD task examples
Типичные задачи на экзамене (или production) по теме extension:
-
Discover, что в кластере установлено:
kubectl get crd kubectl api-resources | grep -v 'true' | head -50 # фильтр built-in kubectl get apiservice | grep -v Local -
Найти CR instances данного типа:
kubectl get certificates -A kubectl get prometheuses -A kubectl get applications -n argocd -
Понять, почему 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 -
Диагностика admission блока:
# 'Error from server: admission webhook denied: ...' — ясно из текста kubectl create -f my-deployment.yaml # 'admission webhook "policy.kyverno.io" denied the request: require-labels' -
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, читать.statusCR — всё, что нужно.