Kubernetes помогает управлять множеством контейнеров, автоматизируя их развертывание, масштабирование и поддержание работы, что упрощает обслуживание приложений.
Kubespray — это инструмент, который помогает установить и настроить Kubernetes. Представьте, что у вас есть большой конструктор, и вам нужно собрать его правильно, чтобы все детали подходили друг к другу. И вот что делает kubespray:
Автоматическая сборка: он автоматически собирает и настраивает все части Kubernetes.
Разные платформы: работает на разных типах компьютеров и облачных сервисов.
Легкость добавления новых частей: можете легко добавлять новые компьютеры в свою систему.
Настройка под ваши нужды: можете настроить систему так, как вам нужно.
Поддержка сообщества: есть много людей, которые пользуются и улучшают его, поэтому вы всегда можете найти помощь.
Kubespray облегчает установку и настройку Kubernetes-кластера, делая процесс быстрее и менее трудоемким. Эти инструменты полезны для разработчиков, системных администраторов и IT-команд, так как упрощают управление сложными системами и ускоряют работу приложений.
В нашем случае кейс достаточно простой: установим Kubernetes кластер их трех серверов с помощью Kubespray и Ansible.
Из этих трех серверов Kubernetes кластера один сервер будет контроллером (мастер нод с IP адресом 192.168.6.102) и другие два сервера как slave ноды (192.168.6.103 и 192.168.6.104). Чтобы не зависеть от версий Python и других компонентов, все действия будем проводить на серверах с Ubuntu 22.04, где нет проблем с устаревшими пакетами и версиями Python. Это удобно для полноценного запуска 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 и дальнейшей установки 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), мы получим готовый кластер.
Следующий шаг — это подготовка компонентов 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
Для установки и настройки дашборда, который нужен для удобного управления кластера, выполняем шаги:
Запускаем команду для создания нескольких ресурсов 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
После этого открываем браузер и переходим по ссылке https://<IP-адрес-мастер-ноды>:443 и видим дашборд Kubernetes.
В этом простом кейсе мы рассмотрели установку кластера из трех серверов с использованием современных инструментов. Так гораздо легче начать работать с Kubernetes и создавать свои собственные кластеры, будь то для разработки или продакшн-среды.