SAKK: опенсорс-инструмент для развертывания кластеров EKS с Kubeflow

Популярность ML-технологий (Machine Learning) устойчиво растет, а по мере увеличения числа ML-проектов растет и спрос на внедрение облачных решений.

Kubeflow — один из самых популярных инструментов для упрощения развертывания ML-проектов. Этот инструмент с открытым исходным кодом появился еще в декабре 2017-го, а с тех пор значительно вырос и окреп. Amazon для гибкого запуска и масштабирования приложений Kubernetes в облаке AWS предлагает Amazon EKS (Elastic Kubernetes Service). Amazon EKS стал общедоступным в 2018 году, сейчас это одна из ведущих сред для Kubernetes, который в свою очередь часто используется для запуска Kubeflow.

Но несмотря на широкие возможности, многие все еще не видят очевидного пути к быстрой установке и запуску Kubeflow-кластера c EKS. В Provectus эту проблему решили.

Зачем развертывать Kubeflow с Amazon EKS?

Многим компаниям, которые работают над ML/AI-проектами (клиентскими или собственными), часто приходится развертывать несколько копий Kubeflow-кластеров, а затем управлять ими и дополнять их новыми ресурсами по мере роста рабочей нагрузки на обучение и вывод. Когда над проектом работают несколько команд, им также может потребоваться изолированный доступ к конвейерам данных Kubeflow из соображений безопасности.

И хотя в одной копии Kubeflow может быть несколько конвейеров данных, пока нет способа предоставить безопасный доступ к инструменту сразу нескольким командам, работающим в одном кластере Kubeflow. Кроме этого, для каждой копии Kubeflow требуется отдельный кластер Amazon EKS. Существующие способы настройки и развертывания кластера Kubeflow EKS требуют наличия собственных инструментов для Kubeflow и Kubernetes, которые не позволяют добавлять неродные ресурсы в развернутые кластеры.

Например, если ваша компания работает над несколькими ML/AI-проектами, ей необходимо как минимум несколько кластеров с копиями Kubeflow (dev, test, рабочие среды, client stands и т. д.) для каждого проекта, а часто и для каждой проектной команды. Все эти развертывания требуют установки нескольких инструментов CLI и их отдельной настройки для Kubernetes и Kubeflow. Для каждого из кластеров необходима отдельная настройка.

Все это означает одно: надо нанимать высококвалифицированных специалистов для развертывания и обслуживания инфраструктуры машинного обучения. Они настроят несколько конфигураций кластера вручную или напишут гору скриптов. Дальнейшая поддержка и апгрейд кластера также будет требовать вмешательства профессионалов.

Что такое Swiss Army Kube для Kubeflow (SAKK)

SAKK для Kubeflow предлагает простое решение, основанное на лучших практиках DevOps. Оно избавит вас от необходимости отдельных развертываний Kubeflow, Amazon EKS и других ресурсов, которые могут потребоваться для процесса машинного обучения.

Папка с SAKK-репозиторием играет роль готового шаблона проекта. Все, что необходимо сделать — это проверить ветку и настраивать ее каждый раз, когда необходимо развернуть Kubeflow с Amazon EKS.

ML-команды могут настраивать кластер со всем необходимым сразу, задав переменные в одном файле main.tf в корне репозитория, и разворачивать его с помощью пары Terraform-команд. Это позволит за считанные минуты запускать несколько кластеров машинного обучения, используя Terraform в качестве единой точки входа.

SAKK: опенсорс-инструмент для развертывания кластеров EKS с Kubeflow

После развертывания кластерами можно управлять с помощью Argo CD CLI или пользовательского интерфейса. Они хранятся в репозитории GitHub с организованным CI/CD-конвейером. Такой подход позволяет пользоваться всеми преимуществами портативности и стандартизации Kubernetes и Amazon EKS.

В дополнение к этому также можно добавлять ресурсы в свои кластеры, которые не являются родными инструментами Kubeflow, Kubernetes или Amazon EKS CLI. Для этого нет никакой необходимости писать кастомный код.

Использование SAKK для настройки и развертывания кластера не требует знаний об инструментах DevOps. Это означает, что DevOps-инженеры смогут уделять больше времени решению более важных задач. SAKK дает возможность сократить время, ресурсы и затраты, связанные с развертыванием и обслуживанием ML-инфраструктуры.

