{"id":21748977,"url":"https://github.com/flyer-dm/k8s_cluster","last_synced_at":"2026-05-02T22:40:24.075Z","repository":{"id":185833984,"uuid":"674160298","full_name":"Flyer-DM/k8s_cluster","owner":"Flyer-DM","description":"k8s cluster deployed with ansible from kubespray on astra linux","archived":false,"fork":false,"pushed_at":"2023-08-10T10:19:18.000Z","size":1387,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-21T02:27:50.504Z","etag":null,"topics":["ansible","astra-linux","bash","crontab-task","k8s-cluster","kubernetes","kubernetes-plugin","kubespray","microservices","networking","ssh","tomcat","virtualbox"],"latest_commit_sha":null,"homepage":"","language":"Jinja","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Flyer-DM.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"code-of-conduct.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY_CONTACTS","support":null,"governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-03T09:24:22.000Z","updated_at":"2024-04-04T14:33:50.000Z","dependencies_parsed_at":null,"dependency_job_id":"1c46012e-48b5-496b-a4a7-6e55108850c0","html_url":"https://github.com/Flyer-DM/k8s_cluster","commit_stats":null,"previous_names":["flyer-dm/k8s_cluster"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Flyer-DM/k8s_cluster","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Flyer-DM%2Fk8s_cluster","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Flyer-DM%2Fk8s_cluster/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Flyer-DM%2Fk8s_cluster/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Flyer-DM%2Fk8s_cluster/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Flyer-DM","download_url":"https://codeload.github.com/Flyer-DM/k8s_cluster/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Flyer-DM%2Fk8s_cluster/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279505493,"owners_count":26181590,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-18T02:00:06.492Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","astra-linux","bash","crontab-task","k8s-cluster","kubernetes","kubernetes-plugin","kubespray","microservices","networking","ssh","tomcat","virtualbox"],"created_at":"2024-11-26T08:15:57.945Z","updated_at":"2025-10-18T09:42:01.193Z","avatar_url":"https://github.com/Flyer-DM.png","language":"Jinja","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Разворачивание трёхнодового k8s кластера\n\n## Описание\nKubernetes кластер - это несколько машин (компьютеров), которые работают вместе для запуска и управления приложениями в контейнерах, которые мы называем\n[микросервисами](https://dzen.ru/a/X-3C568ULwsX2F_N?utm_referer=yandex.ru). Kubernetes обеспечивает \nавтоматическое масштабирование, балансировку нагрузки, управление ресурсами и высокую доступность приложений в кластере.\n![kubernetes](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/018a3156-c9bc-4d5b-a42b-cc4e55213d60)\nКластер будет состоять из трёх виртуальных компьютеров (нод), установленных через [VirtualBox](https://www.virtualbox.org/): мастер-нода (управляющая кластером)\nи две worker-ноды, на которых непосредственно можно разворачивать приложения. Машины будут работать на ОС astra linux версии [orel](https://dl.astralinux.ru/astra/stable/orel/iso/orel-current.iso).\nУстанавливать все необходимые инструменты для управления кластером будем через [Ansible](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) -\nопенсорсную систему для управления конфигурациями на удалённых узлах в сети. Она позволяет автоматически настраивать и развёртывать програмное обеспечение по защищённому ssh-соединению.\nС такой системой пропадает необходимость вручную устанавливать необходимые компоненты для работоспособности кластера на множестве одинаковых машин, то есть не нужно будет выполнять\nодни и те же действия на одинаковых компьютерах. А все необходимые конфигурации для настройки самого кластера также не придётся прописывать на yaml (языке-разметки\nсценариев, который понимает ansible), все сценарии уже подготовлены в репозитории [Kubespray](https://github.com/kubernetes-sigs/kubespray) 18 версии, что соответствует\nk8s-кластеру версии v1.22.5. Kubespray версии 2.22 на данный момент является новейшим, но в ходе эксперементов сочетания разного ПО выяснилось, что версия 2.18 является самой устойчивой.\n\nP.S. Я постараюсь описать всю установку пункт за пунктом, включая возможные ошибки, которые возникали у меня, так как работа с astra linux нетривиальна, и в большинстве гайдов,\nкоторыми я пользовался, пропущены значимые моменты, однако я также могу случайно упустить некоторые пункты.\n\n### 0)Начальная настройка машин\nМинимальные требования для хост-машины: 16 Гб ОЗУ, 100+ Гб свободного места на жёстком диске, процессор от intel core i5, доступ в сеть.\n\nСоздадим три машины:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/dcfb8fbe-9a6c-4c38-b07f-d3850ac57655)\n\nКак вариант создать одну машину, провести все настройки до инициализации кластера, затем склонировать её два раза для создания worker-узлов (у клонов будет другой ip).\n\nНа мастер-ноде (m) установим 4 Гб ОЗУ, 4 ядра.\nНа рабочих нодах (w1, w2) установим по 2 Гб ОЗУ, 2 ядра (в случае клонирования просто понизить значения в настройках).\n20 Гб виртуального жёсткого диска для всех трёх будет достаточно.\nВ настройках сети у всех трёх машин добавим второй адаптер: тип подключения - виртуальный адаптер хоста (для доступа в интернет и связывания машин в одну сеть).\nНа всех трёх нодах видеопамять выкрутим до 128 Мб (для настройки виртуального монитора, который по умолчанию будет в маленьком окне).\nМожно также включить общий буфер обмена для всех машин.\n\nМастер нода:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/8fa103a3-d60b-4618-8602-6b2feb5df06b)\n\nРабочие ноды:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/8dd88d17-b0ea-4745-9b4c-85f675b494c6)\n\nВключим в настройках сети \"Виртуальные сети хоста\" с автоматическим адаптером:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/bb9f8ef9-4582-4753-820c-d03515d2e947)\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/3583467b-76ff-40a4-88a0-722341fb5a94)\n\nЗапускаем машины. Первоначальную установку лучше всего проводить не в графическом режиме. Вписываем имя машины, имя пользователя, пароль (не менее 8 символов). Выбираем часовой пояс.\nМетод разметки - \"весь диск\", выбираем наш диск, схема разметки - \"все файлы в одном разделе\", \"закончить разметку и записать изменения на диск\". Ядро для установки - дефолтное (уже выбрано будет).\nПО выбираем следующее:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/a12c52d6-ab73-4e83-98ef-d6c804257e2f)\n\nДополнительные настройки:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/37979c50-062d-44a3-a18c-08534b9f3571)\n\nУстанавливаем системный загрузчик GRUB, выбираем \"/dev/sda\", выбираем \"продолжить\" после сообщения об удачной загрузке. Входим в созданный ранее аккаунт.\n\nПосле предустановки ОС виртуальный монитор будет в маленьком окне. Это нужно исправить. Строка меню VB -\u003e \"Устройтва\" -\u003e \"Подключить образ диска Дополнительной гостевой ОС\".\n\nОткрываем терминал Fly через системные утилиты:\n```\nsudo passwd # устанавливаем пароль администратору (должен быть сложный - цифры, буквы, длиной не менее 8)\ncd /media/cdrom0\nsudo su # входим под правами админа\napt update \u0026\u0026 apt-get install bzip2 tar\napt install gcc make perl linux-headers-`uname -r`\nsh ./VBoxLinuxAdditions.run\nshutdown -r now # перезагружаем машину\n```\nПосле перезагрузки виртульный монитор будет нормально растягиваться на весь экран, заработает общий буфер обмена.\nЕсли вместо графической оболочки открывается консоль, то после ввода логина и пароля прописываем следующую команду:\n```\nstartx\n```\nЖмём правой кнопкой по рабочему столу -\u003e \"Свойства\" -\u003e \"Блокировка\" -\u003e отключим блокировку экрана:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/67065440-e6e5-4da3-a68c-3ebc475e6db5)\n\n-\u003e \"Настройки электропитания\" -\u003e отключим \"Выключение монитора\", \"События от кнопок\", \"Сон\" в \"Питание от сети\", \"Питание от батареи\", \"Низкий уровень заряда\":\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/1a95cc59-a37b-4e97-ba7f-850938a18e79)\n\nДанные действия с настройкой электропитания проделываем, так как наши машины являются виртуальными серверами, соотвественно уходить в сон или блокировать экран они\nне должны.\n\nОткрываем консоль, заходим под администратором и подключаем репозитории со стандартными пакетами (которые разрабы astra linux решили зачем-то удалить):\n```\nsudo su\necho \"deb https://deb.debian.org/debian/               buster         main contrib non-free\" \u003e\u003e /etc/apt/sources.list\necho \"deb https://security.debian.org/debian-security/ buster/updates main contrib non-free\" \u003e\u003e /etc/apt/sources.list\necho \"deb https://archive.debian.org/debian/ stretch main contrib non-free\" \u003e\u003e /etc/apt/sources.list\napt update # пробуем обновить\n```\nОбновление неудачное:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/a75ce475-495f-4461-b2ff-658a4b6da324)\n\nДобавляем запрашиваемые ключи:\n```\napt-key adv --keyserver keyserver.ubuntu.com --recv-keys 112695A0E562B32A\napt-key adv --keyserver keyserver.ubuntu.com --recv-keys 54404762BBB6E853\napt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138\napt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9\napt-key adv --keyserver keyserver.ubuntu.com --recv-keys DCC9EFBF77E11517\napt update\n```\nТеперь списки пакетов для установки успешно обновлёны. На всех машинах узнаём ip-адрес в сети следующей командой:\n```\nhostname -I\n```\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/80631d45-a1bb-4fb8-b508-7e5a0056b1dc)\n\nИх будет два, запоминаем второй. Далее редактируем файл с именами хостов следующим образом:\n```\necho \"192.168.56.111 m\" \u003e\u003e /etc/hosts\necho \"192.168.56.112 w1\" \u003e\u003e /etc/hosts\necho \"192.168.56.113 w2\" \u003e\u003e /etc/hosts\n```\nгде m - мастер нода, w1, w2 - наши рабочие ноды. \nТеперь нужно убедиться, что машины видят друг друга в сети, если уже сделали клонов. Пингуем с каждой машины каждую, выполнив следующие команды (соответственно все три машины должны быть\nвключены):\n```\nping 192.168.56.111 -c 1\nping 192.168.56.112 -c 1\nping 192.168.56.113 -c 1\nping m -c 1\nping w1 -c 1\nping w2 -c 1\n```\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/34217396-c9e0-4eb6-84a5-bfb32cb42b35)\n\nКак видно, каждая машина получила отправленный пакет.\nAnsible и kubespray не могут работать на astra linux, потому что для нашей ОС не выпущены версии. Но программы можно обмануть, так как astra linux написана на основе ubuntu,\nто следует заставить работающие на ней программы думать, что они работают на версии ubuntu. Для этого нужно поменять два системных файла: ```/etc/os-release``` и ```/etc/lsb-release```\nсо следующим содержимым:\n```\nNAME=\"Ubuntu\"\nVERSION=\"20.04.3 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.3 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n```\nи\n```\nDISTRIB_ID=Ubuntu\nDISTRIB_RELEASE=20.04\nDISTRIB_CODENAME=focal\nDISTRIB_DESCRIPTION=\"Ubuntu 20.04.3 LTS\"\n```\nсоответственно. После чего перезагружаем машины ```shutdown -r now```. Файлы **НЕЛЬЗЯ** удалять и создавать новые с данным содержимым, их следует отредактировать через nano/vim/mcedit и т.д.\nПосле перезагрузки отключаем файл подкачки (одно из требований работы k8s кластера):\n```\nsudo swapoff -a\nsudo sed -i '/ swap / s/^/#/' /etc/fstab # отключаем автоматическое включение после перезагрузки\nfree -m # проверяем, что файл выключен (последняя строка должна быть с нулевыми значениями)\n```\n\u003e [!NOTE]\n\u003e Делаем снимок состояния машин (Host+T) для возможности отката.\n\n### 1)Установка Python\nAnsible написан и работает на питоне, поэтому необходимо установить Python версии 3.7.3, на которой будут работать Ansible 2.18 и его модули, а также менеджер пакетов pip\nдля соответственной версии Python. pip по умолчанию ставится для Python 3.5, поэтому придётся устанавливать и переустанавливать его до необходимой версии.\n```\napt-get install -y curl python3.7 python3.7-dev python3.7-distutils\nupdate-alternatives --install /usr/bin/python python /usr/bin/python3.7 1\nupdate-alternatives --set python /usr/bin/python3.7\ncurl -s https://bootstrap.pypa.io/get-pip.py -o get-pip.py \u0026\u0026 python get-pip.py --force-reinstall \u0026\u0026 rm get-pip.py\npython -V # проверяем версию питона\npip -V # проверяем версию менеджера пакетов\n```\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/0265a0dc-0465-474c-96f7-89ceee6509bf)\n\n\u003e [!NOTE]\n\u003e Делаем снимок состояния.\n\n### 2)Установка необходимых пакетов\nДанные пакеты ставим на все ноды:\n```\napt install conntrack aufs-tools software-properties-common python3-apt apt-transport-https ethtool git -y\ncd /usr/lib/python3/dist-packages\n# добавим ссылки для избежания возможных багов с пакетом python3-apt:\nln -s apt_inst.cpython-35m-x86_64-linux-gnu.so apt_inst.so\nln -s apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.so\n```\nДалее нужно настроить статиченые DNS-сервера для всех машин, они требуются для будущих обновлений пакетов и установки утилит управления кластером,\nскачаем и включим необходимые сервисы:\n```\napt install resolvconf\nsystemctl enable resolvconf.service\nsystemctl start resolvconf.service\nsystemctl start systemd-resolved.service\nsystemctl enable systemd-resolved.service\nsystemctl status resolvconf.service\nsystemctl status systemd-resolved.service\n```\nСтатус должен быть зелённым со значением active. Добавим в файл ```nano /etc/resolvconf/resolv.conf.d/head``` строку ```nameserver 8.8.8.8```. Обновим файл:\n```\nresolvconf --enable-updates\nresolvconf -u # обновим добавленное значение\ncat /etc/resolv.conf # проверка изменения содержимого\n```\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/56b21328-5b32-4551-b736-284afc5af519)\n\n\u003e [!NOTE]\n\u003e Делаем снимок состояния.\n\n### 3)Обмен ssh ключами с рабочими нодами\nAnsible будет посылать разные команды на удалённые машины, в том числе на машину, на которой он работает. Для этого необходимо удалённое подключение. Наиболее удобный\nвариант это подключение через ssh-ключи без необходимости ввода пароля. Настроим такое подключение. Тут уже параллельно должны быть включены все три узла. \nAnsible не может работать от имени администратора (root), поэтому дальнейшние действия выполним через обычного пользователя **ТОЛЬКО** на управляющем узле:\n```\nssh-agent bash\nssh-keygen -t rsa -f ~/.ssh/id_rsa -P \"\" # генерация ключа\n# далее \"master\" - имя пользователя компьютера\nssh-copy-id -i $HOME/.ssh/id_rsa.pub master@192.168.56.112 # перессылка ключа первому воркеру\nssh-copy-id -i $HOME/.ssh/id_rsa.pub master@192.168.56.113 # перессылка ключа второму воркеру\nssh-copy-id -i $HOME/.ssh/id_rsa.pub master@192.168.56.111 # перессылка ключа мастеру (самому себе) для подключения ansible\ncat ~/.ssh/id_rsa.pub \u003e\u003e ~/.ssh/authorized_keys  # сохранение сгенерированного ключа для управляющей ноды\nchmod og-wx ~/.ssh/authorized_keys # изменение прав доступа к ключу для ansible\n```\n\u003e [!NOTE]\n\u003e Делаем снимок состояния.\n\n### 4)Установка kubespray-2.18\nУстановим kubespray 18 версии на управляющую ноду, пользуясь официальным руководством: https://github.com/kubernetes-sigs/kubespray.\n```\ncd /home/master\nmkdir k8s\ncd k8s\ngit clone --branch v2.18.0 https://github.com/kubernetes-sigs/kubespray\ncd kubespray/\npip install --ignore-installed -U -r requirements.txt # установка необходимых модулей для ansible\ncp -rfp inventory/sample inventory/mycluster\n# прописываем IP адреса наших машин\ndeclare -a IPS=(192.168.56.111 192.168.56.112 192.168.56.113)\nCONFIG_FILE=inventory/mycluster/hosts.yaml python contrib/inventory_builder/inventory.py ${IPS[@]}\n```\nДалее заменим содержимое файла ```/home/master/k8s/kubespray/inventory/mycluster/inventory.ini```:\n```\n[all]\nm ansible_host=192.168.56.111 ip=192.168.56.111\nw1 ansible_host=192.168.56.112 ip=192.168.56.112\nw2 ansible_host=192.168.56.113 ip=192.168.56.113\n\n\n[kube-master]\nm\n\n\n[etcd]\nm\n\n\n[kube-node]\nm\nw1\nw2\n\n\n[k8s-cluster:children]\nkube-master\nkube-node\n```\nЗдесь мы определили ip-адреса нод и их dns имена (all), управляющую ноду (kube-master), место положения распределённой БД файлов конфигурации для управления\nкластером (etcd), рабочие ноды (kube-node), в том числе и наша мастер-нода, то есть мы разрешаем разворачивать сервисы и на управляющей ноде. \nПоменяем права доступа настроенной директории:\n```\nchmod 777 -R /home/master/k8s/kubespray/ # раздача полных прав доступа\n```\nПеред инициализацией кластера поменяем один параметр в конфигурацинном файле кластера (без изменения при инициализации может появится ошибка):\n```nano /home/master/k8s/kubespray/inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml```\nменяем ```nodelocaldns_ip: 10.233.0.10```.\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/05304dce-ba33-435c-971a-377957e1d349)\n\n\u003e [!NOTE]\n\u003e Делаем снимок состояния.\n\n### 5)Инициализация кластера\nКластер сконфигурирован, теперь можно запускать установку (все узлы нашего кластера должны быть включены).\nДля запуска программы развёртывания нам понадобится перейти в директорию /home/master/k8s/ и выполнить следующую команду от лица **ПОЛЬЗОВАТЕЛЯ**:\n```\nansible-playbook ./kubespray/cluster.yml -i ./kubespray/inventory/mycluster/inventory.ini --become --become-user=root\n```\nУстановка занимает 20-30 минут, скорость интернет-соединения влияет, так как будут закачиваться файлы достаточного объёма,\nвсе логи установки будут отображаться в терминале. Красные сообщения без надписи \"FATAL\" гласят о нефатальных ошибках, установщик пропустит их.\nВ конце мы должны увидеть что-то наподобие:\n\n![Снимок экрана 2023-08-01 120654](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/c3de3ee5-9ae0-491b-8c04-4a61084a82f2)\n\nЕсли везде значение параметра \"failed\" равно 0, значит кластер успешно инициализирован.\n\n### 6)Настройка управления кластера\nПосле инициализации **НЕ ВЫКЛЮЧАТЬ** наши машины. Нужно провести некоторые настройки, чтобы после перезагрузки машин все ноды снова объединялись в кластер:\n```\nsudo su # заходим под администратора\necho \"export KUBECONFIG=/etc/kubernetes/admin.conf\" \u003e /etc/environment\nexport KUBECONFIG=/etc/kubernetes/admin.conf\nmkdir -p $HOME/.kube # создание пользовательской папки\nsudo cp /etc/kubernetes/admin.conf $HOME/.kube/config # копирование конфига кубера в пользовательскую папку\nsudo chown $(id -u):$(id -g) $HOME/.kube/config  # изменение прав доступа\n```\nТеперь мы можем управлять нашим кластером от администратора.\n\nДля начала проверим, что наши ноды соединены и готовы для работы:\n\n![Снимок экрана 2023-08-01 120746](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/fcca27a2-1a53-4e22-9985-eaeb8cc56f6f)\n\nСтатус \"READY\" означает, что всё готово, он может появится не сразу, следует подождать.\n\nТеперь посмотрим, какие \"кластерные\" поды уже работают. Pod (под) в k8s - это самая маленькая и базовая единица развертывания приложения.\nОн представляет собой группу одного или нескольких контейнеров, которые работают вместе на одном узле и имеют общую среду выполнения.\nКаждый под имеет свой уникальный IP-адрес внутри кластера и может быть настроен для доступа к различным сервисам и ресурсам. Под управляется контроллером\nрепликации или деплойментом и может быть автоматически масштабирован в зависимости от нагрузки на приложение.\nВыполним команду ```kubectl get pods -A```:\n\n![Снимок экрана 2023-08-01 121011](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/72efc58b-858a-4dbb-8a9d-d6df22b19222)\n\nВидим, что три системных пода в состоянии \"не готов\" со статусом ошибки. Исправим эту ошибку. Для этого на всех нодах нашего кластера выполним следующие действия:\nизменим определённую строку в файле ```nano /etc/kubernetes/kubelet-config.yaml``` на ```resolvConf: \"/etc/resolv.conf\"```\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/f29e163c-8a86-420a-8828-88ab012c507d)\n\n\u003e [!NOTE]\n\u003e Сделаем снимки состояния на всех машинах и перезагрузим их.\n\nПосле перезагрузки машины должны соединиться в кластер. Заходим под администратором и проверяем это:\n\n![Снимок экрана 2023-08-03 115059](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/0432fd02-38fa-4795-8659-2a58568a1241)\n\nВсе поды заработали.  *Кластер полностью настроен и готов к развёртыванию микросервисов!* \n\n### 7)Установка вспомогательных сервисов\nНастроенные утилиты дают полный контроль над кластером, но управлять системой через консоль без графического интерфейса не всегда конфортно. Гораздо удобнее, когда все данные о состоянии компонентов кластера отображаются в реальном времени с возможностью настройки конфигураций несколькими кликами без необходимости ввода множества команд в терминале linux. Для этого установим два вспомогательных сервиса: [dashboard](https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/) - графической веб-интерфейс и [metrics-server](https://github.com/kubernetes-sigs/metrics-server) для отслеживания показателей ресурсов нашего кластера. Перейдём к установке. Выполним следующую команду:\n```\nkubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml\n```\nЭто команда автоматически скачает образ микросервиса dashboard и запустит его на нашем кластере. Но мы не будем иметь доступ к сервису, то есть не сможем открыть приложение в браузере, так как по умолчанию сервис настроен как внутрикластерный, чтобы только компоненты кластера могли как-либо взаимодействовать с его ресурсами. Нужно поменять тип сервиса на NodePort, тогда k8s назначит один свободный порт из диапазона 30000-32767. После чего обратиться к сервису можно будет по ip адресу ноды, на которой он работает и номеру выделенного порта. Отредактируем файл конфигураций dashboard следующей командой:\n```\nkubectl -n kube-system edit service kubernetes-dashboard -n kubernetes-dashboard\n```\nИ поменяем type на NodePort:\n\n![Снимок экрана 2023-08-03 122914](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/d21b9c25-b274-4d55-a2a1-9636a56d234c)\n\nКубер автоматически обновит конфиг файл и перезапустит сервис. Доступ к нему появится не сразу, через 1-3 минуты. Пока настроим админский аккаунт для генерации секретного ключа для доступа к dashboard. Создадим файл ```nano dashboard_acc.yaml``` и пропишем следующее:\n```\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: admin-user\n  namespace: kube-system\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: admin-user\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: cluster-admin\nsubjects:\n- kind: ServiceAccount\n  name: admin-user\n  namespace: kube-system\n```\nПрименим конфиг файлы:\n```\nkubectl apply -f dashboard_acc.yaml\n```\nНужно сгенерировать токен для досутпа к сервису:\n```\nkubectl -n kube-system create token admin-user\n```\nТокен напечатается в консоль, копируем его. Также нужно узнать , на какой ноде запущен наш сервис и на каком порте:\n```\nkubectl get pods -A -o wide\nkubectl get services --all-namespaces\n```\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/a37070ee-2ca2-4569-aaae-0e52bf4d0585)\n\nВ нашем случае сервис запущен на ноде \"m\" с ip 192.168.56.111 на порту 30087. Открываем браузер и печатаем: \"https://192.168.56.111:30087/\".\nЖмём \"Подробности\" -\u003e \"Сделать исключение для этого сайта\". Наш dashboard открылся:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/59dae37c-de07-4776-84eb-fcabca151b46)\n\nВставляем ранее скопированный токен и получаем доступ к дашборду нашего кластера.\n\nТеперь настроим metrics-server. Возвращаемся в терминал и скачиваем образ:\n```\nwget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml\n```\nРедактируем файл: ```nano high-availability-1.21+.yaml```: добавляем строчку ```- --kubelet-insecure-tls``` в раздел \"args\":\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/17607be5-3884-4f6f-adf4-c8a01133bf11)\n\nЗапускаем сервис:\n\n```\nkubectl apply -f high-availability-1.21+.yaml\n```\nЖдём 1-2 минуты и теперь мы можем получать информацию по нагрузке на наш кластер, в том числе в графическом виде в dashboard в виде графиков:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/015393b5-2a60-4820-9039-aa582b9c27dd)\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/5542142e-2f7c-4ce8-b249-2879fe8438c0)\n\nУстановим дополнительный плагин [k9s](https://k9scli.io/) для мониторинга кластера прямо в терминале:\n```\ncurl -sS https://webinstall.dev/k9s | bash\nsource ~/.config/envman/PATH.env\n```\nЗапустим плагин командой ```k9s``` в отдельном окне терминала:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/656ff0f8-655d-4280-bba0-a32f85771de0)\n\nА чтобы добавлять встроенные в kubernetes плагины нужно установить менеджер [krew](https://krew.sigs.k8s.io/). Создадим файл ```nano install_krew.sh``` с содержимым:\n```\nset -x; cd \"$(mktemp -d)\" \u0026\u0026\ncurl -fsSLO \"https://github.com/kubernetes-sigs/krew/\" \u0026\u0026\ntar zxvf krew.tar.gz \u0026\u0026\nKREW=./krew-\"$(uname | tr '[:upper:]' '[:lower:]')_$(uname -m | sed -e 's/x86_64/amd64/' -e 's/arm.*$/arm/')\" \u0026\u0026\n\"$KREW\" install krew\n```\nСделаем его исполняемым и запустим:\n```\nchmod +x install_krew.sh\n./install_krew.sh\nexport PATH=\"${KREW_ROOT:-$HOME/.krew}/bin:$PATH # установим переменную окружения PATH\"\n```\nТеперь для установки дополнительных плагинов можно прописывать команду ```kubectl krew install \u003cимя-расширения\u003e```.\n\n\u003e [!NOTE]\n\u003e Сделаем снимок состояния мастер-ноды.\n\n### 8)Запуск микросервиса с открытым образом\nУстановим микросервис с открытым образом. Для примера возьмём [tomcat](https://tomcat.apache.org/) - веб-сервер для отладки, тестирования и запуска веб-приложений на java с открытым исходным кодом, содержащий ряд программ самоконфигурации. Перед установкой необходимо скачать исходный архив из раздела Core с файлами конфигурации для настройки пользователя c официального сайта: https://tomcat.apache.org/download-80.cgi. Распакуем в пользовательскую папку home/master.\nДобавим пользователя, для управление веб-сервисом. Для этого поменяем содержимое файла (можно удалить и создать новый с тем же именем) ```nano /home/master/tomcat-conf/conf/tomcat-users.xml``` на:\n```\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003ctomcat-users xmlns=\"http://tomcat.apache.org/xml\"\n      xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n      xsi:schemaLocation=\"http://tomcat.apache.org/xml tomcat-users.xsd\"\n      version=\"1.0\"\u003e\n      \u003crole rolename=\"manager-gui\"/\u003e\n      \u003crole rolename=\"admin-gui\"/\u003e\n      \u003cuser username=\"tomcat\" password=\"tomcat\" roles=\"manager-gui,admin-gui\"/\u003e\n\u003c/tomcat-users\u003e\n```\nДобавили пользователя с именем и паролем tomcat. Но при запуске приложения этот файл нужно подменить внутри самого контейнера. Для этого добавим пути монтирования в yaml файл деплоймента приложения. Создадим файл nano ```tomcat.yaml``` с содержимым:\n```\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: tomcat-deployment\n  labels:\n    app: tomcat\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: tomcat\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: tomcat\n    spec:\n      containers:\n      - name: tomcat-container\n        image: tomcat:8.0\n        ports:\n        - containerPort: 8080\n        volumeMounts:\n        - name: tomcat-t1\n          mountPath: /usr/local/tomcat/conf/ # монтируемый путь внутри контейнера\n      volumes:\n      - name: tomcat-t1\n        hostPath:\n          path: /home/master/tomcat-conf/conf/ # монтируемый путь на ноде\n      - name: tomcat-t1\n        configMap:\n        name: tomcat-config\n---\napiVersion: apps/v1\nkind: Service\napiVersion: v1\nmetadata:\n  name: tomcat-service\nspec:\n  type: LoadBalancer\n  selector:\n    app: tomcat\n  ports:\n  - name: http\n    protocol: TCP\n    port: 8080\n```\nТеперь нужно создать два объекта для управления хранилищем. Добавим объект хранилища PersistentVolume ёмкостью 1 Гб с режимом доступа ReadWriteOnce, позволяя только одному узлу монтировать этот объект для чтения и записи данных, и PersistentVolumeClaim, представляющий собой запрос модуля доступа к данным.\n```\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: tomcat-t1\n  labels:\n    type: local\nspec:\n  storageClassName: manual\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteOnce\n  hostPath:\n    path: \"/home/master/\"\n---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: tomcat-t1\nspec:\n  storageClassName: manual\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 1G\n```\nСоздадим наши хранилище и запустим сервис (нужно подождать пару минут, когда контейнер инициализируется и запустится):\n```\nkubectl create namespace tomcat-ns\nkubectl apply -f tomcat-pv-pvc.yaml\nkubectl apply -f tomcat.yaml -n tomcat-ns # разворачиваем сервис в созданном namespace\n```\nКонтейнер заработал на мастер ноде:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/7d4d4c31-f066-4f8d-9651-88feac54ace0)\n\nУзнаём порт, на котором тот работаем и открываем веб-сервис:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/e6eb0119-0680-4797-9fca-53a17c603e7b)\n\nПроверим наш аккаунт. Для этого открываем, например, \"Server Status\", вводим наш логин и пароль. Если открывается страница, то всё правильно настроенно:\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/1a72d1b9-7128-43ab-be42-66df6f3fcb81)\n\nНаш вмонтированный конфиг файл можно посмотреть, открыв консоль самого контейнера в dashboard (Exec):\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/c899b733-3d02-4316-8deb-0dff7d94b4a4)\n\n![image](https://github.com/Flyer-DM/k8s_cluster/assets/113033685/81123d17-21c1-45a6-9d01-a20d73a0c908)\n\nПланировщик scheduler распределил под с tomcat сервисом на ноду m, так как на неё в момент запуска контейнера была самая низкая нагрузка. Но, если бы под был развёрнут на других нодах, то приложение не получило бы доступ к вмонтированной директории, потому что этой директории на других нодах просто нет. Это нужно исправить. Для этого нужно настроить резервное копирование файлов конфигурации с мастер ноды на все остальные, при этом оно должно быть автоматическим и с постоянным обновлением, ведь файлы конфигурации могут поменяться, а вручную менять их на всех узлах кластера неудобно. Для это настроим безопасную перессылку файлов через утилиту scp с постоянным исполнением через cron. Отредактируем файл ```crontab -e```, добавив в конец строки:\n```\n*/5 * * * * scp -r /home/master/tomcat-conf/ master@w1:/home/master/\n*/5 * * * * scp -r /home/master/tomcat-conf/ master@w2:/home/master/\n```\nТеперь каждые 5 минут наша директория с конфигами tomcat будет перессылаться на рабочие ноды в ту же директорию.\n\n *Так мы запустили наш первые микросерсвис* \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflyer-dm%2Fk8s_cluster","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflyer-dm%2Fk8s_cluster","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflyer-dm%2Fk8s_cluster/lists"}