В этом учебном пособии Kubernetes я рассмотрел пошаговое руководство по настройке Kubernetes кластера на Vagrant. Это многонодовая настройка Kubernetes с использованием kubeadm.

Vagrant - это отличная утилита для настройки виртуальных машин на вашей локальной рабочей станции.

Это руководство в первую очередь посвящено автоматизированной настройке Kubernetes с использованием скриптов Vagrantfile и  shell scripts. 

Автоматическая настройка Kubernetes кластера на Vagrant

Я написал базовый Vagrantfile и скрипты, чтобы каждый мог понять и внести изменения в соответствии со своими требованиями.

Сводка настройки.

  1. Команда vagrant up создаст три виртуальные машины и настроит все основные компоненты и конфигурацию kubernetes с помощью Kubeadm.

  2. Файл kubeconfig добавляется ко всем узлам кластера, чтобы вы могли выполнять команды kubectl с любого узла.

  3. Файл kubeconfig и токен доступа к kubernetes добавляются в папку configs, где у вас есть Vagrantfile. Вы можете использовать файл kubeconfig для подключения кластера с вашей рабочей станции.

  4. Вы можете выключить виртуальные машины, когда они не используются, и запускать их снова, когда это необходимо. Все конфигурации кластера остаются нетронутыми без каких-либо проблем. Узлы автоматически подключаются к мастеру во время запуска.

  5. Вы можете удалить все виртуальные машины одной командой vagrant destroy и воссоздать установку с помощью команды vagrant up в любое время.

Kubernetes, Kubeadm, Vagrant, Github Repository

Kubeadm, Vagrantfile и скрипты расположены в репозитории Github.

Клонируйте репозиторий.

git clone https://github.com/scriptcamp/vagrant-kubeadm-kubernetes

Настройка Kubernetes кластера на Vagrant

Выполните приведенные ниже действия, чтобы развернуть кластер Kubernetes и проверить все конфигурации кластера.

Шаг 1: Чтобы создать кластер, перейдите в клонированный каталог.

cd vagrant-kubeadm-kubernetes

Шаг 2: Выполните vagrant команду. Она развернет три узла. Один master и две worker-node. Установка и настройка Kubernetes происходит через bash script, присутствующий в папке scripts.

vagrant up

Примечание: Если вы запускаете его в первый раз, Vagrant сначала загрузит образ ubuntu, упомянутый в Vagrantfile. Это одноразовая загрузка.

Шаг 3: Войдите в master-node, чтобы проверить конфигурацию кластера.

vagrant ssh master

Шаг 4: Вывод списка всех нод кластера, чтобы убедиться, что worker-node подключены к master и находятся в готовом состоянии.

kubectl top nodes

Вы должны увидеть то, что показано ниже.

Вот и все! Вы можете начать развертывание и тестирование других приложений.

Чтобы завершить работу виртуальных машин Kubernetes, выполните команду:

vagrant halt

Когда вам снова понадобится кластер, просто выполните:

vagrant up

Чтобы удалить виртуальные машины:

vagrant destroy -f

Объяснение Kubeadm, Vagrantfile и Scripts

Дерево файлов vagrant репозитория.

├── Vagrantfile
├── configs
│   ├── config
│   ├── join.sh
│   └── token
└── scripts
├── common.sh
├── master.sh
└── node.sh

Папка configs и файлы генерируются только после первого запуска.

Как я объяснял ранее, папка config содержит файл config, token и файл join.sh.

В предыдущем разделе я уже объяснил, что такое config и token. Файл join.sh содержит команду присоединения worker-node с токеном, созданным во время инициализации master-node kubeadm.

Поскольку все ноды имеют общую папку с Vagrantfile, worker-node могут прочитать файл join.sh и автоматически присоединиться к master во время первого запуска. Это одноразовая задача.

Если вы войдете в какую-либо ноду и получите доступ к папке /vagrant, вы увидите Vagrantfile и скрипты в том виде, в каком они являются общими для виртуальных машин.

