Прим. перев.: Оригинальная статья написана представителями компании BlueData, основанной выходцами из VMware. Она специализируется на том, чтобы сделать доступнее (проще, быстрее, дешевле) развёртывание решений для Big Data-аналитики и машинного обучения в различных окружениях. Этому призвана способствовать и недавняя инициатива компании под названием BlueK8s, в которой авторы хотят собрать плеяду Open Source-инструментов «для деплоя stateful-приложений и управления ими в Kubernetes». Статья посвящена первому из них — KubeDirector, что, согласно замыслу авторов, помогает энтузиасту в области Big Data, не имеющему специальной подготовки в Kubernetes, разворачивать в K8s приложения типа Spark, Cassandra или Hadoop. Краткая инструкция о том, как это сделать, и приведена в статье. Однако учтите, что у проекта ранний статус готовности — pre-alpha.
KubeDirector — Open Source-проект, созданный для упрощения запуска кластеров из сложных масштабируемых stateful-приложений в Kubernetes. KubeDirector реализован с помощью фреймворка Custom Resource Definition (CRD), использует родные возможности расширения Kubernetes API и опирается на их философию. Такой подход обеспечивает прозрачную интеграцию с управлением пользователей и ресурсов в Kubernetes, а также с существующими клиентами и утилитами.
Анонсированный недавно проект KubeDirector — часть большей Open Source-инициативы для Kubernetes, названной BlueK8s. Теперь я рад объявить и о доступности раннего (pre-alpha) кода KubeDirector. В этой публикации будет показано, как он работает.
KubeDirector предлагает следующие возможности:
- Отсутствие необходимости в модификации кода для запуска в Kubernetes stateful-приложений не из категории cloud native. Другими словами, пропадает потребность в декомпозиции уже существующих приложений для их соответствия паттерну микросервисной архитектуры.
- Родная поддержка хранения специфичной для приложения конфигурации и состояния (state).
- Не зависящий от приложений паттерн деплоя, минимизирующий время запуска новых stateful-приложений в Kubernetes.
KubeDirector позволяет data scientists, привыкшим к распределённым приложениям с интенсивной обработкой данных, таким как Hadoop, Spark, Cassandra, TensorFlow, Caffe2 и т.п., запускать их в Kubernetes с минимальной кривой обучения и без необходимости в написании кода на Go. Когда эти приложения контролируются KubeDirector, они определяются простыми метаданными и связанным с ними набором конфигураций. Метаданные приложения определяются как ресурс KubeDirectorApp
.
Чтобы разобраться в компонентах KubeDirector, склонируйте репозиторий на GitHub командой вроде следующей:
git clone http://<userid>@github.com/bluek8s/kubedirector.
Определение KubeDirectorApp
для приложения Spark 2.2.1 расположено в файле kubedirector/deploy/example_catalog/cr-app-spark221e2.json
:
~> cat kubedirector/deploy/example_catalog/cr-app-spark221e2.json
{
"apiVersion": "kubedirector.bluedata.io/v1alpha1",
"kind": "KubeDirectorApp",
"metadata": {
"name" : "spark221e2"
},
"spec" : {
"systemctlMounts": true,
"config": {
"node_services": [
{
"service_ids": [
"ssh",
"spark",
"spark_master",
"spark_worker"
],
…
Конфигурация кластера приложения определяется как ресурс KubeDirectorCluster
.
Определение KubeDirectorCluster
для примера с кластером Spark 2.2.1 доступно в kubedirector/deploy/example_clusters/cr-cluster-spark221.e1.yaml
:
~> cat kubedirector/deploy/example_clusters/cr-cluster-spark221.e1.yaml
apiVersion: "kubedirector.bluedata.io/v1alpha1"
kind: "KubeDirectorCluster"
metadata:
name: "spark221e2"
spec:
app: spark221e2
roles:
- name: controller
replicas: 1
resources:
requests:
memory: "4Gi"
cpu: "2"
limits:
memory: "4Gi"
cpu: "2"
- name: worker
replicas: 2
resources:
requests:
memory: "4Gi"
cpu: "2"
limits:
memory: "4Gi"
cpu: "2"
- name: jupyter
…
Запуск Spark в Kubernetes с KubeDirector
Запускать кластеры Spark в Kubernetes вместе с KubeDirector просто.
Во-первых, убедитесь, что запущен Kubernetes (версии 1.9 или выше), — с помощью команды kubectl version
:
~> kubectl version
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.3", GitCommit:"a4529464e4629c21224b3d52edfe0ea91b072862", GitTreeState:"clean", BuildDate:"2018-09-09T18:02:47Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.3", GitCommit:"a4529464e4629c21224b3d52edfe0ea91b072862", GitTreeState:"clean", BuildDate:"2018-09-09T17:53:03Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Разверните сервис KubeDirector и примеры определений ресурсов KubeDirectorApp
с помощью следующих команд:
cd kubedirector
make deploy
В результате запустится под с KubeDirector:
~> kubectl get pods
NAME READY STATUS RESTARTS AGE
kubedirector-58cf59869-qd9hb 1/1 Running 0 1m
Просмотрите список установленных в KubeDirector приложений, выполнив kubectl get KubeDirectorApp
:
~> kubectl get KubeDirectorApp
NAME AGE
cassandra311 30m
spark211up 30m
spark221e2 30m
Теперь можно запустить кластер Spark 2.2.1 с помощью файла-примера для KubeDirectorCluster
и команды kubectl create -f deploy/example_clusters/cr-cluster-spark211up.yaml
. Проверьте, что он стартовал:
~> kubectl get pods
NAME READY STATUS RESTARTS AGE
kubedirector-58cf59869-djdwl 1/1 Running 0 19m
spark221e2-controller-zbg4d-0 1/1 Running 0 23m
spark221e2-jupyter-2km7q-0 1/1 Running 0 23m
spark221e2-worker-4gzbz-0 1/1 Running 0 23m
spark221e2-worker-4gzbz-1 1/1 Running 0 23m
В списке запущенных сервисов тоже появился Spark:
~> kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubedirector ClusterIP 10.98.234.194 <none> 60000/TCP 1d
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d
svc-spark221e2-5tg48 ClusterIP None <none> 8888/TCP 21s
svc-spark221e2-controller-tq8d6-0 NodePort 10.104.181.123 <none> 22:30534/TCP,8080:31533/TCP,7077:32506/TCP,8081:32099/TCP 20s
svc-spark221e2-jupyter-6989v-0 NodePort 10.105.227.249 <none> 22:30632/TCP,8888:30355/TCP 20s
svc-spark221e2-worker-d9892-0 NodePort 10.107.131.165 <none> 22:30358/TCP,8081:32144/TCP 20s
svc-spark221e2-worker-d9892-1 NodePort 10.110.88.221 <none> 22:30294/TCP,8081:31436/TCP 20s
Если в браузере обратиться к порту 31533, можно увидеть Spark Master UI:
Вот и всё! В примере выше мы помимо кластера Spark развернули ещё и Jupyter Notebook.
Для запуска другого приложения (например, Cassandra) просто укажите другой файл с KubeDirectorApp
:
kubectl create -f deploy/example_clusters/cr-cluster-cassandra311.yaml
Проверьте, что кластер Cassandra стартовал:
~> kubectl get pods
NAME READY STATUS RESTARTS AGE
cassandra311-seed-v24r6-0 1/1 Running 0 1m
cassandra311-seed-v24r6-1 1/1 Running 0 1m
cassandra311-worker-rqrhl-0 1/1 Running 0 1m
cassandra311-worker-rqrhl-1 1/1 Running 0 1m
kubedirector-58cf59869-djdwl 1/1 Running 0 1d
spark221e2-controller-tq8d6-0 1/1 Running 0 22m
spark221e2-jupyter-6989v-0 1/1 Running 0 22m
spark221e2-worker-d9892-0 1/1 Running 0 22m
spark221e2-worker-d9892-1 1/1 Running 0 22m
Теперь в Kubernetes запущены кластер Spark (с Jupyter Notebook) и кластер Cassandra. Список сервисов можно увидеть командой kubectl get service
:
~> kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubedirector ClusterIP 10.98.234.194 <none> 60000/TCP 1d
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d
svc-cassandra311-seed-v24r6-0 NodePort 10.96.94.204 <none> 22:31131/TCP,9042:30739/TCP 3m
svc-cassandra311-seed-v24r6-1 NodePort 10.106.144.52 <none> 22:30373/TCP,9042:32662/TCP 3m
svc-cassandra311-vhh29 ClusterIP None <none> 8888/TCP 3m
svc-cassandra311-worker-rqrhl-0 NodePort 10.109.61.194 <none> 22:31832/TCP,9042:31962/TCP 3m
svc-cassandra311-worker-rqrhl-1 NodePort 10.97.147.131 <none> 22:31454/TCP,9042:31170/TCP 3m
svc-spark221e2-5tg48 ClusterIP None <none> 8888/TCP 24m
svc-spark221e2-controller-tq8d6-0 NodePort 10.104.181.123 <none> 22:30534/TCP,8080:31533/TCP,7077:32506/TCP,8081:32099/TCP 24m
svc-spark221e2-jupyter-6989v-0 NodePort 10.105.227.249 <none> 22:30632/TCP,8888:30355/TCP 24m
svc-spark221e2-worker-d9892-0 NodePort 10.107.131.165 <none> 22:30358/TCP,8081:32144/TCP 24m
svc-spark221e2-worker-d9892-1 NodePort 10.110.88.221 <none> 22:30294/TCP,8081:31436/TCP 24m
P.S. от переводчика
Если вы заинтересовались проектом KubeDirector, стоит так же обратить внимание на его wiki. К сожалению, найти публичный roadmap не удалось, однако issues в GitHub проливают свет на ход развития проекта и взгляды его главных разработчиков. Кроме того, для заинтересованных в KubeDirector авторы приводят ссылки на Slack-чат и Twitter.
Читайте также в нашем блоге:
- «Операторы для Kubernetes: как запускать stateful-приложения»;
- «Kubernetes tips & tricks: ускоряем bootstrap больших баз данных»;
- «Полезные утилиты при работе с Kubernetes»;
- «Полезные команды и советы при работе с Kubernetes через консольную утилиту kubectl»;
- «Знакомимся с альфа-версией снапшотов томов в Kubernetes»;
- «Представляем loghouse — Open Source-систему для работы с логами в Kubernetes».
Автор: shurup