Kubernetes для начинающих

Контейнеризация — один из главных трендов в IT. Это подход к разработке ПО, при котором приложение или сервис, его зависимости и конфигурация упаковываются в образ контейнера. Но у контейнеров есть один минус — сложность с настройкой масштабирования.

Чтобы устранить этот минус, появились автоматические системы управления контейнеризацией. Kubernetes — самая популярная из них. Она сочетает в себе гибкость, безопасность и мощность.

В этом материале расскажем про Kubernetes для чайников: что это, как он работает и как с ним разобраться даже начинающим. Наш гайд поможет разобраться вам с программой на начальном уровне, а стать гуру оркестрации — можно на нашем курсе Администрирование Kubernetes.

Что такое Kubernetes

Прежде чем перейти к самой программе, разберёмся с некоторыми важными понятиями:

* Оркестрация — автоматизированное управление контейнерами. 

* Контейнер — пакет ПО со всеми зависимостями. Туда входят код, среда выполнения, конфигурация и системные библиотеки. 

Теперь разберёмся, что такое Kubernetes:

* Kubernetes или K8s — это платформа с открытым исходным кодом для управления контейнерами. Она упрощает декларативную настройку и автоматизацию.

Это не традиционная Platform-as-a-Service, так как Kubernetes работает на уровне контейнеров, а не на уровне оборудования. У него есть некоторые функции PaaS, например, развёртывание, масштабирование, балансировка нагрузки, ведение логов и мониторинг. Тем не менее Kubernetes — это не монолитное решение, поэтому эти возможности считаются дополнительными. У программы есть всё для создания платформы для разработчика, но при этом за пользователем сохраняется право выбора, а также гибкость там, где это важно.

История создания

Проект появился на базе менеджера управления кластерами от Google — Borg. Название программы пошло от высокотехнологичной расы киборгов из сериала “Звёздный путь”.  

У команды Google Borg была задача создать открытое ПО для оркестровки контейнеров, которое должно было стать вкладом Google в развитие мировых технологий.

В процессе разработки проект назывался Project Seven в честь персонажа того же сериала — Seven of Nine (“Седьмая-из-девяти”). Седьмая — андроид-борг, которая смогла вернуть себе человечность. Позже проект переименовали в привычный для нас “Kubernetes”. Название пошло от греческого слова κυβερνήτης, что значит “управляющий” или “рулевой”.

Исходные коды компания представила в 2014 году, а через год появилась первая версия программы Kubernetes 1.0. Позже права на продукт перешли некоммерческому 

фонду Cloud Native Computing Foundation. Это проект Linux Foundation, куда входят Google, IBM, Red Hat, Cisco и другие крупнейшие технологические корпорации. Цель CNCF — продвижение контейнерной технологии и параллельная адаптация  технологической отрасли в соответствие с её развитием. 

Как работает технология

Рассмотрим принципы устройства и работы, а также какие задачи выполняет Kubernetes и его преимущества.

Как устроен Kubernetes

Основной принцип работы — декларативный подход. Разработчик указывает, что нужно получить, а не как это получить.

Для работы с K8s используются объекты API Kubernetes. Они дают описать желаемое состояние вашего кластера: какие приложения вы хотите запустить и сколько ресурсов для этого нужно выделить. Объекты обычно создаются через интерфейс командной строки kubectl. Хотя для взаимодействия с кластером, установки или изменения желаемого состояния API можно использовать напрямую.

Также в программе можно использовать императивные команды, такие как create, edit, delete. Они позволяют создавать, модифицировать и удалять ресурсы. Но для критически важных задач лучше ими не пользоваться.

Kubernetes — принципы работы

Для развёртывания ПО в K8s используется база Linux-контейнеров, например, Containerd или CRI-O, и описание, о котором мы говорили выше. Само развёртывание происходит на основе нод — виртуальных или физических машин.

Основные задачи Kubernetes

  1. Развёртывание контейнеров и все операции для запуска нужной конфигурации. Например, перезапуск остановившихся контейнеров или их перемещение, чтобы выделить ресурсы для новых контейнеров.
  2. Масштабирование и запуск нескольких контейнеров одновременно на большом количестве хостов.
  3. Балансировка множества контейнеров в процессе запуска. Для этого программа логически группирует контейнеры. Это даёт возможность определить их пулы, задать им размещение и распределить нагрузку.

