Олег Марков
Руководство по работе с Kubernetes API
Введение
Kubernetes стал стандартом для управления контейнеризированными приложениями. Его сила во многом строится на мощном API, через который вы управляете всеми ресурсами и процессами внутри кластера. Если вы хотите автоматизировать развертывания, писать собственные контроллеры или интегрироваться с внешними сервисами, создание запросов к Kubernetes API — ключевой навык.
В этой статье я покажу, как устроен Kubernetes API, какие методы работы с ним доступны, как правильно аутентифицироваться и авторизоваться, а также как выполнять основные действия с объектами Kubernetes. Примеры будут с пояснениями — так вы сможете быстро начать работать с API на практике и построить уверенное понимание фундаментальных моментов.
Как устроен Kubernetes API
Основы API серверов Kubernetes
Вся коммуникация и управление объектами кластера идет через компонент kube-apiserver. Этот сервер принимает HTTP/HTTPS-запросы, аутентифицирует, авторизует, валидирует и изменяет состояние кластера. Это касается всех объектов — подов, сервисов, deployments и т.д.
API организовано по REST-принципам — это значит, что вы обращаетесь к ресурсам (например, Pods, Deployments, Services) через стандартные HTTP методы: GET, POST, PUT, PATCH, DELETE.
Структура URL-адресов Kubernetes API:
/api/v1/
— базовый API, сюда входят core-объекты/apis/<group>/<version>/
— расширенные ресурсы (например, CRD, ресурсы высокого уровня)
Пример:GET /api/v1/namespaces/default/pods
— получить все Pods в неймспейсе default.
Версионирование API
Kubernetes поддерживает одновременное существование нескольких версий API одного объекта. Версии бывают:
v1alpha1
— экспериментальныеv1beta1
— тестовые, возможны измененияv1
— стабильные
Рекомендуется использовать stable-версии для production-решений.
OpenAPI спецификация
Все ресурсы и методы описаны в OpenAPI спецификации. Описания API и доступных объектов можно получить через GET /openapi/v2
или сформировать с помощью встроенного Swagger UI через dashboard.
Как обращаться к Kubernetes API
Прямая работа с API через curl
Вы можете посылать HTTP-запросы напрямую:
curl --header "Authorization: Bearer $TOKEN" \
--cacert /path/to/ca.crt \
https://<api-server>:6443/api/v1/namespaces/default/pods
--header
— указывает токен для аутентификации--cacert
— путь к CA сертификату кластера (он нужен если API сервер использует самоподписанный сертификат)
Получить токен можно из ~/.kube/config файла или через сервисные аккаунты.
Использование kubectl для работы с API
kubectl
— основной CLI-инструмент, он формирует и отправляет запросы к API серверу под капотом.
Пример получения ресурсов:
kubectl get pods -n default -o json
Пример прямого вызова API:
kubectl get --raw /api/v1/namespaces/default/pods
kubectl proxy
Вы можете запустить локальный прокси-сервер, который берет на себя заботу об авторизации:
kubectl proxy
Теперь запросы можно отправлять на http://localhost:8001
.
Клиентские библиотеки для различных языков
Для большинства популярных языков есть официальные или поддерживаемые клиентские библиотеки Kubernetes.
Go-клиент
Go-biblioteka — стандарт де-факто для написания операторов/контроллеров:
// Импортируем необходимые пакеты
import (
"context"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
// Загружаем kubeconfig
config, _ := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")
// Создаем клиента
clientset, _ := kubernetes.NewForConfig(config)
// Получаем список подов
pods, _ := clientset.CoreV1().Pods("default").List(context.TODO(), metav1.ListOptions{})
fmt.Printf("Поды: %v\n", pods.Items) // Выводим список
}
Python-клиент
Смотрите, как можно получить список подов на Python:
from kubernetes import client, config
# Загружаем конфиг из стандартного расположения
config.load_kube_config()
v1 = client.CoreV1Api()
# Получаем список подов в default namespace
ret = v1.list_namespaced_pod(namespace="default")
for pod in ret.items:
print(pod.metadata.name) # Выводим имена подов
Другие языки
Есть также поддержка для Java, JavaScript/TypeScript, Ruby, .NET и др. Все ссылки на библиотеки размещены в официальной документации.
Аутентификация и авторизация
Способы аутентификации
Kubernetes поддерживает:
- Сертификаты клиента (X.509)
- Токены сервисных аккаунтов
- OpenID Connect (OIDC)
- Webhook-аутентификацию
На практике чаще всего используют kubeconfig с токеном или сертификатом. Для подов в кластере — сервисные аккаунты.
Как получить токен сервисного аккаунта:
- Создайте сервисный аккаунт
kubectl create serviceaccount my-sa
- Привяжите роль (пример: admin в текущем неймспейсе):
kubectl create rolebinding my-sa-binding --clusterrole=admin --serviceaccount=default:my-sa
- Извлеките токен:
kubectl -n default get secret $(kubectl -n default get sa/my-sa -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode
Теперь этот токен можно использовать в заголовке Authorization.
Авторизация через RBAC
RBAC (Role-Based Access Control) — механизм, который определяет, к каким ресурсам и в каких namespaces может обращаться пользователь или сервисный аккаунт.
Пример Manifest'а Role: ```yaml kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: read-pods rules:
- apiGroups: [""] resources: ["pods"] verbs: ["get", "list"] ```
Пример RoleBinding: ```yaml kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-pods-binding namespace: default subjects:
- kind: User name: сервисный_аккаунт roleRef: kind: Role name: read-pods apiGroup: rbac.authorization.k8s.io ```
CRUD-операции с объектами через API
Получение объектов (GET)
Получить список подов:
GET /api/v1/namespaces/default/pods
или через curl:
curl --header "Authorization: Bearer $TOKEN" \
--cacert /path/to/ca.crt \
https://<api-server>:6443/api/v1/namespaces/default/pods
Создание объектов (POST)
Создать под c помощью curl:
curl --header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--cacert /path/to/ca.crt \
--data-binary @pod.yaml \
-X POST https://<api-server>:6443/api/v1/namespaces/default/pods
Пример pod.yaml: ```yaml apiVersion: v1 kind: Pod metadata: name: nginx-demo spec: containers:
- name: nginx image: nginx:latest ```
Обновление объекта (PUT/PATCH)
PUT
заменяет весь объект (полный манифест)PATCH
— частичное изменение
Пример PATCH (JSONPatch):
curl --header "Content-Type: application/json-patch+json" \
--header "Authorization: Bearer $TOKEN" \
--cacert /path/to/ca.crt \
--request PATCH \
--data '[{"op": "replace", "path": "/spec/containers/0/image", "value": "nginx:1.21"}]' \
https://<api-server>:6443/api/v1/namespaces/default/pods/nginx-demo
Удаление объектов (DELETE)
Удалить pod:
curl --header "Authorization: Bearer $TOKEN" \
--cacert /path/to/ca.crt \
-X DELETE https://<api-server>:6443/api/v1/namespaces/default/pods/nginx-demo
Использование Watch для отслеживания изменений
Kubernetes API поддерживает параметр watch
, который позволяет отслеживать изменения в реальном времени.
Пример (curl):
curl --header "Authorization: Bearer $TOKEN" \
--cacert /path/to/ca.crt \
'https://<api-server>:6443/api/v1/namespaces/default/pods?watch=true'
Вы будете получать события (ADDED
, MODIFIED
, DELETED
) для объектов.
В большинстве случаев для production-задач используют клиентские библиотеки, потому что вручную парсить stream-ответы неудобно.
Практические советы и best practices
Используйте client libraries
Если вы строите автоматизацию или пишете свои контроллеры — клиентские библиотеки гораздо удобнее, чем ручной curl. Они обрабатывают аутентификацию и автоматически повторяют запросы при ошибках.
Старайтесь минимизировать права
Выдавайте только необходимые permissions сервисным аккаунтам — используйте минимальные роли и отдельные namespaces.
Всегда валидируйте сертификаты
Не отключайте проверку сертификатов даже в тестах — это снижает уровень безопасности.
Используйте запросы c ограничениями по полям
Добавляйте фильтры (labelSelector
, fieldSelector
), если в namespace много объектов, чтобы избежать скачивания лишних данных.
Пример:
kubectl get pods --selector=app=nginx
// или через API:
GET /api/v1/namespaces/default/pods?labelSelector=app=nginx
Применяйте versioning (resourceVersion)
Чтобы избежать race condition при обновлении, используйте поле metadata.resourceVersion
при PATCH/PUT запросах.
Общие ошибки при работе с Kubernetes API
- Неверные права (RBAC) — проверяйте, что ваш токен или сервисный аккаунт имеет нужные permissions
- Ошибки при обновлении — используйте правильный тип запроса (PUT vs PATCH)
- Получение устаревших данных — если используете watch, корректно обрабатывайте field
resourceVersion
Полезные утилиты и инструменты
- kubectl-tree — просмотр зависимостей объектов
- k9s — терминальное UI для кластеров
- Kubernetes Dashboard — web-интерфейс
Заключение
Работа с Kubernetes API дает большую гибкость для автоматизации и расширения возможностей кластеров. Вы теперь знаете основы организации API Kubernetes, умеете аутентифицироваться, выполнять CRUD-операции с объектами и использовать клиентские библиотеки для Go и Python. Используя этот опыт, вы сможете строить интеграции, автоматизировать задачи и создавать собственные инструменты управления кластером под свои задачи.
Частозадаваемые технические вопросы по теме статьи и ответы на них
1. Как ограничить скорость запросов к Kubernetes API, чтобы не получить ошибку Too Many Requests?
Для ограничения запросов используйте параметры rate limiting в клиентских библиотеках. Например, в Go при создании rest.Config
можно установить поля QPS
(запросов в секунду) и Burst
. Для kubectl используйте флаг --request-timeout
.
2. Как получить список CRD (Custom Resource Definitions) через API?
Можно сделать запрос:GET /apis/apiextensions.k8s.io/v1/customresourcedefinitions
или:
kubectl get crd
Это вернет все определенные CRD в вашем кластере.
3. Как смотреть логи контейнера через API?
Логи контейнера можно получить через запрос:GET /api/v1/namespaces/{namespace}/pods/{pod}/log
Вы также можете указать контейнер и лимитировать количество строк с помощью query-параметров, например:
/api/v1/namespaces/default/pods/my-pod/log?container=my-container&tailLines=50
4. Как тестировать работу с API локально, не имея доступа к production кластеру?
Разверните kind или minikube — это легкие локальные кластеры Kubernetes. После этого работайте с API по стандартным методам, используя локальный kubeconfig.
5. Как разрешить доступ к API только определенным приложениям?
Создайте сервисные аккаунты с минимально необходимыми правами (через Role и RoleBinding), а их токены используйте только в нужных приложениях. Отключите анонимный доступ и следите за политиками network policies, чтобы ограничить доступ к API server на уровне сети.
Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!
Kubernetes — часть карты развития DevOps
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Kubernetes
Лучшие курсы по теме

Kubernetes и Helm
Антон Ларичев
Docker и Ansible
Антон Ларичев