Использование 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!