Что такое Kubernetes
Kubernetes – это популярная и мощная платформа для управления контейнерами. Она была разработана компанией Google и затем передана в Open Source проект.
Kubernetes («K8s», Кубернетис) обеспечивает оркестрацию контейнеров – это значит, что он управляет жизненным циклом контейнеров, включая их развертывание, масштабирование, обновление и управление ошибками.
Основные компоненты Kubernetes
- Мастер-узел, мастер-нода (Master Node) – это центральная часть управления кластером Kubernetes.
Основные компоненты мастер-узла включают:
- API-сервер. Принимает и обрабатывает запросы от клиентов, управляет конфигурацией и состоянием кластера.
- etcd. Распределенное хранилище данных, где хранится состояние кластера.
- Планировщик. Отвечает за назначение подов на рабочие узлы на основе требований и доступных ресурсов.
- Контроллеры. Отслеживают желаемое состояние кластера и управляют ресурсами для достижения этого состояния.
- Узлы, ноды (Nodes) – это рабочие машины в кластере, на которых запускаются контейнеры.
Основные компоненты на узлах включают:
- Kubelet. Управляет контейнерами на узле и общается с мастер-нодой.
- Kube-proxy. Отвечает за сетевую конфигурацию на узлах и маршрутизацию сетевых пакетов.
- Container Runtime. Это программное обеспечение для выполнения контейнеров, такое как Docker или containerd.
- Поды (Pods) – это наименьшая развертываемая единица в Kubernetes, содержащая один или несколько контейнеров.
- Тома (Volumes) – это механизмы для постоянного хранения данных в Kubernetes. Они могут быть подключены к подам и обеспечивать доступ к данным даже после перезапуска пода.
- Сервисы (Services) – объекты, которые позволяют создавать стабильные сетевые точки доступа к подам внутри кластера, даже если те перезапускаются или масштабируются.
Как установить Kubernetes
Kubernetes можно развернуть на различных платформах и операционных системах. Выбор зависит от ваших потребностей и предпочтений.
Минимальные требования могут варьироваться, но для построения кластеров с небольшим количеством контейнеров рекомендуется иметь:
- как минимум 2 сервера;
- CPU: 1-2;
- ОЗУ (оперативная память): 2-4 ГБ каждый.
Большие и продуктивные кластеры требуют больше вычислительных и сетевых ресурсов.
Чтобы выполнить создание кластера, мы будем использовать 2 сервера с ОC Ubuntu 22.04 LTS.
Шаг 1. Установите и настройте Docker
Для работы с Kubernetes требуется установить Docker на каждом сервере в кластере. Следуя инструкциям ниже, установите и активируйте Docker на каждом сервере:
- Откройте терминал и выполните следующую команду, чтобы обновить список доступных пакетов:
sudo apt update
- После того как список пакетов обновлен, вы можете установить Docker на сервер с помощью следующей команды:
sudo apt install docker.io -y
Флаг «-y» автоматически подтверждает все запросы на установку пакетов, так что вам не нужно будет подтверждать каждый шаг вручную.
- Настройте автозапуск Docker при включении сервера:
sudo systemctl enable docker
Она настроит Docker так, чтобы он автоматически запускался при загрузке системы. Это важно, чтобы Docker всегда был доступен после перезагрузки сервера.
- Проверьте, запущен ли Docker; выполните следующую команду:
sudo systemctl status docker
Вы увидите вывод, который покажет, что Docker работает.
Важно! Если Docker не запущен, запустите его:
sudo systemctl start docker
Теперь Docker должен быть активен и готов к использованию.
Шаг 2. Установите Kubernetes
- Для того чтобы удостовериться в подлинности программного обеспечения 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».
- Поскольку 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
- Установите инструменты Kubernetes:
sudo apt install kubeadm kubelet kubectl
Эта команда установит:
- Kubeadm (Kubernetes Admin) – инструмент, который помогает инициализировать кластер Kubernetes.
- Kubelet – компонент, который работает на каждом узле и управляет контейнерами.
- Утилитe «kubectl», которая предоставляет вам командный интерфейс для управления кластером.
- Запретите этим инструментам автоматически обновляться:
sudo apt-mark hold kubeadm kubelet kubectl
- Проверьте версию установленного «kubeadm»:
kubeadm version
Эта команда покажет информацию о версии «kubeadm». Убедитесь, что все инструменты Kubernetes успешно установлены и находятся в рабочем состоянии.
Шаг 3. Разверните Kubernetes
В этом разделе мы рассмотрим подготовку серверов к развертыванию Kubernetes.
Выполните следующие шаги на каждом сервере в кластере:
- Для начала отключите swap-память, прописав:
sudo swapoff -a
- Затем отредактируйте файл «/etc/fstab», чтобы закомментировать строку, связанную с swap:
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
Ваши действия отключат swap-память, которая может мешать работе Kubernetes.
- Откройте файл конфигурации «containerd» в текстовом редакторе:
sudo nano /etc/modules-load.d/containerd.conf
- Добавьте следующие две строки:
overlay
br_netfilter
- Сохраните файл.
- Затем используйте команду «modprobe», чтобы добавить необходимые модули:
sudo modprobe overlay
sudo modprobe br_netfilter
- Откройте файл конфигурации Kubernetes:
sudo nano /etc/sysctl.d/kubernetes.conf
- Добавьте следующие строки:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
- Сохраните файл и закройте текстовый редактор, затем перезагрузите конфигурацию сети:
sudo sysctl –system
Так вы сможете настроить сетевые параметры для Kubernetes, обеспечив правильную работу сетевых пакетов и проксирование IP-трафика между контейнерами.
- Решите, какой сервер вы хотите назначить в качестве мастер-ноды (главного узла). Затем введите следующую команду на мастер-сервере:
sudo hostnamectl set-hostname master-node
Эта команда установит имя хоста мастер-ноды – «master-node».
- Затем установите имя хоста для рабочей ноды, введя следующую команду на втором сервере:
sudo hostnamectl set-hostname worker1
Если у вас есть дополнительные рабочие ноды, используйте этот шаг, чтобы установить уникальное имя хоста для каждого из них.
- Отредактируйте файл «hosts» на каждом узле, добавив IP-адрес и имя хоста серверов, которые вы хотите добавить в кластер Kubernetes. Это позволит серверам взаимодействовать друг с другом, используя имена хостов.
- Вы можете редактировать файл «/etc/hosts». Например:
sudo nano /etc/hosts
- В файле «/etc/hosts» добавьте подобные строки для каждого сервера:
<IP-адрес> master-node
<IP-адрес> worker1
Где:
- «<IP-адрес>» – это фактический IP-адрес каждого сервера;
- «master-node» и «worker1» – это соответствующие имена хостов, которые вы назначили каждому серверу.
- После редактирования файла «/etc/hosts», сохраните изменения и закройте текстовый редактор. Теперь каждый сервер будет знать другие серверы в кластере по именам их хостов.
- Перейдите в мастер-ноду.
- Откройте файл «kubelet» в текстовом редакторе:
sudo nano /etc/default/kubelet
- Добавьте следующую строку в файл:
KUBELET_EXTRA_ARGS="--cgroup-driver=cgroupfs"
- Сохраните изменения и закройте файл.
- Перезагрузите конфигурацию:
systemctl daemon-reload
systemctl restart kubelet
- Откройте файл конфигурации Docker-демона:
sudo nano /etc/docker/daemon.json
- Добавьте следующий блок настроек:
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
- Сохраните изменения и закройте файл.
- Перезагрузите конфигурацию:
systemctl daemon-reload
systemctl restart docker
- Откройте файл конфигурации «kubelet»:
sudo nano /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
- Добавьте следующую строку:
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
- Сохраните изменения и закройте файл.
- Перезагрузите «kubelet»:
systemctl daemon-reload
systemctl restart kubelet
- Запустите кластер, введя команду.
sudo kubeadm init --control-plane-endpoint=[master-hostname] --upload-certs
Где [master-hostname] – это имя вашей мастер-ноды:
По завершении появится сообщение с информацией о команде «kubeadm join». Она служит для присоединения рабочих нод к кластеру.
- Создайте директорию для конфигурации Kubernetes-кластера:
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Эти команды создают директорию и копируют конфигурационный файл, позволяя вам управлять кластером с учетной записи пользователя.
Теперь ваша мастер-нода готова. Вы можете продолжить с присоединением рабочих узлов к кластеру.
Шаг 4. Настройте Kubernetes
В первую очередь необходимо развернуть сеть подов в кластере.
Важно! Сеть подов – это способ обеспечения связи между разными узлами в кластере. Для создания сети подов мы используем сетевой менеджер Flannel.
- Используйте «kubectl», чтобы установить Flannel:
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
Эта команда загрузит и установит Flannel в вашем кластере Kubernetes.
- Чтобы удалить Taint с узла мастера, пропишите:
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
Важно! Taint – это аннотация, которая может запрещать работу на узле мастера (control-plane node).
- Выполните следующие команды, чтобы отключить AppArmor:
sudo systemctl disable apparmor
systemctl restart containerd.service
- Используйте команду «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») на соответствующие значения вашего мастер-узла:
В выводе вы получите:
Эта команда присоедит рабочую ноду к мастер-ноде. Повторите этот шаг для каждого рабочего узла в кластере.
- Переключитесь в мастер-ноду и выполните команду:
kubectl get nodes
Эта команда отобразит статус всех нод в кластере, включая рабочие ноды, которые вы присоединили.
Если установка и настройка прошли успешно, вы увидите список нод, включая рабочие ноды, которые были добавлены в кластер.
Заключение
Выполнив все шаги, которые мы описали в этом руководстве, вы сможете установить Kubernetes и настроить его конфигурацию.
Теперь вы готовы управлять вашим кластером Kubernetes для управления контейнерами и приложениями.