Преимущества Kubernetes

  • Обнаружение сервисов и балансировка нагрузок. У контейнеров могут быть  собственные IP-адреса или общее имя DNS для целой группы. K8s распределяет нагрузку сетевого трафика для стабильного развёртывания. 
  • Автоматическое управление хранилищами. Это позволяет указать, какое хранилище по умолчанию будет использоваться для развёртывания. Это может быть внутреннее хранилище, хранилище внешнего облачного провайдера или другие варианты. 
  • Автоматическое внедрение и откат изменений. Пользователь может дополнять текущую конфигурацию контейнеров. А если это нарушит стабильность развёртывания, программа автоматически вернёт изменения до стабильно работающей версии. 
  • Автоматическое распределение ресурсов. K8s сам выделяет пространство и оперативную память из выделенного кластера нод. Так каждый контейнер получает всё, что нужно для его работы.
  • Управление паролями и настройками. K8s можно использовать как приложение для обработки конфиденциальной информации, например, паролей, OAuth-токенов и SSH-ключей. Данные и настройки можно обновить, не создавая контейнер заново.
  • Самовосстановление при возникновении сбоя. У программы есть специальные показатели, которые быстро находят повреждённые контейнеры. Если контейнер вышел из строя, Kubernetes его пересоздаст и перезапустит.

Начинающим это может показаться сложным, но Kubernetes — одно из самых удобных решений для оркестрации контейнеров. Он не будет работать без подготовки и дополнительных настроек, но для того мы и подготовили нашу инструкцию для чайников. 

Мы поможем вам разобраться, независимо от ваших познаний в оркестрации. Но прежде чем перейти к установке Kubernetes, мы расскажем из чего состоит программа. 

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

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

В API Kubernetes представлены объекты, которые мы можем разделить на две группы: основные и абстракции более высокого уровня. 

Основные объекты Kubernetes включают в себя:

Node

Ноды или узлы — виртуальные или физические машины, на которых разворачивают и запускают контейнеры. Ноды складываются в кластер Kubernetes.

Кластером управляет первая запущенная нода или мастер-нода. Это происходит через менеджер контроллеров и планировщик — controller manager и scheduler соответственно. Мастер-нода отвечает за интерфейс взаимодействия с пользователями через сервер API. В ней лежит хранилище “etcd” с конфигурацией кластера, метаданными и статусами объектов. 

Pod

Поды — один или больше контейнеров для совместного развёртывания на ноде. Это первичный объект развёртывания и основной логический юнит в K8s. 

Если контейнеры взаимозависимы и должны запускаться в одной ноде, программа их группирует. Это повышает скорость отклика при взаимодействии. Например, между контейнерами веб-приложения и сервиса для его кэширования.

Service

Абстрактный способ представить приложение, работающее на наборе подов, в виде сервиса. Для этого приложение не нужно никак модифицировать. Позволяет балансировать нагрузку между подами. 

Namespace

Пространство имён — объект, распределяющий ресурсы кластера между командами и проектами. Пространства имен — несколько виртуальных кластеров, запущенные на одном физическом.

Абстракции более высокого уровня дают дополнительные функции. К таким абстракциям можно отнести:

Deployment

Развёртывание — объект Kubernetes, который хранит описания подов, количество реплик и алгоритм их замены, если изменятся параметры. Контроллер развёртывания позволяет выполнять декларативные обновления, то есть описывая нужное состояние нод и наборов реплик. 

DaemonSet 

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

StatefulSet

Набор состояния позволяет развёртывать и управлять одним или несколькими подами. Особенность набора состояния в том, что у идентификаторов пода предсказуемые и сохраняемые при перезапуске значения.

ReplicaSet

Набор реплик отвечает за описание и контроль нескольких реплик подов в кластере. Чем больше реплик, тем выше устойчивость от отказов и масштабируемость приложения. Набор реплик можно создать через Deployment.

ReplicaSet — более продвинутая версия Replication Controller — традиционного способа организации репликации в кластере. 

Job/CronJob

Разовые или регулярные задания регулируют запуск выбранных подов и контролируют завершение их работы. Контроллер Job используется для разового запуска, а CronJob запускает несколько заданий по расписанию.

Установка Kubernetes

Для установки программы нужно минимум 2 Гб памяти для мастер-ноды и 1 Гб памяти для рабочей.

Также установка Kubernetes предполагает, что у вас есть один или больше серверов с операционной системой Ubuntu 16.04 и новее, Debian 9, CentOS 7, RHEL 7, Fedora 25/26, HypriotOS v1.0.1+ или Container Linux. В нашем примере рассмотрим установку на Ubuntu.

При этом важно заранее отключить раздел “swap”. Для этого в терминале нужно выполнить команду swapoff -a. Если на сервере ОС ещё не установлена, то просто не создавайте этот раздел. 

Затем открываем “/etc/fstab” с правами root и удаляем строчку “#/swapfile”.

Проект Kubernetes изначально работает на основе контейнеров Docker, сильно повышая их функциональность. Поэтому сначала нужно установить его.

Так как мы рассматриваем Kubernetes для чайников, остановимся на лёгком способе. На результат это не повлияет. Потому остановимся на версии, добавленной в репозиторий на данный момент. Разработчики её протестировали, потому такая связка Docker и Kubernetes будет работать стабильно.

Установка контейнеров на Ubuntu

Чтобы установить Docker на Ubuntu, нужны права суперпользователя. 

Вводим команду: 

apt-get update
apt-get install -y docker.io

Если нужны более новые версии контейнеров, запустите команды:

