Создаем свой Managed K8S за 5 минут на старом железе
Привет! Все больше облачных провайдеров по всему миру предлагают свои услуги по управляемому Kubernetes кластеру в их облаках. Стоимость таких сервисов практически всегда является ключевым фактором при выборе вендора, а молодые компании с отрицательной прибылью, но очень большими амбициями вовсе вынуждены отдавать последние деньги за кластер, который мог бы заменить обычный Shared-хостинг за 150 рублей в месяц. Давайте разберемся.
❯ Почему всем компаниям нужен свой кластер?
Действительно, как и я сказал — микро-компании не нуждаются во всех прелестях k8s, им не нужен сверхвысокий UPTime их сервисов, им не требуется создавать кучу нод и ингрессов чтобы разрулить их трафик, да и желаемое масштабирование произойдет еще не завтра. Что им действительно нужно — это иметь потенциал быстрого перехода на более мощное железо, которое будет полностью удовлетворять все их быстро-растущие потребности, а kubernetes позволяет построить инфраструктуру продукта и легко перенести уже готовые спецификации на другой, например High Available (Отказоустойчивый) кластер, как только в этом появится потребность.
Думаю, все программисты согласятся, что закладывать возможность масштабирования необходимо изначально, но не все думают, как это масштабирование реализовать с точки зрения devops практик. Kubernetes звучит сложно и опасно, однако, давайте я расскажу, как поднять свой кластер за 5 минут и пару тысяч рублей в месяц, который будет полностью удовлетворять потребностям небольших компаний, и который можно будет легко преобразовать в dev-кластер, или вовсе отбросить как нижнюю часть ракеты, как только появится необходимость в отказоустойчивом кластере с кучей админов на борту.
❯ Шаг 0. Купить сервер
В этой статье я буду создавать кластер k8s на одном выделенном сервере, который я разделю на виртуальные машины потому что это дешево. Такой подход даст компании возможность безболезненно масштабировать продукт, перейдя на любой другой кластер за 30 минут. Если у вас уже есть потребность в отказоустойчивости — арендуйте несколько виртуальных машин и пропустите первый шаг.
Долго останавливаться на этом шаге я не хочу, статья не совсем о железе. Вот минимальные требования к каждой ноде, взятые с официальной документации opensource решения, которое мы будем использовать.
В моем случае получилось арендовать Dedicated сервер за 3 000 рублей в месяц:
- CPU: Intel® Xeon® Processor Quad Core 2xL5630.
- RAM: DDR3 DIMM 4Gb 1333MHz * 6 (24 гб оперативной памяти).
- DISK: 500GB SSD 2.5 Sata3.
- OS: Ubuntu 22.04 LTS.
❯ Шаг 1. Виртуальные машины
Если вы все же решили арендовать несколько виртуальных машин, а не разделять один сервер на части — смело пропускайте данный шаг.
Чтобы обеспечить нашему кластеру полноценное масштабирование между нодами (именно такая среда будет при переходе на «взрослый» кластер) — создадим виртуальные машины на нашем выделенном сервере.
Советую это делать с помощью opensource-инструмента под названием Cockpit. Сам инструмент позволяет администрировать сервер через web-интерфейс. Однако нам нужен именно аддон к нему — cockpit-machines. Аддон позволяет создавать виртуальные машины, быстро и гибко. Работает на Qemu-KVM.
Подключаемся по SSH к нашему выделенному серверу и выполняем команду:
apt-get install cockpit cockpit-machines
После того как установка завершилась — заходим в браузер и переходим на ip:9090
Логин и пароль от панели управления cockpit те же, что и от SSH, то есть логин и пароль вашего пользователя ОС.
Переходим во вкладку Virtual Machines, и нажимаем »Create VM». Указываем название виртуальной машины, образ, диск и количество оперативной памяти.
Отлично! После завершения процесса установки ОС — мы получим нашу master-ноду. Проделываем тоже самое еще пару раз для двух worker-нод.
По итогу получим что-то вроде этого:
Затем заходим в каждую из ВМ и в VNC консоле устанавливаем ssh.
apt-get install ssh
Готово! Теперь у нас есть три рабочих виртуальных машины, которые мы будем использовать для нашего кластера.
❯ Шаг 2. Настраиваем ВМ
Если вы думали, что на этом шаге мы будем редактировать и изменять кучу конфигурационных файлов для каждой виртуальной машины — забудьте. Что нам нужно сделать — это лишь установить пару пакетов и добавить чуть-чуть сахара. Но нужно быть внимательным, так как легко запутаться между этими виртуальными машинами.
Заходим по SSH в главный dedicated сервер, внутри которого мы только что создали 3 виртуальные машины. Тот, что смотрит наружу своим IP v4. Выполняем следующие команды:
apt-get install nano
nano /etc/hosts
Добавляем в самый конец 3 строчки вида IP_Виртуальной_машины название.
В моем примере это выглядит вот так:
192.168.122.61 master-node
192.168.122.172 worker-node-1
192.168.122.105 worker-node-2
После того как вставили текст — копируем его, он нам еще пригодиться, затем нажимаем ctrl+x, y и enter.
Затем, мы по очереди подключаемся к каждой виртуальной машине, чтобы установить на них дополнительные пакеты.
ssh ubuntu@master-node
su root
nano /etc/hosts
Вставляем те 3 строчки, что мы скопировали ранее и снова ctrl+x, y и enter чтобы сохранить.
Устанавливаем необходимые пакеты для каждой ноды нашего кластера.
apt-get install conntrack socat
Теперь необходимо добавить нашего пользователя ubuntu в список пользователей с доступом к sudo:
nano /etc/sudoers
После строчек:
# User privilege specification
root ALL=(ALL:ALL) ALL
Добавляем строчку:
ubuntu ALL=(ALL:ALL) ALL
Сохраняем (ctrl+x, y, enter).
Готово! Мы настроили мастер ноду, выходим из нее с помощью команды exit. Тот же процесс делаем с другими двумя виртуальными машинами, то есть в итоге нам нужно сделать эти шаги ВО ВСЕХ нодах нашего кластера.
После того, как мы проделали те же шаги на всех трех виртуальных машинах — снова подключаемся к мастер ноде и вводим пароль.
ssh ubuntu@master-node
❯ Шаг 3. Создаем кластер
Этого шага боятся не только программисты, но и неопытные devops инженеры. Кажется, так сложно создать свой кластер, но нет, мы сделаем это быстро и очень просто, а поможет нам один opensource проект под названием KubeSphere.
KubeSphere — распределенная операционная система для управления cloud-native приложениями, использующая в качестве ядра Kubernetes. А так же эта система поможет себя установить за пару кликов.
Это opensource решение с более чем 13 тысячами звездочек на гитхабе и достаточно внушительным комьюнити. Оно также активно используется китайскими компаниями, которые строят большие отказоустойчивые системы.
Сейчас мы — пользователь ubuntu с sudo доступом, находимся мы в master-node в нашей домашней директории (/home/ubuntu). Выполняем следующие команды:
curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.7 sh -
chmod +x kk
./kk create config -f config.toml
Эти команды скачали инструмент под названием KubeKey (kk), который позволит нам установить KubeSphere. А так же создали конфиг кластера, который сейчас мы начнем редактировать.
Открываем еще горячий config.toml:
nano config.toml
Я подчеркнул то, что нас интересует, но вы можете поиграться с конфигурациями, если вам это интересно. Kubesphere мощный инструмент, возможно, вы найдете настройки, которые необходимы для вашего кластера.
В значении name указываем название нашего кластера, для нашего примера я оставлю sample.
В списке hosts указываем наши виртуальные сервера:
- {name: master, address: 192.168.122.61, internalAddress: 192.168.122.61, user: ubuntu, password: "password"}
- {name: worker-1, address: 192.168.122.172, internalAddress: 192.168.122.172, user: ubuntu, password: "password"}
- {name: worker-2, address: 192.168.122.105, internalAddress: 192.168.122.105, user: ubuntu, password: "password"}
А чуть ниже назначаем им роли:
roleGroups:
etcd:
- master
control-plane:
- master
worker:
- worker-1
- worker-2
По итогу мы должны получить что-то вроде такого (естественно с IP адресами и паролями ваших виртуальных машин):
Сохраняем и радуемся, мы настроили наш кластер. Осталось его только поднять. А сделать это еще проще — выполняем одну команду:
./kk create cluster -f config.toml
KubeKey проверит ноды кластера и если все ОК — попросит подтвердить установку кластера. Вводим yes и нажимаем enter.
Почти готово! Идем пить кофе или воду, если железо кластера очень старое, а интернет медленный — можно и в зал успеть сходить. Однако у меня установка кластера заняла буквально минут 5. Как только установка завершена — вы увидите следующее сообщение:
Мы можем побежать смотреть на этот великолепный интерфейс, но нас будет ожидать ошибка. Почему? Ну ты чего, ip же публичный, но он доступен только внутри сети наших виртуальных машин. Можно попытаться прокинуть внешний мост, форвардить трафик на виртуальную машину, но я сделаю намного проще.
❯ Шаг 4. Заключительный
Открываем наш терминал и подключаемся по SSH к «Главному» выделенному серверу, тот, в котором мы создавали 3 виртуальные машины. Выполняем следующие команды:
apt-get install nginx
nano /etc/nginx/sites-enabled/default
Удаляем от туда все и вставляем следующее:
server {
listen 30880 default_server;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://ip_из_сообщения_от_kubekey:30880;
}
}
Сохраняем и идем в браузер по нашему публичному IP и порту 30880. Указываем логин и пароль который так же был в том сообщении после установки (по умолчанию это admin: P@88w0rd) и устанавливаем свой новый пароль.
Поздравляю! Вот ваш собственный Managed Kubernetes, который вы сможете легко настроить, подключить пайплайны гитлаба и положить туда целую кучу своих драгоценных ямлов.
В следующих статьях я постараюсь описать прочие необходимые каждой компании процессы: настройка пайплайнов, деплойменты, балансировка нагрузки и сертифицирование, опираясь на уже имеющиеся результаты этой статьи.
Ссылочки на все ресурсы: