Использование GitOps для развертывания Kubeflow с Argo CD

Kubeflow - это проект с открытым исходным кодом для упрощения, переносимости и масштабируемости машинного обучения (ML) в Kubernetes. Argo CD - это инструмент непрерывной доставки на базе GitOps для Kubernetes. Используя Argo CD, вы указываете желаемое состояние своих приложений в Kubernetes, используя декларативные спецификации, и Argo CD согласовывает различия между желаемым состоянием и фактическим текущим состоянием в вашем кластере Kubernetes.

В этом сообщении блога показано, как можно получить преимущества GitOps для Kubeflow, используя компакт-диск Argo в качестве инструмента развертывания. В следующем сообщении блога мы покажем вам, как можно расширить эти преимущества, используя Kubeflow с Argo CD для обучения и развертывания ваших моделей машинного обучения. По сути, GitOps для ML!

Остальная часть статьи будет посвящена пошаговым инструкциям по созданию кластера GKE и использованию Argo CD для развертывания Kubeflow из репозитория Github. В основном он следует стандартному Руководству по началу работы с Kubeflow GKE с небольшими изменениями для установки компакт-диска Argo и настройки репозитория Github.

Пожалуйста, ознакомьтесь с демонстрацией на недавнем собрании сообщества Kubeflow.

Создание учетных данных OAuth

Первым шагом в настройке кластера GKE с помощью Kubeflow является создание учетных данных клиента OAuth, выполнив действия, описанные в Руководстве по началу работы с GKE. Теперь у вас должны быть две переменные среды.

export CLIENT_ID=<CLIENT_ID from OAuth page>
export CLIENT_SECRET=<CLIENT_SECRET from OAuth page>

Создание кластера GKE

В Kubeflow есть инструмент командной строки kfctl.sh для упрощения кластерного процесса GKE. Инструмент CLI использует Диспетчер развертывания для декларативного управления всеми ресурсами, не относящимися к K8s. Поскольку диспетчер развертывания имеет декларативную спецификацию, вы можете настроить кластер GKE в соответствии с их требованиями.

Чтобы инструмент kfctl.sh развертывал конфигурации в диспетчере развертывания, необходимо установить Google Cloud SDK и двоичный файл kubectl. Вы можете установить Google Cloud SDK, следуя инструкциям здесь, и установить kubectl, запустив gcloud components install kubectl. Для этой демонстрации я решил развернуть свой кластер GKE в us-central-1c и запустил gcloud config set compute/zone us-central1-c, чтобы установить зону.

Чтобы загрузить инструмент kfctl.sh, вы можете запустить

mkdir ${KUBEFLOW_REPO}
cd ${KUBEFLOW_REPO}
export KUBEFLOW_TAG=v0.3.1 
curl https://raw.githubusercontent.com/kubeflow/kubeflow/${KUBEFLOW_TAG}/scripts/download.sh | bash
  • KUBEFLOW_REPO путь к каталогу, в который вы хотите загрузить исходный код. (т.е. / tmp / kubeflow /)
  • KUBEFLOW_TAG тег, соответствующий проверяемой версии, например master для последнего кода. Последнюю версию можно найти здесь.
  • В качестве альтернативы вы также можете просто клонировать репозиторий Kubeflow с помощью git.

Теперь, когда у вас загружен kftcl.sh, вы можете использовать его для создания конфигурации вашего кластера GKE, запустив:

./scripts/kfctl.sh init ${KFAPP} --platform gcp --project ${PROJECT}
cd ${KFAPP}
${KUBEFLOW_REPO}/scripts/kfctl.sh generate platform gcp
${KUBEFLOW_REPO}/scripts/kfctl.sh apply platform gcp
  • KFAPP Имя каталога для хранения ваших конфигураций. Этот каталог будет создан при запуске init и станет вашим репозиторием на Github.
  • ПРОЕКТ Название вашего проекта Google Cloud

После завершения команды kfctl.sh apply platform gcp у вас будет кластер GKE, подготовленный для Kubeflow. Если ваше развертывание не удалось, я рекомендую ознакомиться с этим Руководством по устранению неполадок GKE.

Передайте свой Kubeflow Ksonnet на Github

В KUBEFLOW_REPO вам нужно будет выполнить следующую команду, чтобы сгенерировать компоненты Ksonnet, которые определяют ваше приложение Kubeflow.

${KUBEFLOW_REPO}/scripts/kfctl.sh generate k8s

Если вы хотите узнать больше о компонентах Ksonnet, я рекомендую ознакомиться с документацией Kubeflow по ksonnet.

Затем нам нужно добавить среду ksonnet в наш каталог. Эта команда требует, чтобы на вашем компьютере был установлен двоичный файл ksonnet ks. Вы можете следовать инструкциям здесь, чтобы установить ksonnet. После настройки ksonnet вы можете запустить:

cd ${KUBEFLOW_REPO}/${KFAPP}/ks_app/
ks env add default --server https://kubernetes.default.svc

Поскольку я развертываю компакт-диск Argo в том же кластере Kubernetes, что и Kubeflow, я добавил флаг --server https://kubernetes.default.svc, чтобы установить конечную точку сервера API для этой среды на внутреннюю конечную точку сервера API Kubernetes. Два приятных побочных эффекта с настройкой нашей среды ksonnet, подобной этой, заключаются в том, что Argo CD может развертывать Kubeflow без необходимости выходить во внешний Интернет, а разработчики не могут запускать команду ksonnet apply без добавления дополнительных флагов для указания истинной конечной точки API.