Давайте посмотрим на Vagrantfile

Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: <<-SHELL
apt-get update -y
echo "10.0.0.10  master-node" >> /etc/hosts
echo "10.0.0.11  worker-node01" >> /etc/hosts
echo "10.0.0.12  worker-node02" >> /etc/hosts
SHELL
config.vm.define "master" do |master|
  master.vm.box = "generic/ubuntu2004"
  master.vm.hostname = "master-node"
  master.vm.network "private_network", ip: "10.0.0.10"
  master.vm.provider "virtualbox" do |vb|
      vb.memory = 4048
      vb.cpus = 2
  end
  master.vm.provision "shell", path: "scripts/common.sh"
  master.vm.provision "shell", path: "scripts/master.sh"
end
(1..2).each do |i|
config.vm.define "node0#{i}" do |node|
node.vm.box = "generic/ubuntu2004"
node.vm.hostname = "worker-node0#{i}"
node.vm.network "private_network", ip: "10.0.0.1#{i}"
node.vm.provider "virtualbox" do |vb|
vb.memory = 2048
vb.cpus = 1
end
node.vm.provision "shell", path: "scripts/common.sh"
node.vm.provision "shell", path: "scripts/node.sh"
end
end
end

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

  1. 10.0.0.10 (master)

  2. 10.0.0.11 (node 01)

  3. 10.0.0.12 (node 02)

Кроме того, блок worker-node находится в цикле. Поэтому, если вам нужно более двух worker-node или у вас только одина worker-node, вам нужно заменить 2 на нужное число в цикле. Если вы добавляете больше узлов, убедитесь, что вы добавили IP в запись файла node.

Например, для 3 worker-node необходимо иметь цикл 1..4.

(1..4).each do |i|
master.sh, node.sh и common.sh

Эти три скрипта запускаются в качестве provisioners во время запуска Vagrant для конфигурирования кластера.

  1. common.sh: - Список команд, устанавливающих docker, kubeadm, kubectl и kubelet на все узлы. Кроме того, отключает swap.

  2. master.sh: - содержит команды для инициализации master, установки плагина calico. Кроме того, копирует файлы kube-config, join.sh и token в каталог configs.

  3. node.sh:- читает команду join.sh из общей папки configs и присоединяется к master-node. Кроме того, скопировал файл kubeconfig в местоположение /home/vagrant/.kube для выполнения команд kubectl.

Вывод

Чтобы настроить кластер kubernetes на Vagrant, все, что вам нужно сделать, это клонировать репозиторий и запустить команду vagrant up.

Кроме того, вы инженер DevOps и работаете в кластере Kubernetes, вы можете иметь локальный стенд для разработки и тестирования.