Основные моменты такие:

Автоматизация кластера с Argo CD

SAKK использует Argo CD для автоматизации состояний приложений с GitOps-оператором. Состояние вашего кластера будет храниться в репозитории GitHub и сегменте S3, описанном как код.

Преимущества Terraform

Terraform используется для унификации и стандартизации развертывания облачной инфраструктуры с IaC — одним из лучших стандартов для ML DevOps (MLOps). Terraform позволяет создавать файлы конфигурации с применением синтаксиса HCL (HashiCorp Configuration Language). Это лучшая альтернатива случайным скриптам для работы с кластерами. Более того, у Terraform есть большое сообщество и подробная документация.

Встроенный контроль доступа с Amazon Cognito

Для управления доступом в AWS SAKK использует Cognito User Pools (пулы пользователей). В кратком руководстве ниже Cognito используется для создания безопасной среды, в которой правами доступа можно управлять из одного места. Но SAKK не ограничивает вас одним провайдером, можно использовать любой другой.

Краткое руководство: развертывание кластера EKS с помощью Kubeflow

SAKK: опенсорс-инструмент для развертывания кластеров EKS с Kubeflow

Развернуть Kubeflow на EKS с помощью SAKK довольно просто. Помимо предварительных условий, потребуется еще несколько действий:

  • настройте развертывание кластера (~5 переменных в одном файле);
  • разверните свой кластер с помощью двух команд Terraform (init и apply).

После этого вы получите доступ к кластеру с возможностью управления.

Что необходимо заранее:

  1. Потребуется аккаунт AWS с пользователем IAM и установленный AWS CLI. Если у вас его нет, ознакомьтесь с официальными руководствами от AWS:

Далее установите Terraform, используйте официальный гайд:

Создайте ответвление и клонируйте SAKK для репозитория Kubeflow:

Вот и все! Осталось развернуть и настроить кластер Amazon EKS Kubeflow:

1. Развертывание и настройка кластера

Настройка кластера осуществляется в одном файле Terraform: main.tf. Минимальные настройки конфигурации следующие:

  • cluster_name (имя вашего кластера);
  • mainzoneid (ID основной зоны Route53);
  • domains (имена конечных точек адресов);
  • admin_arns (ARN пользователей, у которых будут права администратора);
  • cert_manager_email (имейлы для LetsEncrypt уведомлений);
  • cognito_users (список пользователей Cognito Pool).

Пример конфигурации main.tf:

source = “git::https://github.com/provectus/sak-kubeflow.git?ref=init”

cluster_name = “simple”

owner = “github-repo-owner”

repository = “github-repo-name”

branch = “branch-name”

#Main route53 zone id if exist (Change It)

mainzoneid = “id-of-route53-zone”

# Name of domains aimed for endpoints

domains = [“sandbox.some.domain.local”]

# ARNs of users who will have admin permissions.

userarn = “arn:aws:iam::<aws-account-id>:user/<username>”

username = “<username>”

groups = [“system:masters”]

# Email that would be used for LetsEncrypt notifications

cert_manager_email = “info@some.domain.local”

# An optional list of users for Cognito Pool

email = “qa@some.domain.local”

group = “masters”

email = “developer@some.domain.local”

username = “developer”

argo_path_prefix = “examples/simple/”

argo_apps_dir = “argocd-applications”

В некоторых случаях также потребуется переопределить переменные, связанные с репозиторием GitHub (репозиторий, ветка, владелец), в main.tf.

Далее можно настроить backend.hcl, в котором хранится состояние Terraform.

Пример конфигурации backend.hcl:

bucket = “bucket-with-terraform-states”

key = “some-key/kubeflow-sandbox”

region = “region-where-bucket-placed”

dynamodb_table = “dynamodb-table-for-locks”

2. Развертывание кластера AWS EKS Kubeflow

Кластер, который только что был настроен, развертывается с помощью следующих команд Terraform:

aws –region <region> eks update-kubeconfig –name <cluster-name>

Эти команды позволяют:

  • инициализировать Terraform и загрузить все удаленные зависимости;
  • создать чистый кластер EKS со всеми необходимыми ресурсами AWS (IAM, ASG, корзинами S3 и т. д.);
  • обновить локальный файл kubeconfig для получения доступа к недавно созданному кластеру EKS.

