Олег Марков
Интеграция Python и Kubernetes
Введение
В последние годы Kubernetes стал стандартом для управления контейнерами в облачных инфраструктурах. Умение управлять и автоматизировать Kubernetes средствами Python дает разработчикам и главным инженерам уникальные возможности: от автоматизации стоек CI/CD до оркестрации масштабных питоновских сервисов. Я покажу, как вы можете использовать Python для взаимодействия с кластерами Kubernetes, расскажу об основных клиентских библиотеках, подходах к аутентификации, примерах кода и автоматизации жизненного цикла приложений.
Почему интеграция Python и Kubernetes востребована
Современные Python-разработчики часто сталкиваются с Kubernetes — будь то в стартапе, крупном бизнесе или разработке микросервисов. Интеграция Python и Kubernetes позволяет:
- Разворачивать приложения и сервисы через Python-скрипты;
- Автоматизировать масштабирование, обновление и мониторинг приложений;
- Создавать собственные контроллеры, операторы и инструменты DevOps;
- Внедрять динамическое управление инфраструктурой на основе бизнес-логики.
Теперь давайте шаг за шагом разберём, какие инструменты есть для интеграции, как их настроить и использовать.
Основные способы интеграции: обзор инструментов
В Python существует несколько подходов к управлению Kubernetes:
- Использование официальной библиотеки
kubernetes
; - Высокоуровневые фреймворки и абстракции (например,
kopf
,k8s-client
); - Прямые вызовы REST API Kubernetes (c помощью
requests
,httpx
и т.д.); - Работа с Helm-чартами и инфраструктурой как кодом из Python.
Я подробно покажу, как использовать клиентскую библиотеку kubernetes
, расскажу о настройках, о работе с ресурсами, а также о других подходах, где Python связывается с Kubernetes через API или сторонние инструменты.
Официальная клиентская библиотека для Python
Самый прямой способ взаимодействия с Kubernetes из Python — это официальный пакет kubernetes
. Он позволяет работать с любыми объектами кластера (Pod, Service, Deployment, Secret и пр.), запускать задачи, управлять конфигами и обновлять ресурсы.
Установить пакет можно через pip:
pip install kubernetes
Подключение к кластеру
Давайте начнем с самого простого случая — если ваш скрипт запускается внутри пода Kubernetes, а сервис-аккаунт уже имеет нужные права, то не требуется дополнительной настройки. Код будет выглядеть так:
from kubernetes import client, config
# Подгружаем настройки из окружения Kubernetes (работает внутри пода)
config.load_incluster_config()
# Получаем клиент для работы с API
v1 = client.CoreV1Api()
Если вы запускаете код локально с вашей машины, нужен kubeconfig-файл с настройками доступа (обычно находится в ~/.kube/config
). Вот так это реализовать:
from kubernetes import client, config
# Загрузка конфигурации из локального kubeconfig
config.load_kube_config()
# Создаём клиент CoreV1Api для управления объектами "ядра"
v1 = client.CoreV1Api()
Получение списка подов
Смотрите, я покажу вам, как получить все поды в определённом namespace:
from kubernetes import client, config
config.load_kube_config()
v1 = client.CoreV1Api()
# Получение всех подов в namespace "default"
pods = v1.list_namespaced_pod("default")
for pod in pods.items:
print(pod.metadata.name) # Выводим имена подов
Создание пода
Теперь вы увидите пример, как создать под через Python-скрипт. Такой способ полезен для быстрой автоматизации развертывания сервисов, тестов или микросервисов.
from kubernetes import client, config
config.load_kube_config()
v1 = client.CoreV1Api()
# Описание пода
pod_manifest = {
"apiVersion": "v1",
"kind": "Pod",
"metadata": {"name": "nginx-python"},
"spec": {
"containers": [{
"name": "nginx",
"image": "nginx:1.21",
"ports": [{"containerPort": 80}]
}]
}
}
# Создание пода в namespace "default"
resp = v1.create_namespaced_pod(body=pod_manifest, namespace="default")
print("Под создан:", resp.metadata.name)
Здесь вы определяете простой манифест и запускаете под через API.
Обновление и удаление ресурсов
Такая интеграция позволяет модифицировать объекты Kubernetes. Например, чтобы удалить под:
from kubernetes import client, config
config.load_kube_config()
v1 = client.CoreV1Api()
# Удаляем под "nginx-python" в namespace default
v1.delete_namespaced_pod("nginx-python", namespace="default")
print("Под удален")
Вы можете применять любые действия, доступные через стандартный Kubernetes API: обновлять, патчить, читать, удалять объекты.
Пример — создание Deployment и сервисов
Я предлагаю рассмотреть развёртывание "Production-ready" приложения с помощью Python.
from kubernetes import client, config
config.load_kube_config()
apps_v1 = client.AppsV1Api()
core_v1 = client.CoreV1Api()
deployment_manifest = {
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {"name": "myapp"},
"spec": {
"replicas": 2,
"selector": {"matchLabels": {"app": "myapp"}},
"template": {
"metadata": {"labels": {"app": "myapp"}},
"spec": {
"containers": [{
"name": "myapp-container",
"image": "python:3.11",
"command": ["python", "-m", "http.server", "8080"],
"ports": [{"containerPort": 8080}]
}]
}
}
}
}
# Создаем Deployment
apps_v1.create_namespaced_deployment(namespace="default", body=deployment_manifest)
# Создаем Service для доступа к приложению
service_manifest = {
"apiVersion": "v1",
"kind": "Service",
"metadata": {"name": "myapp-service"},
"spec": {
"selector": {"app": "myapp"},
"ports": [{
"protocol": "TCP",
"port": 8080,
"targetPort": 8080
}]
}
}
core_v1.create_namespaced_service(namespace="default", body=service_manifest)
В этом примере вы автоматизируете развёртывание двух контейнеров с приложением на Python и открываете к ним доступ через сервис.
Работа с секретами и конфигами
Зачастую для безопасного хранения данных нужны Secrets (например, пароли, ключи API). Вот пример создания нового секрета:
from kubernetes import client, config
config.load_kube_config()
v1 = client.CoreV1Api()
# Преобразуем пароль в base64 (Kubernetes требует этого)
import base64
password = base64.b64encode("MySecurePassword123".encode()).decode()
secret_manifest = {
"apiVersion": "v1",
"kind": "Secret",
"metadata": {"name": "mysecret"},
"type": "Opaque",
"data": {
"password": password # Значение уже закодировано в base64
}
}
v1.create_namespaced_secret(namespace="default", body=secret_manifest)
print("Secret создан")
Вы можете так же читать и обновлять секреты:
secret = v1.read_namespaced_secret("mysecret", "default")
print(secret.data)
Использование асинхронного клиента
Если у вас много запросов к API Kubernetes, вы можете использовать асинхронные клиенты, чтобы повысить производительность. Один из примеров — библиотека kubernetes_asyncio
:
pip install kubernetes-asyncio
А вот как это выглядит в коде:
import asyncio
from kubernetes_asyncio import client, config
async def main():
# Загружаем настройки
await config.load_kube_config()
v1 = client.CoreV1Api()
# Получаем список подов
pods = await v1.list_namespaced_pod("default")
for pod in pods.items:
print(pod.metadata.name)
asyncio.run(main())
Асинхронный клиент полезен для утилит, которые часто делают множество одновременных запросов.
Реализация кастомной логики: Operators и Controllers на Python
Для расширения Kubernetes часто используют кастомные контроллеры или operators — они "слушают" изменения в кластере и выполняют свою бизнес-логику. В Python это удобно реализовывать через фреймворк kopf
.
Установите kopf:
pip install kopf
Создайте основной файл оператора, например, operator.py
:
import kopf
# Обработчик создания кастомного ресурса MyResource
@kopf.on.create('example.com', 'v1', 'myresources')
def create_fn(spec, name, logger, **kwargs):
logger.info(f"Создан объект: {name}")
# Здесь пишите свою логику управления
# Запуск оператора
if __name__ == '__main__':
kopf.run()
Этот подход позволяет автоматизировать логику при появлении, удалении, обновлении объектов.
Аутентификация и безопасность
При работе с API Kubernetes важно правильно аутентифицироваться. Вот ключевые подходы:
- Внутри пода — используются сервис-аккаунты и автоматически монтируемые токены;
- Локально — используются конфигурационные файлы kubeconfig, а для доступа к кластерам в облаках (например, GKE, EKS, AKS) применяются специфические механизмы авторизации;
- При доступе к API по внешнему адресу обязательно использовать TLS/SSL и ограничивать права пользователя с помощью RBAC.
Давайте рассмотрим частую ошибку — неправильные права сервис-аккаунта. Если ваш Python-скрипт возвращает ошибку доступа — стоит проверить RBAC-политики.
YAML-права для пода, которому разрешено читать поды в default:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: py-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: py-reader-binding
namespace: default
subjects:
- kind: ServiceAccount
name: default
namespace: default
roleRef:
kind: Role
name: py-reader
apiGroup: rbac.authorization.k8s.io
Создайте такой Role и RoleBinding, чтобы дать вашему поду необходимые права.
Вызовы REST API напрямую из Python
Бывает ситуации, когда не хочется подключать клиентские библиотеки. Для минималистичных задач можно обращаться к Kubernetes API "вручную".
Пример получения подов через REST:
import requests
import os
# Токен и endpoint берём из переменных окружения или секретов Kubernetes
with open('/var/run/secrets/kubernetes.io/serviceaccount/token', 'r') as token_file:
token = token_file.read()
api_server = os.environ.get('KUBERNETES_SERVICE_HOST')
url = f'https://{api_server}/api/v1/namespaces/default/pods'
headers = {
'Authorization': f'Bearer {token}',
}
response = requests.get(url, headers=headers, verify='/var/run/secrets/kubernetes.io/serviceaccount/ca.crt')
print(response.json())
Этот способ требует настройки SSL и правильных токенов, но работает даже без внешних библиотек.
Работа с Helm из Python
Иногда вам нужно управлять не отдельными объектами, а целыми приложениями, описанными Helm-чартами. Для этого существуют Python-библиотеки (pyhelm
, subprocess
с вызовом helm
и др.). Наиболее универсальный — явно запускать helm через subprocess.
Пример установки Helm Release:
import subprocess
release_name = "my-python-app"
chart = "bitnami/nginx"
# Установка релиза через subprocess
subprocess.run([
"helm", "install", release_name, chart
], check=True)
Такой способ упрощает автоматизацию процесса деплоя и обновления приложений через Python.
Логирование, слежение и мониторинг
В большинстве производственных сценариев требуется собирать логи из приложений в кластере. С помощью Python легко подключать сложенную логику обработки логов:
- Вы можете через клиентскую библиотеку получать логи с подов:
from kubernetes import client, config
config.load_kube_config()
v1 = client.CoreV1Api()
logs = v1.read_namespaced_pod_log("nginx-python", "default")
print(logs)
- Для мониторинга состояния подов — периодически опрашивайте состояние и отправляйте уведомления или метрики в Grafana, Prometheus, Loki и др.
Основные паттерны автоматизации DevOps
Интеграция Python и Kubernetes раскрывает полный потенциал DevOps:
- Автоматизация CI/CD пайплайнов (запуск миграций, деплой, откаты);
- Масштабирование и rolling update приложений прямо из скриптов;
- Динамическое управление секретами на лету;
- Поддержка self-healing инфраструктуры (автовосстановление, алерты).
Использование Python в качестве шаблонизатора манифестов
Динамическая генерация Kubernetes-манифестов на Python становится всё популярнее при сложной инфраструктуре:
import yaml
deployment = {
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {"name": "python-app"},
"spec": {
"replicas": 3,
"selector": {"matchLabels": {"app": "python-app"}},
"template": {
"metadata": {"labels": {"app": "python-app"}},
"spec": {
"containers": [{
"name": "app",
"image": "python:3.11"
}]
}
}
}
}
with open("deployment.yaml", "w") as file:
yaml.dump(deployment, file)
Вы можете интегрировать такой подход с CI/CD или любым пайплайном.
Возможности интеграции Python и Kubernetes
Вот ключевые задачи, которые можно автоматизировать:
- Управление жизненным циклом приложений (развёртывания, обновления, масштабирование, удаление);
- Работа с секретами, переменными среды, конфигамапами;
- Реализация кастомных операторов и событийных систем;
- Мониторинг состаяния кластера и отправка алертов;
- Динамическое создание и удаление namespace, storage, ingress-правил;
- Интеграция с внешними API и сервисами (Service Mesh, CI/CD инструменты, облачные хранилища).
Интеграция расширяет возможности как простых Python-разработчиков, так и DevOps-инженеров, объединяя лучшие подходы автоматизации в одном языке.
Заключение
Интеграция Python и Kubernetes — мощный инструмент автоматизации и управления кластерной инфраструктурой. Вы узнали, как с помощью официальных клиентских библиотек и сторонних инструментов можно создавать, модифицировать и удалять любые объекты в кластере, управлять секретами, сервисом, конфигурациями и автоматизировать рабочие процессы. Освоение этого подхода открывает доступ к широкому спектру задач: от рутинной выдачи деплоев до создания продвинутых операторов и сервисов с глубокой бизнес-логикой.
Работа с Kubernetes из Python находит применение в CI/CD, DevOps-оркестрации, мониторинге, автоматическом реагировании на события, автоматизации тестирования, управлении секретами и при построении кластеров любой сложности. Используйте клиентские библиотеки или REST API для своих задач, создавайте собственные плагины и операторы — и ваш опыт взаимодействия с Kubernetes станет намного продуктивнее.
Частозадаваемые технические вопросы по теме статьи и ответы на них
Как отладить проблемы с доступом при запуске Python-скрипта в кластере Kubernetes?
Частая причина — неправильные права у ServiceAccount. Проверьте, какой сервис-аккаунт привязан к вашему поду (через pod.spec.serviceAccountName и описания Role/RoleBinding). Используйте команду kubectl describe для пода и RBAC-объектов. Если прав нет — добавьте нужные Role и RoleBinding (пример в статье выше).
Как использовать kubectl из Python-скрипта?
Если вам удобнее вызывать kubectl напрямую, используйте модуль subprocess:
import subprocess
result = subprocess.run(["kubectl", "get", "pods", "-o", "json"], capture_output=True)
print(result.stdout.decode())
Следите за обработкой ошибок, и убедитесь, что переменные окружения (kubeconfig, контекст) заданы верно.
Как можно "мониторить" события в кластере из Python?
Для этого используйте watch-методы клиентской библиотеки:
from kubernetes import client, config, watch
config.load_kube_config()
v1 = client.CoreV1Api()
w = watch.Watch()
for event in w.stream(v1.list_namespaced_pod, "default"):
print("Тип события:", event['type'], "Имя пода:", event['object'].metadata.name)
Как деплоить свои Custom Resource Definitions (CRD) через Python?
Сначала создайте CRD-манифест и примените его через клиентский api:
from kubernetes import client, config
config.load_kube_config()
apiextensions_v1 = client.ApiextensionsV1Api()
with open("crd.yaml") as f:
crd = yaml.safe_load(f)
apiextensions_v1.create_custom_resource_definition(crd)
Далее можете работать с ними через k8s-client CustomObjectsApi.
Может ли Python взаимодействовать с Kubernetes через API-server, если у кластера самоподписанные сертификаты?
Да. Для этого используйте параметр verify со ссылкой на ваш CA (например, /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
) или отключите SSL-проверку (только для отладки). Но для продакшена настоятельно рекомендуется использовать сертифицированные CA и безопасные соединения.
Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!
Kubernetes — часть карты развития DevOps
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Kubernetes
Лучшие курсы по теме

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