Комментарии (38)


  1. ZlobniyShurik
    01.01.2022 17:51
    +2

    Не спец по куберу. Только-только начал его изучать, но, сдаётся мне, minikube ставится ещё проще. Не в укор автору топика, чисто информации для...


    1. rudinandrey
      01.01.2022 19:55

      mimikube на одной машине поднимает кубер, а тут смысл в том что создается несколько виртуальных машин, в каждой поднимается кубер и таким образом поднимается полноценный кластер.


      1. mrsantak
        01.01.2022 20:52
        +2

        Миникуб это умеет из коробки


      1. gecube
        02.01.2022 01:56
        +1

        таким образом поднимается полноценный кластер.

        в чем ценность? Поиграться с основными возможностями кубера с т.з. разработчика или т.з. эксплуатанта можно и на однонодовом кластере - ингресс, сетевые политики, LB etc. Да, бывают кейсы, когда хочется именно многонодовый, но их на самом деле не так много...


    1. srgsrg1901
      04.01.2022 03:01

      Миникуб это одна нода. Тут многонодовая конфа


      1. ZlobniyShurik
        04.01.2022 04:42

        Нет. Миникуб - это одна нода по умолчанию. Но многонодовые конфигурации там давным-давно работают тоже.

        minikube node - add, remove, or list additional nodes


  1. vainkop
    02.01.2022 06:58
    -2

    Vagrant это legacy, потому что это виртуалки, а они, как известно, потребляют значительно больше системных ресурсов, чем контейнеры и поднимаются медленнее.

    K3D (не путать с K3S) для этих целей подходит гораздо лучше. Можно и несколько кластеров на одной машине запустить и всё в Docker.


    1. mrsantak
      02.01.2022 13:20

      Vagrant это не легаси, а технология предназначенная для решения других задач. Иногда нужна именно полновесная виртуальная машина, а не докер контейнер. Другое дело, что конкретно для кубера уже есть готовые решения как на базе докера, так и на базе виртуалок.


      1. vainkop
        02.01.2022 18:09
        +1

        Иногда нужна именно полновесная виртуальная машина

        Разве что для чего-то экзотического. Уверен, что более 90% остальных кейсов покроет K3D.

        Можете привести пример для чего лично вам нужна именно виртуалка?

        Вот так легко можно установить K3D и создать Highly Available 3 Master (!) + 3 Workers K3D cluster

        curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash
        
        k3d cluster create NAME --servers 3 --workers 3


        1. ZlobniyShurik
          02.01.2022 20:15

          У меня WinXp и k3d там напрямую почему-то не работает :D

          А если серьёзно, то не должен софт быть жёстко привязан к конкретному серверу (дистрибутив ОС, версия ядра, состав железа, софта, e.t.c.) и виртуалки в этом смысле гораздо удобней.


          1. vainkop
            02.01.2022 20:29

            Не спец по куберу. Только-только начал его изучать

            А если серьёзно, то не должен софт быть жёстко привязан к конкретному серверу (дистрибутив ОС, версия ядра, состав железа, софта, e.t.c.) и виртуалки в этом смысле гораздо удобней.

            1) Сервера для кубера на винде не поднимают. Это можно сделать, но в мире кубера 99% линукс.

            2) На винде работают некоторые ...разработчики, но докер работает практически на любой ОС, как и K3D.

            3) Есть огромная разница между виртуализацией и контейнеризацией и дело не удобстве. Изучите докер.


            1. ZlobniyShurik
              02.01.2022 21:08

              1. Кто мешает в том же Hyper-V настрогать виртуалок с линем, в которые уже поселить кубер? Да, изврат, но вполне себе удобный изврат, особенно для конторы, где окошки везде, где только можно :)

              1. Докер изучу, никуда не денусь. Правда, на курсах по куберу почему-то народ массово говорит одно "докер deprecated". Ну, не мне с ними спорить.


              1. vainkop
                02.01.2022 21:23

                Вы ещё и на курсах по куберу, но при этом не знаете чем VM отличается от docker и в принципе не зная докер изучаете кубер? Что за курсы такие волшебные, если не секрет?

                Прочтите хоть что-то, это не долго. Например (первое нагуглилось) https://habr.com/ru/post/474068/


              1. vainkop
                02.01.2022 21:23

                del


              1. mrsantak
                02.01.2022 21:37

                Правда, на курсах по куберу почему-то народ массово говорит одно "докер deprecated"

                dockershim deprecated, а не docker. Если авторы курса связанного с контейнеризаций не понимают разницы, то это хороший маркер низкого качества курсов, лучше поискать другой курс. Другой маркер - это путать docker desktop и docker.


                1. gecube
                  02.01.2022 21:43

                  dockershim deprecated, а не docker.

                  docker-docker. Зачем нужен docker, если есть вполне себе CRI containerd?


                  1. mrsantak
                    02.01.2022 22:36

                    Смотря что понимать под словом docker. Так-то этим словом нынче слишком дохрена всего обозначают, отсюда и все истории, когда docker сначало типо deprecated стал, потом типо платным.

                    Если речь про docker-cli, то для меня это просто удобная консольная утилита для запуска контейнеров к которой я привык и чьи флаги/команды я более-менее помню. То что кубером можно рулить по rest апи, не делает же ненужным kubectl. Так почему наличие CRI апи у containerd должно сделать ненужным docker-cli?


                    1. gecube
                      02.01.2022 22:45

                      Потому что на узлах кластера ни dockerd, ни docker cli не нужны. Простой аргумент - docker cli ничего не знает о контейнерах и подах, запущенных в containerd. Именно поэтому есть отдельные утилиты crictl, nerdctl.

                      И, да, диагностику поломок это ничуть не ломает.

                      Докер стал "лишним звеном". При этом я не отрицаю, что в виду докер десктоп на машине разработчика это полезный инструмент (все ещё)


                      1. mrsantak
                        02.01.2022 23:01

                        Ну если у вас на сервере есть полноценный кубер, то понятно, что вам не нужен docker. Даже если данный кластер по какой-то причине все еще работает через docker shim, то я бы сказал, что лезть в docker в обход кубера все равно не стоит.

                        А если же речь идет о том, чтобы просто запустить пару контейнеров, то docker решает эту задачу не привнося лишней сложности.


                      1. gecube
                        03.01.2022 01:56

                        А если же речь идет о том, чтобы просто запустить пару контейнеров, то docker решает эту задачу не привнося лишней сложности.

                        даже тут докер не особо нужен... podman? systemd-nspawn? В конце-концов надо уточнить о чем идет речь )))) если локальная разработка - опять docker desktop (если речь идет о mac/win)


                      1. mrsantak
                        03.01.2022 03:46

                        даже тут докер не особо нужен... podman? systemd-nspawn?

                        ОК, встречный вопрос: а зачем нужен podman и systemd-nspawn когда есть docker?

                        если локальная разработка - опять docker desktop (если речь идет о mac/win)

                        Я не понял, docker не нужен потомучто есть docker desktop?


                      1. gecube
                        03.01.2022 14:18

                        Я не понял, docker не нужен потомучто есть docker desktop?

                        абсолютно верно. Единственный кейс, выявленный эмпирически, когда нужен именно докер - это когда есть абстракный разработчик, который сидит на линукс рабочей машине. Ну, и еще мы делали проект с CUDA - там докер тоже хорошо вписывается, потому что иначе там прямо больно становится. В остальном... его значимость переоценена.

                        ОК, встречный вопрос: а зачем нужен podman и systemd-nspawn когда есть docker?

                        тем, что оба бесплатны (абсолютно, хотя можете возразить, что и docker-ce бесплатен, см. ниже), их не планируют закрывать, а systemd-nspawn вообще в любой линукс системе есть и не требует лишних деталей.

                        Почему еще docker-desktop это хорошо? Потому что заплатив - Вы получаете неограниченный доступ к докер хабу и security scan'ы. Вы же помните, что безлимитный доступ к docker.io (Docker Hub) прикрыли? И многие разработчики от этого испытывают неудобства. Это означает либо организацию каких-то костылей, чтобы удобно работать, либо ... плати ...

                        Кстати, я ни разу не одобряю этот ход докера - стать платным. Другой вопрос, что я понимаю, что там инвесторы, все такое, мирантис, которые решили хоть какое-то бабло поднять на этом.


            1. mrsantak
              02.01.2022 21:30

              Сервера для кубера на винде не поднимают. Это можно сделать, но в мире кубера 99% линукс.

              Кубер бывает нужен не только на серверах, но и на дев тачках. А на дев тачке может быть не только линукс, но и мак или же винда.

              На винде работают некоторые ...разработчики, но докер работает практически на любой ОС, как и K3D.

              Во-первых, на винде работает много разработчиков. И софта под винду тоже пишется огромное количество.

              А докер работает на практически любой ОС за счет того, что, если эта ось не линукс, поднимается он в виртуалке с линуксом.


              1. vainkop
                02.01.2022 21:53

                Кубер бывает нужен не только на серверах, но и на дев тачках. А на дев тачке может быть не только линукс, но и мак или же винда.

                Это можно долго обсуждать, но реальные сервера, на которых работают приложения, которые пишут разработчики, работают на 90+% на линуксе, а уж те, где кубер и на все 99+%. И кубер оркестрирует собственно docker/containerd/podman & etc контейнеры.

                Не понимаю зачем ещё городить себе прослойку в виде Vagrant, если можно взять тот же docker desktop, который да под капотом использует виртуализацию, но спрятана она достаточно хорошо для того, чтобы не отвлекать от работы собственно с контейнерами и кубером, если нужно его поднять локально. Для этого есть специальные и популярные решения и ни одно из них не использует Vagrant: minikube, K3s, K3D & etc.


                1. mrsantak
                  02.01.2022 22:07

                  Мы кажется смешали тему треда и тему поста. Данный тред начался с утверждения, что виртуализация не нужна, а нужны контейнеры. Я тут пытаюсь донести мысль, что виртуализация очень даже нужна, иногда даже для того, чтобы пользоваться теми самыми контейнерами.

                  Не понимаю зачем ещё городить себе прослойку в виде Vagrant, если можно взять тот же docker desktop, который да под капотом использует виртуализацию, но спрятана она достаточно хорошо для того, чтобы не отвлекать от работы собственно с контейнерами и кубером, если нужно его поднять локально.

                  Если говорить про контейнеры в отрыве от k8s, то у docker desktop недавно сменилась модель лицензирования и он стал не бесплатным для комерческого использования. С учетом того, что у меня к нему в целом достаточно много претензий по качеству работы под маком, то я как раз мог бы исппользовать vagrant для запуска докера вместо docker desktop. Но у меня пришло время замены ноута и я тупо решил сменить мак на линукс и вопрос с docker desktop отпал сам собой.

                  Для этого есть специальные и популярные решения и ни одно из них не использует Vagrant: minikube, K3s, K3D & etc.

                  С этим я и не пытаюсь спорить. Вагрант для поднятия кубер кластера совершенно не нужен. Виртуалки - могут быть нужны, но вы верно заметили, что вышеупомянутые тули их достаточно грамотно абстрагируют от пользователя.


                  1. vainkop
                    02.01.2022 22:11

                    Мы кажется смешали тему треда и тему поста.

                    Соглашусь, что мог выразиться более точно и всё высказанное мной стоит воспринимать исключительно в контексте темы поста и K8s.


                  1. sundmoon
                    02.01.2022 23:15

                    Я тут пытаюсь донести мысль, что виртуализация очень даже нужна, иногда даже для того, чтобы пользоваться теми самыми контейнерами.

                    Вот только с данной конкретной репой на винде(virtualbox) всё непросто: приходится перезапускать провиженинг нод, всех и по отдельности.


                    kubeadm preflight-checks недовольны артефактами предыдущих запусков… После N-й попытки сделать up и provision всем трём нодам имеем:


                    vagrant@master-node:~$ hostname
                    master-node
                    vagrant@master-node:~$ kubectl get nodes
                    NAME      STATUS   ROLES    AGE    VERSION
                    vagrant   Ready    <none>   171m   v1.20.6
                    vagrant@master-node:~$

                    1) Короче, индусская какая-то репа.
                    Кто бы взялся починить?


                    2) Мой личный опыт с вагрантом таков, что одной командой поднять чужую лабу почти никогда не выходит. А выкладыватели vagrant-репозиториев обычно не парятся сделать свои скрипты идемпотентными: "У меня на машине всё работает" (имеется ввиду vagrant up").


                    ЗЫ. (к разговорам ниже) Vagrant не нужен для запуска кубера это факт. Но вот для демонстрации kubeadm он бы сгодился… если бы код репозитория таки работал


                    1. gecube
                      03.01.2022 02:01

                      можно взять https://github.com/banzaicloud/pke

                      Их лаба запускается (по крайней мере, у меня получались повторяемые результаты). Под капотом тот же kubeadm в конце-концов.


        1. mrsantak
          02.01.2022 21:24

          Разве что для чего-то экзотического. 

          Ну если вы сидите исключительно на линуксе и исключительно на одной архитектуре, то да, только для экзотического. А вот если вам захочется попользоваться докером на том же маке, то без виртуалки никак. Еще пример - это запуск некоторых windows приложений на линуксе/маке приходится делать через parallels.

          Если же мы говорим про разработку, то если вы пишете софт который хоть как-то зависит от ядра, то рано или поздно вы начнете встречать проблемы, которые воспроизводятся только на конкретных версиях ядра. И тут без виртуалок было бы супер больно это фиксить.


          1. gecube
            02.01.2022 21:31

            А вот если вам захочется попользоваться докером на том же маке, то без виртуалки никак.

            docker desktop решает эту проблему. Как для мака, так и для винды.

            Если же мы говорим про разработку, то если вы пишете софт который хоть как-то зависит от ядра, то рано или поздно вы начнете встречать проблемы, которые воспроизводятся только на конкретных версиях ядра. И тут без виртуалок было бы супер больно это фиксить.

            но не на локальных виртуалках... а, скажем, на виртуалках в копии прод окружения той же vmware, где весь остальной прод лежит.


            1. mrsantak
              02.01.2022 21:48

              docker desktop решает эту проблему. Как для мака, так и для винды.

              А знаете как он эту проблему решает? Он поднимает вам виртуалку в которой и запускает докер. Так себе знаете аргумент в пользу ненужности виртуалок.

              но не на локальных виртуалках...

              А почему не на локальных? Запустили тем же вагрантом виртуалочку, подключили к ней build папочку проекта и запускаетесь себе быстро и без гемора. Не, если вы пишете софт, который даже в тестовых сценариях требует огромных ресурсов, то да, тут нужны внешние тачки. Но если речь идет про более-менее обычный софт, то проблем с локальной виртуалкой никаких.


              1. gecube
                02.01.2022 21:58

                А почему не на локальных? Запустили тем же вагрантом виртуалочку, подключили к ней build папочку проекта и запускаетесь себе быстро и без гемора. 

                я сам люблю вагрант - хороший инструмент, но если дело дошло до проблем в ядре, то вагрант тут не нужен. И, да, у вас в вагранте железо другое, чем на той же vmware, так что привет - проблемы железа вы не отловите... Поэтому ценности в нем гонять софт не так много, на самом деле, как может показаться на первый взгляд


                1. mrsantak
                  02.01.2022 22:16

                  А ну, если дело дошло до проблем с железом, то да. Там может оказаться, что и виртаулки мало, и нужно вот прям физическую железку. В конце концов SaaS мир не ограничивается и понятия прода может не быть вовсе.

                  А я все-таки имел ввиду класс проблем попроще - проблем связанных с ядром. Для них и меры можно попроще использовать.


          1. vainkop
            02.01.2022 22:03

            Еще пример - это запуск некоторых windows приложений на линуксе/маке приходится делать через parallels.

            Я всё же задавал вопрос в контексте статьи про Vagrant и кубер, а не вообще зачем нужны виртуалки :)

            Если же мы говорим про разработку, то если вы пишете софт который хоть как-то зависит от ядра, то рано или поздно вы начнете встречать проблемы, которые воспроизводятся только на конкретных версиях ядра. И тут без виртуалок было бы супер больно это фиксить.

            При чём тут кубер, который оркестрирует контейнеры?

            https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/


            1. mrsantak
              02.01.2022 22:23

              Upd. Увидел ваш коммент ниже. Кажется, что в данном треде у нас имело место банальное недопонимание. В целом, все кажется согласны с утверждением, что vagrant для запуска кубера просто напросто не нужен.

              Весь тред пошел с вашего заявления

              Vagrant это legacy, потому что это виртуалки, а они, как известно, потребляют значительно больше системных ресурсов, чем контейнеры и поднимаются медленнее.

              Заметьте, в утверждении ни слова о кубере. Я пытаюсь донести мысль, что ни вагрант, ни виртуалки не являются легаси, и что у них и у контейнеров хоть и пересекающиеся, но все же разные области применения.



    1. vainkop
      02.01.2022 22:21

      Перечитав свой коммент понял, что как-то он слишком в общем про виртуалки получился, а не про в контексте работы Vagrant + K8s :)

      Повторюсь, что конечно на винде и маке докер под капотом использует виртуализацию, но Vagrant тут совершенно лишний, т.к. есть, например, docker desktop.


  1. kWatt
    02.01.2022 13:44
    +1

    Поднять kubernetes кластер на KVM:
    minikube start --driver=kvm2

    Поднять kubernetes кластер на VirtualBox:
    minikube start --vm-driver=virtualbox

    Прокинуть образ в кластер:
    minikube image load hello-minikube:latest

    Открыть dashboard:
    minikube dashboard

    Посмотреть список URL для доступа к сервисуhello-minikube :
    minikube service list


    Правда есть одно "но", minikube по умолчанию делает активным сразу свой конфиг для kubectl:
    CURRENT  NAME  CLUSTER  AUTHINFO  NAMESPACE
    * minikube minikube minikube default


    Вроде ничего сложного.