На этом этапе ваш каталог готов к размещению на Github. Пожалуйста, следуйте обычным методам, чтобы ускорить внесение изменений. Например, если вы использовали доступ по SSH, вы могли бы работать в каталоге KFAPP:

cd ${KFAPP}
git init
git add --all
git commit -m "Initial Kubeflow ksonnet files"
git remote add origin [email protected]:argoproj/kubeflow-ks.git
git push --set-upstream origin master

ПРИМЕЧАНИЕ. Это также сохранит ваши конфигурации GKE в репозитории github.

Вы можете взглянуть на https://github.com/argoproj/kubeflow-ks.git, чтобы увидеть пример файлов ksonnet, которые должны быть в вашем репо, с оговоркой, что репо не имеет папки gcp_config. .

Установить компакт-диск Argo

Теперь, когда репозиторий Kubeflow ksonnet Github и кластер GKE готовы, нам нужно установить Argo CD. Для справки, большинство следующих шагов следует из Руководства по началу работы с Argo CD.

Установите компакт-диск Argo в кластер Kubernetes

ARGO_CD_LATEST=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/${ARGO_CD_LATEST}/manifests/install.yaml

Эти три строки загружают последние выпущенные файлы манифеста компакт-диска Argo и устанавливают их в пространство имен argocd.

Установить Argo CD CLI

Если вы используете macOS, вы можете запустить:

brew install argoproj/tap/argocd

В Linux:

curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/${ARGO_CD_LATEST}/argocd-linux-amd64
chmod +x /usr/local/bin/argocd

Установите дополнительные разрешения для компакт-диска Argo

Поскольку в кластере GKE включен RBAC, вам необходимо предоставить своей учетной записи возможность создавать новые роли кластера, запустив:

kubectl create clusterrolebinding YOURNAME-cluster-admin-binding --clusterrole=cluster-admin [email protected]

Откройте сервер API Argo CD

По умолчанию файлы манифеста по умолчанию для Argo CD не предоставляют общедоступную конечную точку. Здесь мы подключимся к Argo CD с помощью перенаправления портов kubectl и выставим Argo CD через порт 8080.

kubectl port-forward service/argocd-server 8080:443

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

Войдите через интерфейс командной строки как пользователь с правами администратора.

Первоначальный пароль для пользователя admin автоматически генерируется как имя модуля сервера API Argo CD. Это можно получить с помощью команды:

kubectl get pods -n argocd -l app=argocd-server -o name | cut -d'/' -f 2

Используя указанный выше пароль, войдите на Argo CD как администратор через localhost:8080:

argocd login localhost:8080

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

argocd account update-password
argocd relogin

Развертывание Kubeflow

Наконец-то мы готовы развернуть Kubeflow с помощью Argo CD!

export KUBEFLOW_REPO_URL='Replace with a ssh or https git endpoint'
argocd app create kubeflow --name kubeflow --repo $KUBEFLOW_REPO_URL --path ks_app --env default
argocd app sync kubeflow

Теперь вы можете просмотреть приложение Kubeflow, запустив:

argocd app get kubeflow

или взгляните на приложение, используя графический интерфейс Argo CD, указав в браузере IP-адрес службы Argo CD, работающей в вашем кластере:

ПРИМЕЧАНИЕ. Существует известная проблема с компонентом IAP, которая предотвращает синхронизацию службы envoy и приводит к сбою всех последующих синхронизаций. В качестве временного решения этой проблемы мы рекомендуем синхронизировать отдельные ресурсы, добавив флаг ресурса в команду синхронизации.

Затем вы можете получить доступ к своему пользовательскому интерфейсу Kubeflow, перейдя в https://<KFAPP>.endpoint.<PROJECT>.cloud.googl/

  • Доступность конечной точки может занять 10–15 минут. Kubeflow необходимо предоставить подписанный сертификат SSL и зарегистрировать DNS-имя.

Дополнительные настройки Kubeflow

Когда вы фиксируете изменение, которое изменяет каталог приложения Ksonnet вашего репозитория Kubeflow (каталог ks_app, если вы использовали скрипт kfctl.sh), Argo CD обнаружит, что ваше приложение не синхронизировано с вашим репозиторием git. Чтобы синхронизировать новый ресурс, вы можете запустить

argocd app sync kubeflow --resource GROUP:KIND:NAME

или из пользовательского интерфейса:

Другие конфигурации компакт-дисков Argo

Ознакомьтесь с документацией Argo CD, чтобы узнать больше о том, как настроить другие функции, такие как автосинхронизация, SSO, RBAC, служебные токены и многое другое.

Следующие шаги

Несмотря на то, что мы можем воспользоваться всеми преимуществами GitOps, развернув Kubeflow с Argo CD, эту интеграцию еще можно улучшить. Например, установка Argo CD не совсем соответствует модели GitOps. Инструкции говорят пользователям устанавливать манифесты компакт-диска Argo с удаленного URL-адреса, а не извлекать их из репозитория Git. Чтобы лучше соответствовать решению GitOps, пользователи должны иметь более декларативную установку Argo CD (эта проблема отслеживается здесь). Команда Argo CD рада работать с командой Kubeflow, чтобы создать более глубокую интеграцию, которая улучшит оба инструмента.

Пожалуйста, ознакомьтесь с Кодовой базой Argo CD и отправляйте любые отзывы или вопросы на канал the#argo-cd в канале argoproj slack!