Существует несколько вариантов развертывания кластера Kubernetes. Самый простой из них — Minikube или кластер на одну ноду. Подробный процесс его установки описан на официальном сайте Kubernetes. Мы же рассмотрим установку кластера на нескольких нодах, используя kubespray.
Kubespray — это набор Ansible-ролей для установки и конфигурации Kubernetes. Он обеспечивает:
- кластер высокой доступности
- поддержку большинства популярных дистрибутивов Linux
- тесты CI
Для понимания процесса установки рассмотрим структуру кластера. Кластер Kubernetes состоит из двух типов ресурсов:
- Master отвечает за управление кластером. Мастер координирует все действия в вашем кластере, такие как планирование приложений, поддержание желаемого состояния приложений, масштабирование приложений и развертывание новых обновлений.
- Node (узел) — это виртуальная машина или физический компьютер, который служит рабочим компьютером в кластере Kubernetes. У каждого узла есть Kubelet, который является агентом для управления узлом и взаимодействия с мастером Kubernetes. Узел также должен иметь инструменты для обработки контейнерных операций, такие как containerd или Docker.
При разворачивании приложения в Kubernetes, мы сообщаем Мастеру, что нужно запустить контейнеры приложений. Мастер планирует запуск контейнеров на узлах кластера. Узлы связываются с мастером с помощью Kubernetes API , который предоставляет Мастер.
Подготовка ВМ
Перейдем непосредственно к процессу установки. Подготавливаем несколько виртуальных машин. У нас будет 3 виртуальных машины с ОС Centos 7 minimal. В дальнейших статьях, посвященных Kubernetes, мы будем добавлять виртуальные машины для демонстрации всех возможностей кластера.
Адресация виртуальных машин:
- k8s-1 ip 10.15.73.41
- k8s-3 ip 10.15.73.42
- k8s-3 ip 10.15.73.43
Для каждой виртуальной машины меняем имя командой внутри гостевой ОС. Выполняем команду:
[root@k8s-1 ~]# hostnamectl set-hostname k8s-1
Здесь k8s-1 — имя первой виртуальной машины, k8s-2 и k8s-3 — второй и третьей соответственно. После применения перегружаем виртуальные машины.
Устанавливаем дополнительное ПО:
[root@k8s-1 ~]# yum install wget curl git screen python-pip sshpass
Генерируем ключ SSH:
[root@k8s-1 ~]# ssh-keygen
Копируем ключ на удаленные серверы. Выполняем команды:
[root@k8s-1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-1 [root@k8s-1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-2 [root@k8s-1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-3
Устанавливаем ansible:
[root@k8s-1 ~]# yum install ansible pip
Редактируем файл хостов для ansible:
[root@k8s-1 ~]# nano /etc/ansible/hosts
Добавляем строчки:
[k8sservers] k8s-1 k8s-2 k8s-3
Создаем новый playbook для ansible. Данный playbook необходим для подготовки серверов:
[root@k8s-1 ~]# nano pb1.yml
Содержимое файла pb1.yml:
--- - hosts: all tasks: - name: Install EPEL repo yum: name: epel-release state: present - name: Disable SELinux selinux: state: disabled - name: Disable SWAP since kubernetes can't work with swap enabled (1/2) shell: | swapoff -a - name: Disable SWAP in fstab since kubernetes can't work with swap enabled (2/2) replace: path: /etc/fstab regexp: '^([^#].*?sswaps+sws+.*)$' replace: '# 1' - name: set timezone to Europe/Moscow timezone: name: Europe/Moscow - name: Ensure firewalld service is disabled and stopped systemd: name: firewalld state: stopped enabled: no masked: yes register: firewalld_result failed_when: "firewalld_result is failed and 'Could not find the requested service' not in firewalld_result.msg" when: ansible_os_family == 'RedHat' and ansible_distribution_major_version >= '7' - name: restart server shell: 'sleep 1 && shutdown -r now "Reboot triggered by Ansible" && sleep 1' async: 1 poll: 0 become: true
Данный файл выполняет следующие действия на всех нодах:
- Подключает репозиторий EPEL
- Отключает Selinux
- Отключает Swap
- Отключает firewalld
- Меняет timezone
Эти действия необходимы для дальнейшей корректной установки и работы Kubernetes.
Выполняем команду:
[root@k8s-1 ~]# ansible-playbook pb1.yml
После выполнения, все серверы автоматически перезагрузятся. Подготовка серверов закончена, можно переходить к установке Kubernetes.
Установка Kubernetes
Делаем клон репозитория kubespray. Выполняем команду:
[root@k8s-1 ]# git clone https://github.com/kubernetes-sigs/kubespray
Последняя версия Kubespray не поддерживает установку Kubernetes ниже 1.17.0. В нашем примере мы будем устанавливать версию 1.16.x для демонстрации возможности обновления через Kubespray в дальнейших статьях. Для установки версии 1.16.14 переключаемся в ветку remotes/origin/release-2.13 репозитория.
[root@k8s-1 ]#cd kubespray [root@k8s-1 kubespray]# git checkout remotes/origin/release-2.13
Выполняем установку необходимых зависимостей:
[root@k8s-1 kubespray ]# pip install -r requirements.txt
Редактируем файл где описываем хосты и кто какую роль будет выполнять. Так же прописываем IP-адреса, которые будут использоваться:
[root@k8s-1 ]# nano /root/kubespray/inventory/sample/inventory.ini k8s-1 ansible_ssh_host=10.15.73.41 ip=10.15.73.41 k8s-2 ansible_ssh_host=10.15.73.42 ip=10.15.73.42 k8s-3 ansible_ssh_host=10.15.73.43 ip=10.15.73.43 [kube-master] k8s-1 [etcd] k8s-1 k8s-2 k8s-3 [kube-node] k8s-2 k8s-3 [k8s-cluster:children] kube-node kube-master
Меняем устанавливаемую версию. На момент написания статьи была версия 1.16.14. Редактируем файл:
[root@k8s-1 ]# nano /root/kubespray/inventory/sample/group_vars/k8s-cluster/k8s-cluster.yml
Меняем следующее значение:
## Change this to use another Kubernetes version, e.g. a current beta release kube_version: v1.16.14
Запускаем установку кластера:
[root@k8s-1 ]# cd /root/kubespray [root@k8s-1 kubespray]# ansible-playbook -u root -b -i inventory/sample/inventory.ini cluster.yml
Во время не должно быть ошибок. Если же они возникли, то необходимо исправить найденные проблемы и запустить установку кластера снова.
После установки проверяем информацию по кластеру (должно выдавать kubernetes master is running at …):
[root@k8s-1 kubespray]# kubectl cluster-info
Проверяем статус узлов (покажется список узлов, роль и статус Ready с таймингом работы):
[root@k8s-1 kubespray]# kubectl get nodes
Проверяем статус подов:
[root@k8s-1 ]# kubectl get pod -A
На этом базовая установка k8s закончена.
Мы можем помочь в настройке k8s и поддержке кластера. Оставьте заявку!