Установка и настройка кластера Kubernetes на Ubuntu Server

  • Михаил
  • 12 мин. на прочтение
  • 122
  • 20 Jun 2022
  • 21 Nov 2022

https://www.dmosk.ru/instruktions.php?object=kubernetes-ubuntu

Подготовка системы

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

Настройка системы

1. Задаем имена узлам. Для этого выполняем команды на соответствующих серверах:

hostnamectl set-hostname k8s-master1.dmosk.local
hostnamectl set-hostname k8s-worker1.dmosk.local
hostnamectl set-hostname k8s-worker2.dmosk.local

* в данном примере мы зададим имя k8s-master1 для мастера и, соответственно, k8s-worker1 и k8s-worker2 — для первого и второго рабочих нод. Каждая команда выполняется на своем сервере.

Необходимо, чтобы наши серверы были доступны по заданным именам. Для этого необходимо на сервере DNS добавить соответствующие А-записи. Или на каждом сервере открываем hosts:

vi /etc/hosts

И добавляем записи на подобие: 

192.168.0.15     k8s-master1.dmosk.local k8s-master1

192.168.0.20     k8s-worker1.dmosk.local k8s-worker1

192.168.0.25     k8s-worker2.dmosk.local k8s-worker2

* где, 192.168.0.15, 192.168.0.20, 192.168.0.25 — IP-адреса наших серверов, k8s-master1, k8s-worker1, k8s-worker2 — имена серверов, dmosk.local — наш внутренний домен.

2. Устанавливаем необходимые компоненты — дополнительные пакеты и утилиты. Для начала, обновим список пакетов и саму систему:

apt-get update && apt-get upgrade

Выполняем установку пакетов:

apt-get install curl apt-transport-https git iptables-persistent

* где:

  • git — утилита для работы с GIT. Понадобиться для загрузки файлов из репозитория git.
  • curl — утилита для отправки GET, POST и других запросов на http-сервер. Понадобиться для загрузки ключа репозитория Kubernetes.
  • apt-transport-https — позволяет получить доступ к APT-репозиториям по протоколу https.
  • iptables-persistent — утилита для сохранения правил, созданных в iptables (не обязательна, но повышает удобство).

В процессе установки iptables-persistent может запросить подтверждение сохранить правила брандмауэра — отказываемся.

3. Отключаем файл подкачки. С ним Kubernetes не запустится.

Выполняем команду для разового отключения:

swapoff -a

Чтобы swap не появился после перезагрузки сервера, открываем на редактирование файл:

vi /etc/fstab

И комментируем строку: 

#/swap.img      none    swap    sw      0       0

4. Загружаем дополнительные модули ядра.

vi /etc/modules-load.d/k8s.conf

br_netfilter
overlay

* модуль br_netfilter расширяет возможности netfilter (подробнее); overlay необходим для Docker.

Загрузим модули в ядро:

modprobe br_netfilter
modprobe overlay

Проверяем, что данные модули работают:

lsmod | egrep "br_netfilter|overlay"

Мы должны увидеть что-то на подобие:

overlay               114688  10
br_netfilter           28672  0
bridge                176128  1 br_netfilter

5. Изменим параметры ядра.

Создаем конфигурационный файл:

vi /etc/sysctl.d/k8s.conf 

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

net.bridge.bridge-nf-call-iptables контролирует возможность обработки трафика через bridge в netfilter. В нашем примере мы разрешаем данную обработку для IPv4 и IPv6.

Применяем параметры командой:

sysctl --system

Брандмауэр

Для мастер-ноды и рабочей создаем разные наборы правил.

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

1. На мастер-ноде (Control-plane)

Выполняем команду:

iptables -I INPUT 1 -p tcp --match multiport --dports 6443,2379:2380,10250:10252 -j ACCEPT

* в данном примере мы открываем следующие порты:

  • 6443 — подключение для управления (Kubernetes API).
  • 2379:2380 — порты для взаимодействия мастера с воркерами (etcd server client API).
  • 10250:10252 — работа с kubelet (соответственно API, scheduler, controller-manager).

Для сохранения правил выполняем команду:

netfilter-persistent save

2. На рабочей ноде (Worker):

На нодах для контейнеров открываем такие порты:

iptables -I INPUT 1 -p tcp --match multiport --dports 10250,30000:32767 -j ACCEPT

* где:

  • 10250 — подключение к kubelet API.
  • 30000:32767 — рабочие порты по умолчанию для подключения к подам (NodePort Services).

Сохраняем правила командой:

netfilter-persistent save

 

 

 

 

Удаление нод

При необходимости удалить ноду из нашего кластера, вводим 2 команды:

kubectl drain k8s-worker2.dmosk.local --ignore-daemonsets
kubectl delete node k8s-worker2.dmosk.local

* в данном примере мы удаляем ноду k8s-worker2.dmosk.local.