Установка кластера Kubernetes
с помощью Kubespray и Ansible

Рассказываем, как установить кластер простым и более автоматизированным способом — с помощью инструментов Kubespray и Ansible. Это статья для новичков.

Зачем нужен Kubernetes

  • Организация контейнеров: он следит за тем, чтобы все контейнеры работали правильно и перезапускает их, если что-то пойдет не так.
  • Масштабирование: если вашим приложениям нужно больше мощности, Kubernetes добавит больше контейнеров. Если нужно меньше — уберет лишние.
  • Высокая доступность: Kubernetes распределяет нагрузку, чтобы все работало без сбоев, даже если один контейнер выйдет из строя.
  • Обновления без остановки: вы можете обновлять свои приложения, не выключая их.
  • Интеграция с инструментами разработки: он хорошо работает с инструментами, которые помогают разработчикам быстро выпускать новые версии программ.

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

Зачем нужен Kubespray

Kubespray — это инструмент, который помогает установить и настроить Kubernetes. Представьте, что у вас есть большой конструктор, и вам нужно собрать его правильно, чтобы все детали подходили друг к другу. И вот что делает kubespray:


Автоматическая сборка: он автоматически собирает и настраивает все части Kubernetes.

Разные платформы: работает на разных типах компьютеров и облачных сервисов.

Легкость добавления новых частей: можете легко добавлять новые компьютеры в свою систему.

Настройка под ваши нужды: можете настроить систему так, как вам нужно.

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


Kubespray облегчает установку и настройку Kubernetes-кластера, делая процесс быстрее и менее трудоемким. Эти инструменты полезны для разработчиков, системных администраторов и IT-команд, так как упрощают управление сложными системами и ускоряют работу приложений.

Установка Kubernetes на практике

В нашем случае кейс достаточно простой: установим Kubernetes кластер их трех серверов с помощью Kubespray и Ansible.


Из этих трех серверов Kubernetes кластера один сервер будет контроллером (мастер нод с IP адресом 192.168.6.102) и другие два сервера как slave ноды (192.168.6.103 и 192.168.6.104). Чтобы не зависеть от версий Python и других компонентов, все действия будем проводить на серверах с Ubuntu 22.04, где нет проблем с устаревшими пакетами и версиями Python. Это удобно для полноценного запуска Ansible.

Установка Kubespray, Ansible и всего окружения

Для начала подготовим окружение серверов, установив Python и подготовив публичные ssh ключи — это необходимо для запуска Kubespray в будущем.


#Обновление пакетов:
sudo apt update
#Установка Python:
sudo apt install python3.10-venv python3.10-dev -y
#Убедиться что Python установился:
python3 --version 
#Результат должен быть в виде Python 3.10.6
#Установка Ansible:
sudo apt install ansible
#Установка необходимых Python пакетов:
sudo pip3 install jinja2
#Сгенерируем SSH ключ и cкопируем их на наши сервера которые будут частью кластера:
ssh-keygen
ssh-copy-id root@192.168.6.102
ssh-copy-id root@192.168.6.103
ssh-copy-id root@192.168.6.104
#Клонируем репозиторий Kubespray.
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
#Запускаем следующую команду:
VENVDIR=kubespray-venv и KUBESPRAYDIR=kubespray
#Это задает переменные окружения. VENVDIR устанавливается в kubespray-venv, а KUBESPRAYDIR — в kubespray. Они используются для хранения путей к виртуальному окружению и каталогу Kubespray
#Создадим виртуальное окружение Python в каталоге, указанном в переменной VENVDIR:
python3 -m venv $VENVDIR
#Виртуальное окружение позволяет изолировать зависимости проекта от системных пакетов Python
#Запускаем команду, которая активирует виртуальное окружение:
source $VENVDIR/bin/activate
#Запускаем команду, которая изменяет текущий рабочий каталог на каталог, указанный в переменной kubespray:
cd $KUBESPRAYDIR
#Установка необходимых зависимостей для проекта, перечисленных в файле requirements.txt:
pip install -U -r requirements.txt

Подготовка конфигурации в Kubespray

Окружение для запуска Kubespray и дальнейшей установки Kubernetes кластера готово. Теперь необходимо подготовить inventory и все конфигурации, которые будут задавать значения, и всё из чего будет состоять наш кластер.


#Создаем папку внутри inventory директории, где будут лежать конфигурации нод нашего кластера:
cp -rfp inventory/sample/mycluster

Теперь делаем конфиг-файл с хостами и ролями:

declare -a IPS=(192.168.6.102 192.168.6.103 192.168.6.104)

CONFIG_FILE=inventory/mycluster/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

