В современном мире облачных технологий и микросервисной архитектуры Kubernetes уверенно занимает лидирующие позиции среди инструментов для оркестрации контейнеров. Google Kubernetes Engine (GKE) как управляемый сервис от Google облака позволяет быстро развертывать и масштабировать кластеры Kubernetes, значительно упрощая жизненный цикл приложений. В этой статье мы подробно рассмотрим, как работать с кластером GKE программно, используя язык TypeScript — один из наиболее популярных и удобных инструментов для работы с JavaScript-экосистемой в серверной среде. Типичный путь для взаимодействия с Kubernetes осуществляется либо через командную строку (kubectl), либо с помощью различных библиотек и SDK. Использование TypeScript позволяет повысить уровень безопасности типов и повысить читаемость кода, что особенно актуально при разработке сложных автоматизаций и DevOps-процессов.
Чтобы начать работу, сначала нужно установить необходимые зависимости. Среди них выделяются две ключевые библиотеки: @google-cloud/container и @kubernetes/client-node. Первая служит для взаимодействия с Google Kubernetes Engine, предоставляя методы для получения информации о кластере, управления им и работы с API Google Cloud. Вторая библиотека предназначена для прямого взаимодействия с самим Kubernetes API, аналогично функционалу kubectl: она позволяет создавать, обновлять, читать и удалять ресурсы в вашем кластере. Иногда может возникнуть ошибка во время сборки проекта, связанная с отсутствием типов для некоторых зависимостей, например tar.
В таком случае стоит дополнительно установить @types/tar в качестве dev-зависимости, что решит эту проблему. Продолжая, рассмотрим процесс авторизации. Если вы запускаете код внутри сервисов Google Cloud, например, в облачной функции или виртуальной машине, процесс аутентификации максимально упрощён — достаточно просто создать клиента ClusterManagerClient из библиотеки @google-cloud/container. Эта библиотека автоматически подтянет необходимые креды из окружения, что освобождает от ручного управления токенами и ключами. Функция для получения авторизационных данных к кластеру выглядит лаконично: она использует идентификатор проекта и токен доступа, при этом делает запрос к API Google, чтобы получить детали кластера, включая адрес API-сервера и сертификат авторитета.
Эти данные далее используются для создания настроек соединения с Kubernetes API. Для инициализации клиента Kubernetes используется класс KubeConfig из @kubernetes/client-node. В него передаются параметры с описанием кластера, пользователей и контекстов, что позвляет эмулировать конфигурационный файл kubeconfig, привычный для разработчиков Kubernetes. С помощью метода makeApiClient создаётся клиент для взаимодействия с Kubernetes CoreV1Api — именно он позволяет управлять основными ресурсами, такими как поды, сервисы, конфигурации и пр. Одной из актуальных задач является применение Kubernetes-манифестов — YAML-файлов с описанием желаемых ресурсов в кластере.
Обычно для этого используется команда kubectl apply -f manifest.yaml. Однако при работе на сервере или в облачных функциях удобней реализовать аналогичную логику программно. Для этого можно считать файл с помощью Node.js, распарсить содержимое с помощью библиотеки js-yaml и обработать каждый ресурс отдельно.
Важно удостовериться, что каждый объект манифеста валиден и содержит необходимые поля kind и metadata, без которых невозможно работать с ресурсом в Kubernetes. Дополнительно стоит обновить аннотации, отвечающие за хранение последней применённой конфигурации, что упрощает управление обновлениями и откатами. В программе предусмотрена логика «если ресурс существует — обновить, если нет — создать». Она достигается с помощью попытки сделать GET-запрос (read) к ресурсам; при неуспехе совершается POST-запрос (create). Для обновления применяется метод patch, который изменяет существующую сущность.
Такой подход обеспечивает надёжное и idempotent поведение, аналогичное kubectl. Кроме того, написанный код прекрасно подходит для выполнения в облачных функциях Firebase и любом другом сервисе Google Cloud, где аутентификация и авторизация уже настроены. Если требуется запускать код вне окружения Google Cloud, например, локально или на стороннем сервере, необходимо предварительно подгрузить файл с сервисным аккаунтом и настроить переменную окружения GOOGLE_APPLICATION_CREDENTIALS. Это обеспечит корректную авторизацию и взаимодействие с API. Использование TypeScript в связке с API Google Cloud и Kubernetes предоставляет значительные преимущества.
Помимо явной типизации, это расширяет возможности автокомплита и статического анализа кода, что особенно полезно при автоматизации развёртывания и управления кластерами. С развитием платформы Google Cloud и Kubernetes увеличивается спрос на программные решения, которые позволяют интегрировать их в непрерывные интеграционные процессы (CI/CD), автоматизацию мониторинга и реагирования на события. Создание собственных оркестраций, написанных на языке программирования с богатой экосистемой, позволяет гибко адаптироваться под задачи бизнеса. В заключение стоит отметить, что описанный подход — это не просто альтернатива kubectl, а полноценный инструмент для программного управления окружением Kubernetes с возможностью интеграции в сложные приложения, сервисы и пайплайны. Он значительно расширяет арсенал разработчика и оператора, позволяя создавать мощные, типобезопасные решения на базе Google Kubernetes Engine и TypeScript.
Освоение этого инструментария открывает новые горизонты в управлении кластером, делая ваши приложения более устойчивыми, масштабируемыми и простыми в сопровождении.