логотип PurpleSchool
логотип PurpleSchool

Интеграция 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 и безопасные соединения.

Стрелочка влевоРуководство по использованию Spring в KubernetesРабота с YAML в KubernetesСтрелочка вправо

Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!

Kubernetes — часть карты развития DevOps

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Kubernetes

Terraform и Kubernetes инфраструктура как кодНастройка и использование Runners в KubernetesНастройка и деплой PostgreSQL в KubernetesСравнение и интеграция Openshift и KubernetesПримеры интеграции GitHub Actions и KubernetesDeploy приложений в Kubernetes - пошаговое руководство для начинающих и не толькоКак настроить CD в KubernetesИнтеграция Ansible в KubernetesИнтеграция CI/CD с Jenkins и KubernetesИнтеграция Kubernetes с GitLab - Автоматизация CI CD в облачной инфраструктуреГайд по DevOps инструментам в KubernetesОсобенности платформы Deckhouse в Kubernetes
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Kubernetes и Helm

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Микросервисы

Антон Ларичев
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий