Раздел помощи SpaceWeb

Установка и настройка Kubernetes

13 дек, 2023

Что такое Kubernetes

Kubernetes – это популярная и мощная платформа для управления контейнерами. Она была разработана компанией Google и затем передана в Open Source проект. 

Kubernetes («K8s», Кубернетис) обеспечивает оркестрацию контейнеров – это значит, что он управляет жизненным циклом контейнеров, включая их развертывание, масштабирование, обновление и управление ошибками.

Основные компоненты Kubernetes

  1. Мастер-узел, мастер-нода (Master Node) – это центральная часть управления кластером Kubernetes. 

Основные компоненты мастер-узла включают:

  • API-сервер. Принимает и обрабатывает запросы от клиентов, управляет конфигурацией и состоянием кластера.
  • etcd. Распределенное хранилище данных, где хранится состояние кластера.
  • Планировщик. Отвечает за назначение подов на рабочие узлы на основе требований и доступных ресурсов.
  • Контроллеры. Отслеживают желаемое состояние кластера и управляют ресурсами для достижения этого состояния.
  1. Узлы, ноды (Nodes) – это рабочие машины в кластере, на которых запускаются контейнеры. 

Основные компоненты на узлах включают:

  • Kubelet. Управляет контейнерами на узле и общается с мастер-нодой.
  • Kube-proxy. Отвечает за сетевую конфигурацию на узлах и маршрутизацию сетевых пакетов.
  • Container Runtime. Это программное обеспечение для выполнения контейнеров, такое как Docker или containerd.
  1. Поды (Pods) – это наименьшая развертываемая единица в Kubernetes, содержащая один или несколько контейнеров.
  2. Тома (Volumes) – это механизмы для постоянного хранения данных в Kubernetes. Они могут быть подключены к подам и обеспечивать доступ к данным даже после перезапуска пода.
  3. Сервисы (Services) – объекты, которые позволяют создавать стабильные сетевые точки доступа к подам внутри кластера, даже если те перезапускаются или масштабируются.

Как установить Kubernetes

Kubernetes можно развернуть на различных платформах и операционных системах. Выбор зависит от ваших потребностей и предпочтений. 

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

  • как минимум 2 сервера;
  • CPU: 1-2;
  • ОЗУ (оперативная память): 2-4 ГБ каждый. 

Большие и продуктивные кластеры требуют больше вычислительных и сетевых ресурсов.

Чтобы выполнить создание кластера, мы будем использовать 2 сервера с ОC Ubuntu 22.04 LTS. 

Шаг 1. Установите и настройте Docker

Для работы с Kubernetes требуется установить Docker на каждом сервере в кластере. Следуя инструкциям ниже, установите и активируйте Docker на каждом сервере:

  1. Откройте терминал и выполните следующую команду, чтобы обновить список доступных пакетов:

sudo apt update

  1. После того как список пакетов обновлен, вы можете установить Docker на сервер с помощью следующей команды:

sudo apt install docker.io -y

Флаг «-y» автоматически подтверждает все запросы на установку пакетов, так что вам не нужно будет подтверждать каждый шаг вручную.   

  1. Настройте автозапуск Docker при включении сервера:

sudo systemctl enable docker

Она настроит Docker так, чтобы он автоматически запускался при загрузке системы. Это важно, чтобы Docker всегда был доступен после перезагрузки сервера.

  1. Проверьте, запущен ли Docker; выполните следующую команду:

sudo systemctl status docker

Вы увидите вывод, который покажет, что Docker работает.

Важно! Если Docker не запущен, запустите его:

sudo systemctl start docker

Теперь Docker должен быть активен и готов к использованию.

Шаг 2. Установите Kubernetes

  1. Для того чтобы удостовериться в подлинности программного обеспечения Kubernetes, которое вы собираетесь установить из нестандартного репозитория, необходимо добавить ключ подписи. 

Выполните следующие команды на каждом узле:

curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo tee /usr/share/keyrings/kubernetes.gpg

Так вы загрузите ключ подписи Kubernetes с использованием утилиты «curl» и сохраните его в безопасном месте, по умолчанию в «/usr/share/keyrings».

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

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/kubernetes.gpg] http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list

  1. Установите инструменты Kubernetes:

sudo apt install kubeadm kubelet kubectl

Эта команда установит: 

  • Kubeadm (Kubernetes Admin) – инструмент, который помогает инициализировать кластер Kubernetes. 
  • Kubelet – компонент, который работает на каждом узле и управляет контейнерами. 
  • Утилитe «kubectl», которая предоставляет вам командный интерфейс для управления кластером.

  

  1. Запретите этим инструментам автоматически обновляться:

sudo apt-mark hold kubeadm kubelet kubectl

  1. Проверьте версию установленного «kubeadm»:

kubeadm version

Эта команда покажет информацию о версии «kubeadm». Убедитесь, что все инструменты Kubernetes успешно установлены и находятся в рабочем состоянии.

Шаг 3. Разверните Kubernetes

В этом разделе мы рассмотрим подготовку серверов к развертыванию Kubernetes. 

Выполните следующие шаги на каждом сервере в кластере:

  1. Для начала отключите swap-память, прописав:

sudo swapoff -a

  1. Затем отредактируйте файл «/etc/fstab», чтобы закомментировать строку, связанную с swap:

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

Ваши действия отключат swap-память, которая может мешать работе Kubernetes.

  1. Откройте файл конфигурации «containerd» в текстовом редакторе:

sudo nano /etc/modules-load.d/containerd.conf

  1. Добавьте следующие две строки:

overlay
br_netfilter

  1. Сохраните файл.
  2. Затем используйте команду «modprobe», чтобы добавить необходимые модули:

sudo modprobe overlay
sudo modprobe br_netfilter

  1. Откройте файл конфигурации Kubernetes:

sudo nano /etc/sysctl.d/kubernetes.conf

  1. Добавьте следующие строки:

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

  1. Сохраните файл и закройте текстовый редактор, затем перезагрузите конфигурацию сети:

sudo sysctl –system

Так вы сможете настроить сетевые параметры для Kubernetes, обеспечив правильную работу сетевых пакетов и проксирование IP-трафика между контейнерами.

  1. Решите, какой сервер вы хотите назначить в качестве мастер-ноды (главного узла). Затем введите следующую команду на мастер-сервере:

sudo hostnamectl set-hostname master-node

Эта команда установит имя хоста мастер-ноды – «master-node». 

  1. Затем установите имя хоста для рабочей ноды, введя следующую команду на втором сервере:

sudo hostnamectl set-hostname worker1
Если у вас есть дополнительные рабочие ноды, используйте этот шаг, чтобы установить уникальное имя хоста для каждого из них.

  1. Отредактируйте файл «hosts» на каждом узле, добавив IP-адрес и имя хоста серверов, которые вы хотите добавить в кластер Kubernetes. Это позволит серверам взаимодействовать друг с другом, используя имена хостов. 

  

  1. Вы можете редактировать файл «/etc/hosts». Например:

sudo nano /etc/hosts

  1. В файле «/etc/hosts» добавьте подобные строки для каждого сервера:

<IP-адрес> master-node
<IP-адрес> worker1

Где: 

  • «<IP-адрес>» – это фактический IP-адрес каждого сервера;
  • «master-node» и  «worker1» – это соответствующие имена хостов, которые вы назначили каждому серверу.
  1. После редактирования файла «/etc/hosts», сохраните изменения и закройте текстовый редактор. Теперь каждый сервер будет знать другие серверы в кластере по именам их хостов.
  2. Перейдите в мастер-ноду.
  3. Откройте файл «kubelet» в текстовом редакторе:

sudo nano /etc/default/kubelet

  1. Добавьте следующую строку в файл:

KUBELET_EXTRA_ARGS="--cgroup-driver=cgroupfs"

  1. Сохраните изменения и закройте файл.
  2. Перезагрузите конфигурацию:

systemctl daemon-reload
systemctl restart kubelet

  1. Откройте файл конфигурации Docker-демона:

sudo nano /etc/docker/daemon.json

  1. Добавьте следующий блок настроек:

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
 "max-size": "100m"
  },
  "storage-driver": "overlay2"
}


  

  1. Сохраните изменения и закройте файл.
  2. Перезагрузите конфигурацию:

systemctl daemon-reload
systemctl restart docker

  1. Откройте файл конфигурации «kubelet»:

sudo nano /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

  1. Добавьте следующую строку:

Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

  1. Сохраните изменения и закройте файл.
  2. Перезагрузите «kubelet»:

systemctl daemon-reload
systemctl restart kubelet

  1. Запустите кластер, введя команду. 

sudo kubeadm init --control-plane-endpoint=[master-hostname] --upload-certs

Где [master-hostname] – это имя вашей мастер-ноды:

По завершении появится сообщение с информацией о команде «kubeadm join». Она служит для присоединения рабочих нод к кластеру. 

  1.  Создайте директорию для конфигурации Kubernetes-кластера:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Эти команды создают директорию и копируют конфигурационный файл, позволяя вам управлять кластером с учетной записи пользователя.

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

Шаг 4. Настройте Kubernetes

В первую очередь необходимо развернуть сеть подов в кластере.

Важно! Сеть подов – это способ обеспечения связи между разными узлами в кластере. Для создания сети подов мы используем сетевой менеджер Flannel.

  1. Используйте «kubectl», чтобы установить Flannel:

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

Эта команда загрузит и установит Flannel в вашем кластере Kubernetes.

  1. Чтобы удалить Taint с узла мастера, пропишите:

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

Важно! Taint – это аннотация, которая может запрещать работу на узле мастера (control-plane node).

  1. Выполните следующие команды, чтобы отключить AppArmor:
systemctl stop apparmor
sudo systemctl disable apparmor
systemctl restart containerd.service
  1. Используйте команду «kubeadm join» на рабочих нодах, чтобы присоединить их к мастер-ноде. Повторите шаги на каждой рабочей ноде, которую вы хотите добавить в кластер.

kubeadm join [master-node-ip]:6443 --token abcdef.1234567890abcdef --discovery-token-ca-cert-hash sha256:1234..cdef

Где замените значения «[master-node-ip]», токен («--token») и хеш сертификата--discovery-token-ca-cert-hash») на соответствующие значения вашего мастер-узла:

В выводе вы получите: 


Эта команда присоедит рабочую ноду к мастер-ноде. Повторите этот шаг для каждого рабочего узла в кластере.

  1. Переключитесь в мастер-ноду и выполните команду:

kubectl get nodes

Эта команда отобразит статус всех нод в кластере, включая рабочие ноды, которые вы присоединили. 

Если установка и настройка прошли успешно, вы увидите список нод, включая рабочие ноды, которые были добавлены в кластер.

Заключение

Выполнив все шаги, которые мы описали в этом руководстве, вы сможете установить Kubernetes и настроить его конфигурацию. 

Теперь вы готовы управлять вашим кластером Kubernetes для управления контейнерами и приложениями.