apt-get update
apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository \
           "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
        $(lsb_release -cs) \
        stable"
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io

Установка kubeadm, kubelet и kubectl

Когда Docker установлен, переходим к утилитам kubeadm, kubelet и kubectl. С ними мы сможем управлять кластером:

  • Kubectl — создаёт и настраивает объекты в кластере.
  • Kubelet — запускает контейнеры на хостах.
  • Kubeadm — настраивает компоненты кластера.

Установить эти компоненты можно так: 

apt-get update && apt-get install -y apt-transport-https software-properties-common
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
add-apt-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
apt-get update
apt-get install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
Установка kubeadm, kubelet и kubectl

Настройка Kubernetes

Чтобы настроить Kubernetes, нам предстоит создать и настроить кластер, настроить CNI, добавить ноды в кластер и получить токен авторизации.

Инициализация кластера

Чтобы создать и настроить кластер в Kubernetes, нужно указать сервер, на котором он установлен. Этот сервер будет первичным: на нём мы будем запускать все операции. Выполняем команду: 

kubeadm init --pod-network-cidr=10.244.0.0/16

В команде выше важно учитывать, что “—pod-network-cidr” у вас может быть другим. Он отличается в зависимости от сетевого плагина, который вы используете. 

В нашем примере используется плагин Flannel, который по умолчанию использует сеть “10.244.0.0/16”.

Эта команда может вызвать ошибки и предупреждения системы. Ошибки нужно обязательно исправить, а предупреждения можно упустить, если они не в окружении “production”.

Если всё правильно, на экране увидим команду, которая разрешит присоединить к хосту остальные ноды кластера. Выполняем её и сохраняем себе, так как она нам ещё пригодится. Получаем такой результат:

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

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Настройка CNI

Чтобы запускать приложения в кластере, нужно настроить Container Network Interface — сетевой интерфейс контейнера. Он нужен, чтобы настраивать взаимодействия и управлять контейнерами в кластере.

Мы расскажем, как это сделать с помощью плагина Flannel. Благодаря его простоте, это оптимальное решение для начинающих. 

Чтобы установить плагин, вводим команду:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Добавление нод в кластер

Чтобы добавить в кластер новые ноды, нужно:

  • Подключиться к серверу через SSH.
  • Установить Docker, Kubelet, Kubeadm, как мы делали до этого.
  • Выполнить команду:
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>

Это команда, которую мы получили в выводе после выполнения команды kubeadm init на мастер-ноде. 

Получение токена авторизации кластера 

Подключаемся к серверу через SSH и снова запускаем команду, которую мы получили после выполнения kubeadm init. Например:

kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>

Если токена нет, можно получить его другим способом. Выполните на мастер-ноде команду kubeadm token list

Вы получите токен, который будет действовать 24 часа. Если вы захотите добавить ноду по истечению этого времени, можно создать новый токен командой kubeadm token create

Получите примерно такой вывод:

5didvk.d09sbcov8ph2amjw

Если вы не знаете значение параметра “—discovery-token-ca-cert-hash”, его можно получить так:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'

В результате получим: 

8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78

Чтобы ввести IPv6-адрес в параметр <control-plane-host>:<control-plane-port>, адрес нужно писать в квадратных скобках: [fd00::101]:2073

Через несколько секунд нода появится в выводе команды kubectl get nodes

Дополнительные настройки

Дефолтная конфигурация не предполагает запуск контейнеров с помощью мастер-ноды. Она следит за состоянием кластера и распределяет ресурсы. Но если ввести следующую команду, вы сможете запускать контейнеры и на мастер-ноде: 

kubectl taint nodes --all node-role.kubernetes.io/master-

Проверка работоспособности кластера

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

kubectl -n kube-system get pods

В выводе должно показать системные поды Kubernetes.

Теперь базовая установка Kubernetes завершена. Дальше можно подключать дополнительные функции, например, настроить контроллер ingress, подключить диспетчер пакетов helm.

Напутствие

Теперь вы умеете устанавливать и настраивать Kubernetes — самый популярный оркестратор контейнеров. Он даёт автоматизировать развёртывание и оптимизирует процесс работы с контейнерами. Мы знаем, что настройка Kubernetes могла показаться сложной. Но если вы справились, то вы уже не начинающий пользователь. Так что не останавливайтесь, учитесь на практике и изучайте другие возможности программы. Напоминаем, что вы можете это сделать на нашем курсе по Kubernetes

Бонус

Если вы дочитали гайд до конца, но вам хочется узнать ещё что-то новое, у нас есть небольшой бонус. Рассказываем о настройке ingress — http прокси сервера Kubernetes. Сервер позволяет обращаться к ресурсам по именам.
Контроллеры ingress не запускаются автоматически вместе с кластером. Kubernetes позволяет отдельно выбрать реализацию ingress, которая лучше всего подходит для вашего кластера. Это можно сделать здесь.

Добавить комментарий

Спасибо, что поделились