Прим. перев.: kube-spawn — достаточно новый (анонсированный в августе) Open Source-проект, созданный в немецкой компании Kinvolk для локального запуска Kubernetes-кластеров. Он написан на Go, работает с Kubernetes версий 1.7.0+, использует возможности kubeadm и systemd-nspawn, ориентирован только на операционную систему GNU/Linux. В отличие от Minikube, он не запускает виртуальную машину для Kubernetes, а значит, что overhead будет минимальным и все процессы, запущенные внутри контейнеров, видны на хост-машине (в т.ч. и через top/htop). Представленная ниже статья — анонс этой утилиты, опубликованный одним из сотрудников компании (Chris Kühl) в корпоративном блоге.
kube-spawn — инструмент для простого запуска локального кластера Kubernetes из множества узлов на Linux-машине. Изначально он создавался преимущественно для разработчиков самого Kubernetes, однако со временем превратился в утилиту, которая отлично подходит для того, чтобы попробовать и изучить Kubernetes. Эта статья предлагает общее введение в kube-spawn и показывает, как использовать этот инструмент.
Обзор
kube-spawn задаётся целью стать простейшим способом проведения тестов и других экспериментов с Kubernetes в Linux. Этот проект появился из-за сложностей, возникавших при запуске Kubernetes-кластера со множеством узлов на машинах для разработки. Утилиты, предлагающие нужную функциональность, обычно не предоставляют окружения, в которых Kubernetes будет впоследствии запущен, то есть полноценную операционную систему GNU/Linux.
Запуск кластера Kubernetes с kube-spawn
Итак, давайте запустим кластер. В kube-spawn достаточно одной команды, чтобы получить образ Container Linux, подготовить узлы (nodes) и развернуть кластер. Эти шаги можно выполнить отдельно с помощью machinectl pull-raw
и подкоманд kube-spawn setup
и init
. Однако подкоманда up
сделает всё за нас:
$ sudo GOPATH=$GOPATH CNI_PATH=$GOPATH/bin ./kube-spawn up --nodes=3
Когда команда закончит выполняться, вы получите кластер Kubernetes с 3 узлами. Придётся подождать, пока узлы будут готовы для использования.
$ export KUBECONFIG=$GOPATH/src/github.com/kinvolk/kube-spawn/.kube-spawn/default/kubeconfig
$ kubectl get nodes
NAME STATUS AGE VERSION
kube-spawn-0 Ready 1m v1.7.0
kube-spawn-1 Ready 1m v1.7.0
kube-spawn-2 Ready 1m v1.7.0
Теперь видно, что все узлы готовы. Двигаемся дальше.
Демонстрационное приложение
Работоспособность кластера мы проверим, развернув демонстрационное микросервисное приложение Sock Shop, созданное в Weaveworks. Sock Shop — сложное приложение, состоящее из микросервисов и использующее множество компонентов, которые обычно можно найти в реальных инсталляциях. Таким образом, оно позволяет проверить, что всё действительно работает, и даёт более существенную почву для исследований, чем простое «hello world».
Клонирование приложения
Чтобы продолжить, понадобится склонировать репозиторий microservices-demo
и перейти в каталог deploy/kubernetes
:
$ cd ~/repos
$ git clone https://github.com/microservices-demo/microservices-demo.git sock-shop
$ cd sock-shop/deploy/kubernetes/
Деплой приложения
Теперь всё готово для деплоя. Но первым делом необходимо создать пространство имён sock-shop
— в deployment предполагается его наличие:
$ kubectl create namespace sock-shop
namespace "sock-shop" created
Теперь всё по-настоящему готово для деплоя приложения:
$ kubectl create -f complete-demo.yaml
deployment "carts-db" created
service "carts-db" created
deployment "carts" created
service "carts" created
deployment "catalogue-db" created
service "catalogue-db" created
deployment "catalogue" created
service "catalogue" created
deployment "front-end" created
service "front-end" created
deployment "orders-db" created
service "orders-db" created
deployment "orders" created
service "orders" created
deployment "payment" created
service "payment" created
deployment "queue-master" created
service "queue-master" created
deployment "rabbitmq" created
service "rabbitmq" created
deployment "shipping" created
service "shipping" created
deployment "user-db" created
service "user-db" created
deployment "user" created
service "user" created
После выполнения этих операций надо подождать, пока появятся все поды:
$ watch kubectl -n sock-shop get pods
NAME READY STATUS RESTARTS AGE
carts-2469883122-nd0g1 1/1 Running 0 1m
carts-db-1721187500-392vt 1/1 Running 0 1m
catalogue-4293036822-d79cm 1/1 Running 0 1m
catalogue-db-1846494424-njq7h 1/1 Running 0 1m
front-end-2337481689-v8m2h 1/1 Running 0 1m
orders-733484335-mg0lh 1/1 Running 0 1m
orders-db-3728196820-9v07l 1/1 Running 0 1m
payment-3050936124-rgvjj 1/1 Running 0 1m
queue-master-2067646375-7xx9x 1/1 Running 0 1m
rabbitmq-241640118-8htht 1/1 Running 0 1m
shipping-2463450563-n47k7 1/1 Running 0 1m
user-1574605338-p1djk 1/1 Running 0 1m
user-db-3152184577-c8r1f 1/1 Running 0 1m
Доступ к sock shop
Когда все они готовы, останется выяснить, по какому порту и IP-адресу заходить, чтобы получить доступ к магазину. Чтобы узнать порт, давайте посмотрим, куда пробрасываются службы фронтенда:
$ kubectl -n sock-shop get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
carts 10.110.14.144 <none> 80/TCP 3m
carts-db 10.104.115.89 <none> 27017/TCP 3m
catalogue 10.110.157.8 <none> 80/TCP 3m
catalogue-db 10.99.103.79 <none> 3306/TCP 3m
front-end 10.105.224.192 <nodes> 80:30001/TCP 3m
orders 10.101.177.247 <none> 80/TCP 3m
orders-db 10.109.209.178 <none> 27017/TCP 3m
payment 10.107.53.203 <none> 80/TCP 3m
queue-master 10.111.63.76 <none> 80/TCP 3m
rabbitmq 10.110.136.97 <none> 5672/TCP 3m
shipping 10.96.117.56 <none> 80/TCP 3m
user 10.101.85.39 <none> 80/TCP 3m
user-db 10.107.82.6 <none> 27017/TCP 3m
Видно, что фронтенд (front-end
) использует порт 30001 и внешний IP-адрес. Это означает, что мы можем достучаться до его служб через IP-адрес любого рабочего узла (worker) и порт 30001. Узнать IP-адреса всех узлов кластера можно через machinectl
:
$ machinectl
MACHINE CLASS SERVICE OS VERSION ADDRESSES
kube-spawn-0 container systemd-nspawn coreos 1492.1.0 10.22.0.137...
kube-spawn-1 container systemd-nspawn coreos 1492.1.0 10.22.0.138...
kube-spawn-2 container systemd-nspawn coreos 1492.1.0 10.22.0.139...
Запомните, что первый узел — это мастер, а все остальные — рабочие узлы (workers). В нашем случае достаточно открыть браузер и зайти по адресу 10.22.0.138:30001
или 10.22.0.139:30001
, где нас поприветствует магазин, продающий носки.
Остановка кластера
Когда покупки носков закончены, можете остановить кластер:
$ sudo ./kube-spawn stop
2017/08/10 01:58:00 turning off machines [kube-spawn-0 kube-spawn-1 kube-spawn-2]...
2017/08/10 01:58:00 All nodes are stopped.
Демонстрация с инструкциями
Для тех, кто предпочитает «экскурсии с гидом», смотрите видео на YouTube (около 7 минут на английском языке — прим. перев.).
Как упомянуто в видео, kube-spawn создаёт в текущей директории каталог .kube-spawn
, в котором вы найдёте несколько файлов и директорий в default
. Чтобы не ограничиваться размером каждого OS Container, мы монтируем сюда /var/lib/docker
каждого узла. Благодаря этому мы можем использовать дисковое пространство хостовой машины. Наконец, на данный момент у нас нет команды очистки (clean
). Желающие полностью замести следы деятельности kube-spawn могут выполнить команду rm -rf .kube-spawn/
.
Заключение
Надеемся, вы тоже найдёте утилиту kube-spawn полезной. Для нас это простейший путь проверить изменения в Kubernetes или развернуть кластер для изучения Kubernetes.
В kube-spawn всё ещё можно привнести многочисленные улучшения (и некоторые из них весьма очевидны). Очень приветствуем pull requests!
P.S. от переводчика. Об установке и других особенностях kube-spawn написано в GitHub-репозитории проекта. Читайте также в нашем блоге:
- «Начало работы в Kubernetes с помощью Minikube» (перевод);
- «Наш опыт с Kubernetes в небольших проектах» (видео доклада, включающего в себя знакомство с техническим устройством Kubernetes);
- «Пишем оператора для Kubernetes на Golang» (перевод);
- «Как на самом деле работает планировщик Kubernetes?» (перевод).
Автор: Дмитрий Шурупов