- API-сервер в структуре Kubernetes
- Основные функции API-сервера:
- Версионная модель API
- Декларативный подход
- Общение с API Kubernetes
- Утилита kubectl: установка и использование
- Установка kubectl
- Базовые команды kubectl
- Работа с ресурсами и их метками
- Метки и аннотации
- Просмотр доступных ресурсов
- Практический пример: работа с нодами
- Альтернативные способы взаимодействия с API Kubernetes
- 1. Официальные библиотеки
- 2. Использование curl
- 3. Подсмотрим запросы kubectl
- 4. Проблемы доступа: ошибка 403
- 5. Использование файла kubeconfig
- Способы расширения API Kubernetes
- 1. Custom Resource Definitions (CRD)
- 2. Kubernetes API Aggregation Layer
- Сравнение CRD и API Aggregation Layer
- Заключение
API-сервер в структуре Kubernetes
API-сервер — это центральный компонент Kubernetes, выполняющий ключевую роль в управлении кластером. Он служит основным интерфейсом взаимодействия для всех компонентов системы и пользователей. Этот сервер принимает входящие запросы (например, на создание, изменение или удаление ресурсов), валидирует их, записывает данные в распределённое хранилище etcd и координирует взаимодействие между другими частями системы.
Основные функции API-сервера:
- Обработка запросов: API-сервер принимает REST-запросы от пользователей, а также от внутренних компонентов кластера, таких как контроллеры или kubelet.
- Хранение данных: Все объекты Kubernetes, включая конфигурации, статусы подов, деплойменты и сетевые политики, сохраняются в etcd через API-сервер.
- Координация: API-сервер отвечает за синхронизацию состояния между желаемым и фактическим состоянием кластера, передавая задачи контроллерам и другим компонентам.
Версионная модель API
Одной из важнейших особенностей API Kubernetes является строгая версионная модель. Kubernetes использует семантическое версионирование, обеспечивая совместимость API в рамках диапазона ±1 мажорной версии от текущей. Это позволяет пользователям и компонентам кластера работать без риска сбоев при обновлении.
API-сервер предоставляет два типа API для работы с объектами Kubernetes:
- Cluster-scoped (глобальные ресурсы):
- Эти объекты существуют на уровне всего кластера, не привязываясь к конкретному пространству имён (namespace).
- Примеры:
nodes
,persistentvolumes
(PVs). - Запросы:
GET /apis/GROUP/VERSION/RESOURCETYPE
— возвращает коллекцию объектов.GET /apis/GROUP/VERSION/RESOURCETYPE/NAME
— возвращает конкретный объект.
- Namespaced (локальные ресурсы):
- Эти объекты изолированы в рамках пространства имён (namespace), что позволяет создавать одинаковые имена ресурсов в разных namespace.
- Примеры:
pods
,services
,deployments
. - Запросы:
GET /apis/GROUP/VERSION/RESOURCETYPE
— возвращает ресурсы из всех namespaces.GET /apis/GROUP/VERSION/namespaces/NAMESPACE/RESOURCETYPE
— ресурсы только из указанного namespace.GET /apis/GROUP/VERSION/namespaces/NAMESPACE/RESOURCETYPE/NAME
— конкретный ресурс по имени в указанном namespace.
Декларативный подход
Для взаимодействия с API пользователи, как правило, используют декларативные манифесты — YAML- или JSON-документы, которые описывают желаемое состояние системы. Эти манифесты отправляются на исполнение в API-сервер, который принимает их, валидирует и передаёт другим компонентам для приведения кластера в соответствие с указанным состоянием.
Пример команды для отправки манифеста:
kubectl apply -f deployment.yaml
BashОбщение с API Kubernetes
Существует несколько способов взаимодействия с API Kubernetes:
- CLI-инструмент kubectl:
- Наиболее популярный способ управления кластером. Команды автоматически обращаются к API-серверу.
- Пример:
kubectl get pods
отправляет запросGET /api/v1/namespaces/default/pods
.
- Прямые REST-запросы:
- Использование инструментов вроде
curl
или библиотек для HTTP-запросов. - Пример:
- Использование инструментов вроде
curl -X GET \
-H "Authorization: Bearer <TOKEN>" \
-k https://<API_SERVER>:6443/api/v1/pods
Bash3. Клиентские библиотеки:
- Kubernetes предоставляет SDK для популярных языков программирования: Python, Go, Java, и др.
- Это упрощает разработку приложений, взаимодействующих с API.
4. Пользовательские контроллеры:
- Разработка контроллеров, которые следят за событиями API и выполняют действия, например, создают или удаляют ресурсы.
Утилита kubectl
: установка и использование
kubectl
— основной инструмент для взаимодействия с API Kubernetes. С его помощью администраторы и разработчики управляют ресурсами кластера, выполняют диагностику и получают актуальную информацию о состоянии инфраструктуры.
Установка kubectl
Установить kubectl
можно несколькими способами. Вот два популярных подхода: загрузка бинарного файла и установка через системный пакетный менеджер.
Установка через загрузку бинарного файла:
curl -LO "https://dl.k8s.io/release/v1.28.1/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
BashУстановка через менеджер пакетов (например, для Ubuntu):
sudo apt-get update && sudo apt-get install -y apt-transport-https
echo "deb [signed-by=/etc/apt/trusted.gpg.d/kubernetes-apt.gpg] https://packages.cloud.google.com/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-apt.gpg
sudo apt-get update
sudo apt-get install -y kubectl
BashПосле установки убедитесь, что утилита работает корректно:
kubectl version --client
BashБазовые команды kubectl
kubectl
предоставляет набор команд для управления ресурсами Kubernetes.
Вот основные из них:
Команда | Описание | Пример |
---|---|---|
kubectl get | Получает список объектов из API-сервера. По умолчанию отображается краткая информация. Формат вывода можно изменить с помощью флага -o . | kubectl get pods kubectl get nodes -o wide |
kubectl describe | Выводит подробную информацию об объекте, включая события и статус. | kubectl describe pod my-pod |
kubectl create | Создаёт объект на основе указанного манифеста. | kubectl create -f deployment.yaml |
kubectl apply | Применяет изменения к существующим объектам или создаёт новые, если они отсутствуют. | kubectl apply -f deployment.yaml |
kubectl delete | Удаляет объект по имени или на основании манифеста. | kubectl delete pod my-pod kubectl delete -f deployment.yaml |
kubectl edit | Открывает редактор для изменения объекта «на лету». Изменённый объект отправляется обратно на API-сервер. | kubectl edit deployment my-deployment |
kubectl explain | Показывает справочную информацию о ресурсе, включая описание доступных полей. | kubectl explain pod |
kubectl patch | Вносит частичные изменения в объект с помощью JSON-патчей. | kubectl patch deployment my-deployment -p '{"spec":{"replicas":3}}' |
kubectl replace | Полностью заменяет объект новым описанием, указанным в манифесте. | kubectl replace -f updated-deployment.yaml |
kubectl get с --show-labels | Отображает список объектов с их метками (labels). | kubectl get pods --show-labels |
kubectl get с фильтром -l | Фильтрует объекты по меткам (labels). | kubectl get pods -l app=my-app |
kubectl api-resources | Показывает все доступные типы ресурсов и их особенности (например, поддержка namespace, версии API и доступные действия). | kubectl api-resources |
kubectl logs | Выводит логи контейнера внутри пода. | kubectl logs my-pod kubectl logs my-pod -c my-container |
kubectl exec | Выполняет команду внутри контейнера, запущенного в поде. | kubectl exec -it my-pod -- /bin/bash |
Работа с ресурсами и их метками
Многие команды kubectl
позволяют работать с метками (labels
) для упрощения управления объектами.
Пример: просмотр меток на нодах с помощью флага --show-labels
:
kubectl get nodes --show-labels
BashДля фильтрации объектов по меткам используется флаг -l
:
kubectl get pods -l app=my-app
BashСоздание ресурса с манифеста:
apiVersion: v1
kind: Namespace
metadata:
name: development
labels:
environment: dev
YAMLПрименение манифеста:
kubectl apply -f namespace.yaml
BashПросмотр текущего состояния ресурса:
kubectl get namespace development -o yaml
BashЕсли ресурс уже существует, его можно модифицировать:
kubectl apply -f namespace.yaml
BashМетки и аннотации
- Метки (
labels
): используются для группировки, фильтрации и поиска объектов. Формат:ключ=значение
.
Пример:
kubectl get pods -l app=myapp
BashАннотации (annotations
): содержат метаинформацию для других инструментов. Формат аналогичен меткам, но используется для хранения дополнительных данных (например, о мониторинге или логировании).
Просмотр доступных ресурсов
Чтобы узнать, какие ресурсы поддерживаются в вашем кластере:
kubectl api-resources
Bash[***ДОБАВИТЬ КОД ВЫВОДА]
Подробное описание колонок:
- NAME: имя ресурса (например,
pods
). - SHORTNAMES: сокращения для команды (например,
po
вместоpods
). - APIVERSION: версия API.
- NAMESPACED: указывает, существует ли ресурс в рамках namespace.
- KIND: тип ресурса (например,
Pod
,Service
). - VERBS: доступные операции (
create
,get
,list
, и т.д.).
Практический пример: работа с нодами
- Получить список всех нод:
kubectl get nodes
Bash- Посмотреть подробную информацию о конкретной ноде:
kubectl describe node <node-name>
Bash- Фильтровать ноды по меткам:
kubectl get nodes -l node-role.kubernetes.io/control-plane=
BashАльтернативные способы взаимодействия с API Kubernetes
Помимо использования утилиты kubectl
, взаимодействие с API Kubernetes возможно через другие инструменты и методы, например, с помощью библиотек для программирования или прямых HTTP-запросов.
1. Официальные библиотеки
Kubernetes предоставляет множество клиентских библиотек для популярных языков программирования. Они позволяют интегрировать взаимодействие с Kubernetes в ваши приложения:
- Go:
client-go
— официальная библиотека для работы с Kubernetes. - Python: библиотека
kubernetes
из PyPI. - Java: библиотека
kubernetes-client
. - JavaScript/TypeScript: клиент
@kubernetes/client-node
.
Эти библиотеки позволяют разрабатывать сложные приложения, используя удобные абстракции для работы с объектами Kubernetes.
Список всех официальных и неофициальных библиотек можно найти в официальной документации.
2. Использование curl
Прямые HTTP-запросы к API Kubernetes возможны с помощью таких инструментов, как curl
или Postman
. Это полезно для автоматизации, отладки или глубокой интеграции.
Пример запроса:
curl -k -X GET \
-H "Accept: application/json" \
-H "Authorization: Bearer <TOKEN>" \
'https://<API_SERVER>:6443/api/v1/namespaces/development'
BashОбратите внимание:
- Флаг
-k
отключает проверку SSL-сертификатов (в тестовых средах это допустимо, но в продакшене нежелательно). - Токен (
<TOKEN>
) — это ключ доступа, который можно найти в секрете Kubernetes или в kubeconfig.
3. Подсмотрим запросы kubectl
Иногда хочется понять, как kubectl
формирует свои запросы к API-серверу.
Это можно сделать, добавив флаг -v
для включения детализированного лога:
kubectl get pods -v=8
BashПример вывода фрагмента лога:
I0218 19:47:51.589217 13865 loader.go:395] Config loaded from file: /home/user/.kube/config
PlaintextЛог указывает, что файл конфигурации для подключения к API находится по умолчанию в ~/.kube/config
.
Этот файл, называемый kubeconfig, содержит данные для аутентификации, такие как:
- Адрес API-сервера.
- Токены или сертификаты доступа.
- Настройки пространств имён.
4. Проблемы доступа: ошибка 403
Если попытаться выполнить запрос к API-серверу без корректной аутентификации, как в примере ниже:
curl -k -X GET -H "Accept: application/json" 'https://192.168.0.199:6443/api/v1/namespaces/development'
BashВы можете получить ответ:
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "namespaces \"development\" is forbidden: User \"system:anonymous\" cannot get resource \"namespaces\"...",
"reason": "Forbidden",
"code": 403
}
JSONПричина:
Запрос отправляется от имени анонимного пользователя (system:anonymous
), у которого нет прав на выполнение действий. Это связано с системой управления доступом RBAC (Role-Based Access Control).
Для выполнения успешного запроса вам нужно передать корректные учетные данные (например, токен аутентификации из kubeconfig).
5. Использование файла kubeconfig
Файл kubeconfig — это конфигурационный файл, который kubectl
и клиентские библиотеки используют для подключения к Kubernetes. Он содержит:
- URL API-сервера.
- Сертификаты и ключи для аутентификации.
- Настройки пространств имён и контекстов.
Пример kubeconfig:
apiVersion: v1
clusters:
- cluster:
certificate-authority: /path/to/ca.crt
server: https://192.168.0.199:6443
name: my-cluster
contexts:
- context:
cluster: my-cluster
user: my-user
name: my-context
current-context: my-context
users:
- name: my-user
user:
token: <TOKEN>
YAMLпо умолчанию файл находится в ~/.kube/config
.
Переменная окружения KUBECONFIG
позволяет указать другой путь:
export KUBECONFIG=/path/to/custom-config
BashСпособы расширения API Kubernetes
Kubernetes предлагает гибкие возможности для расширения стандартного API, что делает его подходящим для множества специфичных сценариев. Например, компании, такие как Zalando, разрабатывают собственные операторы для управления сложными системами, адаптируя их под Kubernetes. Один из таких примеров — postgres-operator, который позволяет развёртывать и управлять кластерами PostgreSQL «под ключ».
Существуют два основных механизма расширения API Kubernetes: Custom Resource Definitions (CRD) и API Aggregation Layer. Рассмотрим их подробнее.
1. Custom Resource Definitions (CRD)
CRD — это самый популярный способ добавления новых объектов в API Kubernetes. Он позволяет пользователям определять собственные типы ресурсов и управлять ими так же, как стандартными объектами Kubernetes.
Как это работает:
- Пользователь создаёт Custom Resource Definition (CRD) — описание нового типа ресурса.
- Kubernetes берёт на себя хранение и валидацию объектов, созданных на основе CRD.
- Пользовательский контроллер или оператор подписывается на события, связанные с этими объектами, и выполняет необходимые действия (например, развёртывание PostgreSQL-кластера).
Пример манифеста CR (Custom Resource):
apiVersion: databases.example.com/v1
kind: Postgresql
metadata:
name: example-database
spec:
replicas: 3
storageSize: 20Gi
YAMLПосле создания CRD можно использовать команду kubectl
для работы с этими объектами:
kubectl get customresourcedefinitions
BashЭтот механизм удобен для автоматизации сложных задач, таких как управление базами данных или настройка сетей.
2. Kubernetes API Aggregation Layer
API Aggregation Layer — это способ интеграции сторонних API-сервисов в Kubernetes. Он позволяет расширять функциональность API без добавления собственных CRD, путём регистрации новых API-групп и проксирования запросов к внешним сервисам.
Как это работает:
- Вы создаёте объект APIService, который описывает новую API-группу.
- Указываете, какой сервис будет обрабатывать запросы (например,
metrics-server
). - API-сервер Kubernetes перенаправляет запросы, адресованные зарегистрированной группе, на указанный сервис.
Пример манифеста APIService:
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1beta1.metrics.k8s.io
spec:
service:
name: metrics-server
namespace: kube-system
group: metrics.k8s.io
version: v1beta1
insecureSkipTLSVerify: true
groupPriorityMinimum: 100
versionPriority: 100
YAMLПосле регистрации новая API-группа становится доступной через kubectl
:
kubectl get apiservices
Bashпример вывода:
NAME | SERVICE | AVAILABLE | AGE |
---|---|---|---|
v1beta1.metrics.k8s.io | kube-system/metrics-server | True | 258d |
v1.authorization.k8s.io | Local | True | 258d |
v1.rbac.authorization.k8s.io | Local | True | 258d |
Сравнение CRD и API Aggregation Layer
Характеристика | CRD | API Aggregation Layer |
---|---|---|
Сложность настройки | Простая, достаточно создать CRD | Сложнее, требует настройки APIService и внешнего сервиса |
Хранение данных | Хранится в etcd | Управляется внешним сервисом |
Гибкость | Подходит для создания объектов с заранее известной структурой | Подходит для сложных и динамических API |
Примеры использования | Управление кластерами баз данных, сетевыми ресурсами | Интеграция внешних API, таких как metrics-server |
Заключение
Подведём итоги:
- Работа с Kubernetes сводится к написанию манифестов — декларативных описаний инфраструктуры, которые передаются на обработку API-серверу Kubernetes (kube-apiserver).
- Типы объектов в API:
- Cluster-объекты (глобальные) существуют на уровне всего кластера и не зависят от namespace.
- Namespaced-объекты локализованы внутри определённого namespace, обеспечивая изоляцию и уникальность ресурсов.
- Namespace — это средство логической изоляции, позволяющее создавать отдельные пространства для групп объектов, что удобно для разграничения окружений (например, dev, staging, prod).
- Общение с API:
- Через утилиту kubectl, которая упрощает выполнение запросов к API.
- Напрямую с помощью инструментов, таких как curl, для более низкоуровневого взаимодействия.
- Расширение стандартного API:
- CRD (Custom Resource Definitions) позволяет создавать пользовательские ресурсы и контроллеры для них.
- API Aggregation Layer предоставляет возможность интеграции внешних сервисов с API Kubernetes.
- Система контроля доступа: Kubernetes имеет мощный механизм управления доступом на основе ролей (RBAC), который мы рассмотрим в следующем блоке.