Эти команды Terraform сгенерируют несколько файлов в дефолтной папке приложений в репозитории. Прежде чем вы начнете развертывать сервисы в кластере EKS Kubernetes, необходимо добавить их в Git и отправить в репозиторий Github.

Обратите внимание на то, что установленная конфигурация Argo CD отслеживает изменения в текущем репозитории. Когда в егопапку apps вносятся изменения, они запускают процесс синхронизации. В этом случае будут созданы все объекты, помещенные в эту папку.

После этого вы сможете управлять своим кластером Kubernetes с помощью Argo CD CLI/UI или kubectl. Чтобы начать использовать kubectl(Kubernetes CLI для управления кластером), установите и настройте его. Для этого обратитесь к официальному гайду:

3. Доступ и управление кластером Amazon EKS Kubeflow

Итак, кластер развернут и готов к работе. В процессе развертывания были созданы две конечные точки доступа к службам в соответствии с настройками переменных вашего домена. Они находятся в файле main.tf:

Проверьте e-mail, который вы указали в переменной domains, для получения доступа к учетным данным.

Чтобы узнать больше о Kubeflow и Argo CD, ознакомьтесь с соответствующей официальной документацией:

Использование конвейеров Kubeflow

После успешного входа в кластер Amazon EKS через kubectl, вы попадете в панель управления Kubeflow:

SAKK: опенсорс-инструмент для развертывания кластеров EKS с Kubeflow

В разделе Pipelines есть несколько примеров конвейеров. Чтобы узнать больше об использовании Kubeflow в AWS, ознакомьтесь с официальной документацией.

SAKK: опенсорс-инструмент для развертывания кластеров EKS с Kubeflow

Также можно загружать собственные конвейеры, используя AWS SageMaker и Kubeflow. Например, давайте загрузим демо-модуль с одним из встроенных алгоритмов AWS SageMaker.

Создайте папку для управления отдельными состояниями Terraform (с ресурсами, связанными с выполнением конвейера) и добавьте файл main.tf со следующим кодом:

source = “path/to/kmeans-mnist-pipeline/folder/at/root/of/the/project”

cluster_name = “<your-cluster-name>”

username = “<your-kubeflow-username>”

Запустите Terraform:

Terraform сгенерирует файл training_pipeline.yaml и создаст учетную запись Kubernetes, которая будет соответствовать вашему имени пользователя Kubeflow и иметь все необходимые AWS разрешения для запуска конвейера.

Загрузите конвейер в Kubeflow через раздел Pipelines:

SAKK: опенсорс-инструмент для развертывания кластеров EKS с Kubeflow

Теперь, когда у вас есть первый конвейер и учетная запись в Kubernetes, укажите их в форме, чтобы начать запуск:

SAKK: опенсорс-инструмент для развертывания кластеров EKS с Kubeflow

Готово! Теперь у вас есть запущенный конвейер в Kubeflow.

Roadmap и дальнейшее развитие SAKK

SAKK продолжит развиваться в соответствии с Roadmap. В ближайших планах разработчиков — сделать больше ресурсов, которые будут настраиваться через Terraform (в main.tf):

  • Дальнейшая интеграция с AWS. Дополнительные функции AWS будут настраиваться через Terraform: RDS (Postgres), ElastiCache (Redis), S3 (Minio) и т. д. Их перенесут из Kubernetes, а управление будет происходить в AWS.
  • Обновление версий продукта. Появится возможность устанавливать версии продукта (Argo CD, Kubeflow, Kubeflow Pipelines) через Terraform.
  • Настройка ролей AWS IAM для Kubeflow. Настройка ролей пользователей и разрешения Kubeflow, позволяющие им работать с AWS, будут перенесены в Terraform. Пользователи смогут создавать Kubeflow профили и ресурсы, которые будут храниться в репозитории GitHub и использоваться как часть процесса GitOps.
  • Управление конвейерами Kubeflow. Можно будет сохранять состояние конвейеров Kubeflow. Пользователи смогут развернуть Kubeflow уже с готовыми конвейерами (загрузить их из репозитория GitHub) или загрузить дефолтные AWS конвейеры.
  • Интеграция с другими облачными платформами. В настоящее время SAKK доступен только для Amazon EKS (Elastic Kubernetes Service), но в долгосрочной перспективе планируется расширение и на другие облачные платформы.

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

По материалам Highload.today.