Должны получить файл inventory/mycluster/hosts.yml — в нем описаны все IP адреса серверов и их назначение (какой сервер будет master, а какие сервера - worker/slave нодами), чаще всего его нужно отредактировать вручную, чтобы получилось так:


all:
  hosts:
    master:
      ansible_host: 192.168.6.102
      ip: 192.168.6.102
      access_ip: 192.168.6.102
    node1:
      ansible_host: 192.168.6.103
      ip: 192.168.6.103
      access_ip: 192.168.6.103
    node2:
      ansible_host: 192.168.6.104
      ip: 192.168.6.104
      access_ip: 192.168.6.104
  children:
    kube_control_plane:
      hosts:
        master:
    kube_node:
      hosts:
        node1:
        node2:
    etcd:
      hosts:
        master:
    k8s_cluster:
      children:
        kube_control_plane:
        kube_node:
    calico_rr:
      hosts: {}

Здесь описано, что у нас на сервере master устанавливается контрольная панель, и etcd запускается только на нем.


Открываем файл nano inventory/mycluster/group_vars/all/all.yml и редактируем следующие значения:


ntp_enabled: true
ntp_manage_config: true
ntp_servers:
  - "0.pool.ntp.org iburst"
  - "1.pool.ntp.org iburst"
  - "2.pool.ntp.org iburst"
  - "3.pool.ntp.org iburst"
...
upstream_dns_servers:
  - 8.8.8.8
  - 8.8.4.4
...
unsafe_show_logs: true

Открываем файл nano inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml и редактируем следующее:


kube_network_plugin: flannel
...
kube_proxy_mode: iptables
...
cluster_name: myclusterexample.com

Открываем файл nano inventory/mycluster/group_vars/k8s_cluster/addons.yml и редактируем следующее


helm_enabled: true
...
metrics_server_enabled: true

Helm — популярный пакетный менеджер для Kubernetes. Он позволяет легко устанавливать и управлять приложениями в кластере Kubernetes.


Metrics Server — компонент для сбора и предоставления метрик ресурсов (таких как CPU и память) в кластере Kubernetes. Эти метрики могут использоваться для автомасштабирования и мониторинга производительности.


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


ansible-playbook -i inventory/mycluster/hosts.yaml --become cluster.yml --become-user=root

И если все хорошо, после завершения работы Ansible (примерно минут 10 - 15), мы получим готовый кластер.

Установка базовых компонентов Kubernetes в кластере

Следующий шаг — это подготовка компонентов Kubernetesa как Ingress (управляет внешним доступом к сервисам, обеспечивая маршрутизацию трафика, безопасность через HTTPS и поддержку виртуальных хостов) и дашборд для удобства работы с кластером и общего мониторинга.


Все последующие команды запускаем на мастер ноде (192.168.6.102):

Устанавливаем Ingress при помощи helm, который должен был установиться в результате работы Ansible:


helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install mynewingress ingress-nginx/ingress-nginx
helm show values ingress-nginx/ingress-nginx > ingress-values.yaml

Открываем на редактирование файл ingress-values.yaml и находим строку: externalIPs: [].


#Комментируем ее и добавляем строки:

#externalIPs: []
externalIPs:
- <IP-address>

#Вместо <IP-address> указываем свой внешний IP адрес для кластера.

Применяем изменения к уже установленному Ingress

helm upgrade --install -f ingress-values.yaml nascingress ingress-nginx/ingress-nginx


Для установки и настройки дашборда, который нужен для удобного управления кластера, выполняем шаги:

  1. Скачиваем файл recommended.yaml отсюда

Запускаем команду для создания нескольких ресурсов Kubernetes, таких как namespace, service account, роли, секреты и т.д : kubectl create -f recommended.yaml


И в результате видим:

Далее создаем админ аккаунт для дашборда nano create-dashboard-adminuser.yaml и добавляем следующие значения:


apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

Запускаем команду для создания админ аккаунта: kubectl apply -f create-dashboard-adminuser.yaml


Выдаем права админ пользователю nano service_acc.yaml


Ставим следующие значения:


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

Запускаем kubectl apply -f service_acc.yaml и генерируем токен для входа в дашборд:

kubectl -n kubernetes-dashboard create token admin-user --duration=8760h --output yaml


где --duration=8760h - это срок действия токена в часах. Токен обязательно нужно сохранить в безопасном месте

После этого открываем браузер и переходим по ссылке https://<IP-адрес-мастер-ноды>:443 и видим дашборд Kubernetes.

Заключение

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

Ответим на все вопросы по переносу, сборке, оркестрации и развертывании.
Настроим ваш Kubernetes