Существует несколько вариантов развертывания кластера 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: '^([^#].*?\sswap\s+sw\s+.*)$'
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 и поддержке кластера. Оставьте заявку!