K8s для начинающих
Применение контейнеризации стало неотъемлемой частью процесса разработки и тестирования программного обеспечения. Контейнеры позволяют разработчикам упаковывать приложения вместе со всеми зависимостями, обеспечивая их стабильную работу в любом окружении. Однако с ростом числа контейнеров возникает необходимость в эффективном управлении ими. Здесь на помощь приходит Kubernetes (K8s).
Что такое Kubernetes (или, как часто русифицируют название, «Кубернетис»)? Это мощная платформа для оркестрации контейнеров, которая позволяет автоматизировать развертывание, управление и масштабирование приложений. Эта статья будет полезна тем, кто только начинает знакомство с Kubernetes. Мы рассмотрим основные понятия, разберем ключевые компоненты и архитектуру платформы, обсудим ее преимущества и расскажем, как установить Kubernetes. Эта информация поможет вам понять, как Kubernetes может повысить эффективность и надежность ваших приложений, а также ускорить процессы разработки и развертывания.
Kubernetes (K8s) — что это простыми словами?
Попробуем пояснить понятие Kubernetes простыми словами. Kubernetes (K8s) — это платформа с открытым исходным кодом для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями. Kubernetes был разработан компанией Google в 2014 году и с тех пор стал одним из самых популярных инструментов для оркестрации контейнеров. По данным Datadog, его использует почти половина компаний, применяющих контейнеризацию в разработке.
Основная цель Kubernetes — предоставить способ управления приложениями в контейнерах в распределенных средах, обеспечивая автоматическое восстановление, масштабирование и балансировку нагрузки.
Что такое контейнеры и чем они полезны
Контейнеры — это легковесные и изолированные окружения для выполнения приложений. Они содержат в себе все необходимые для работы приложения компоненты: код, библиотеки, иные зависимости и системные инструменты. Контейнеры позволяют запускать приложения в любых средах (на ПК, серверах, в облаке) без модификации кода, а также контейнеры, управляемые платформой Kubernetes, помогают изолировать приложения и зависимости.
Контейнеры обеспечивают изоляцию приложений на уровне операционной системы и используют общие ресурсы ядра ОС, позволяя задать ограничения для каждого отдельного контейнера: процессор, память, полоса сетевого доступа, полоса и количество операций с дисками. В отличие от виртуальных машин, контейнеры не содержат собственную копию операционной системы и обладают свойствами изоляции при совместном использовании одной ОС приложениями, поэтому они считаются легковесными.
Контейнеры стали популярными благодаря следующим преимуществам:
- Изоляция приложений. Контейнеры изолируют приложения и их зависимости. Это предотвращает конфликты между приложениями, работающими на одном сервере.
- Портативность. Контейнеры можно запускать в различных средах разработки без изменения конфигурации. Приложения в контейнерах можно переносить между различными ОС и облачными платформами.
- Масштабируемость. Контейнеры можно легко создавать или удалять, чтобы поддерживать оптимальную производительность приложений.
- Автоматизация. Процесс создания, развертывания и управления контейнерами может быть легко автоматизирован и включать механизмы самовосстановления и откатов.
- Экономия ресурсов. Контейнеры более легковесные, чем виртуальные машины. Благодаря этому можно запускать больше приложений на меньшем количестве серверов и снижать затраты на инфраструктуру.
Компоненты и архитектура Kubernetes
Архитектура Kubernetes построена на принципах модульности и масштабируемости. Она включает в себя множество компонентов, о которых расскажем ниже.
Концепции
CSI (Container Storage Interface) — интерфейс для интеграции систем хранения данных с Kubernetes. Он позволяет подключать сторонние системы хранения данных через API.
Реализации CSI:
- ceph,
- openebs,
- linstor.
CNI (Container Network Interface) — интерфейс для сетевой конфигурации контейнеров, который используется для управления сетью и взаимодействия между подами.
Реализации CNI:
- flannel,
- calico,
- cilium.
CRI (Container Runtime Interface) — интерфейс для взаимодействия Kubernetes с различными средами выполнения контейнеров.
Реализации CRI:
- containerd,
- CRI-O.
Кластеры и типы узлов
Кластеры — совокупность узлов (серверов), которые работают вместе для выполнения контейнеризованных приложений. Кластеры состоят из двух типов узлов: control plane и worker node.
- Control Plane (Master node) — главный узел, который выполняет задачи по управлению и администрированию K8s-кластеров. Он включает в себя:
- kube-apiserver — обеспечивает взаимодействие с Kubernetes через REST API или gRPC;
- etcd — распределенное хранилище данных, нативно поддерживаемое Kubernetes. Хранит все данные о кластере в виде ключ-значение;
- kube-controller-manager — следит за состоянием кластера и управляет различными контроллерами;
- kube-scheduler — определяет, на каких нодах будут запущены контейнеры;
- Kubelet — агент, работающий на каждом узле и следящий за состоянием подов (pods);
- Container Runtime — среда для запуска контейнеров. K8s поддерживает различные среды выполнения контейнеров, например, Containerd или CRI-O.
- Worker nodes — это рабочие узлы, которые включают в себя:
- Kubelet;
- Kube-proxy — сетевой прокси-сервер, который позволяет конфигурировать сетевые правила на узлах;
- Container Runtime.
Типы приложений по функциональному назначению
Приложения в Kubernetes запускаются внутри подов (pods) — наборов работающих контейнеров в кластере. Каждый под имеет свой жизненный цикл. К примеру, если на узле с запущенными подами произойдет сбой, все поды выйдут из строя. Такой сбой будет считаться необратимым: для восстановления нужно будет создать новые поды, даже если позже узел заработает. Чтобы облегчить управление и не контролировать каждый под вручную, в K8s были добавлены контроллеры.
Контроллеры — компоненты, которые следят за состоянием кластера или какого-либо ресурса в Kubernetes и выполняют различные действия для поддержания желаемого состояния.
Основные контроллеры:
- Deployment — управляет развертыванием и обновлением подов. Он обеспечивает декларативное управление состоянием приложений, позволяет легко масштабировать приложения и управлять стратегиями обновления.
- ReplicaSet — гарантирует, что запущено определенное количество идентичных подов. Он используется для обеспечения стабильной работы приложения, автоматически заменяя поды, которые перестали работать или были удалены.
- StatefulSet — используется для управления приложениями с отслеживанием состояния. StatefulSet управляет порядком развертывания, масштабирования и обновления подов.
- DaemonSet — гарантирует, что на всех или некоторых узлах запускается экземпляр пода. Часто используется для развертывания системных демонов, инструментов мониторинга и логирования.
Типы ресурсов
- Pods — наименьшая и наиболее простая единица развертывания в Kubernetes, состоящая из одного или нескольких контейнеров.
- Services — ресурс, который подключает набор подов к абстрактному имени сервиса и IP-адресу.
- Ingress — ресурс, который управляет внешним доступом к сервисам в кластере, обычно через HTTP/HTTPS. Ingress определяет правила маршрутизации и может обеспечивать балансировку нагрузки, SSL-терминацию и виртуальный хостинг на основе имени.
- ConfigMaps — используется для хранения неконфиденциальных данных конфигурации в виде пар ключ-значение. ConfigMaps позволяет управлять конфигурацией приложений отдельно от контейнерных образов, что облегчает обновление конфигураций без пересборки образов.
- Secrets — используется для хранения конфиденциальной информации, такой как пароли, токены, ключи K8s API. Secrets помогают избежать хранения чувствительных данных в открытом виде в манифестах подов или контейнерных образах.
Преимущества Kubernetes
- Автоматическое восстановление. Kubernetes автоматически перезапускает поды, которые перестали работать, перемещает поды на рабочие ноды, убирает и заменяет поды, не прошедшие проверку состояния.
- Масштабируемость. K8s позволяет легко масштабировать приложения как вертикально (добавляя больше ресурсов для каждого отдельного контейнера), так и горизонтально (добавляя больше экземпляров подов).
- Автоматизация развертывания и управления. Kubernetes предоставляет ряд API и механик работы отдельных ресурсов, которые позволяют построить инструменты для автоматического развертывания, обновления и отката приложений. С их помощью можно интегрировать процессы CI/CD и обеспечить быстрое и надежное обновление приложений без простоев.
- Безопасность. Kubernetes обеспечивает изоляцию приложений на уровне контейнеров, а также изоляцию от слоя управления кластером.
- Балансировка нагрузки. Kubernetes автоматически распределяет трафик между подами, обеспечивая высокую доступность приложения.
- Экономия ресурсов. K8s управляет легковесными контейнерами. Это позволяет эффективно использовать вычислительные ресурсы и снижает затраты на инфраструктуру.
- Поддержка микросервисной архитектуры. Kubernetes позволяет управлять множеством небольших, независимо разрабатываемых и развертываемых сервисов. Это дает возможность масштабирования, позволяет стандартизировать подходы, упрощает обновление кода и продуктов в целом, позволяет легко откатывать изменения и многое другое.
Как установить Kubernetes
Ниже мы расскажем, как развернуть Kubernetes вручную. Если вы хотите сэкономить время на установке и развертывании кластера, закажите готовое решение KaaS — создание кластера займет не более одной минуты. Готовые кластеры Kubernetes не требуют навыков администрирования: специалисты Рег.ру возьмут на себя всю работу по обслуживанию, поддержке и обеспечению безопасности кластеров.
Kubernetes можно развернуть различными способами: через kubeadm, kOps, kubespray, с помощью cluster API и другие. В этой статье мы развернем кластер через kubeadm.
Kubeadm — инструмент, который используется для создания кластеров K8s. Он выполняет действия, необходимые для быстрого запуска минимально жизнеспособного кластера. Kubeadm также служит «строительным блоком» для более высокоуровневых инструментов, таких как kubespray.
Подготовка кластера Kubernetes с другими инструментами требует времени, ресурсов сервера и опыта. Kubeadm прост в освоении и подходит для случаев, когда необходимо быстро развернуть кластер с минимальными ресурсами.
Установка будет производиться на серверы с операционной системой Ubuntu. В качестве примера мы установим одну master node с именем k8s-master и одну worker node с именем k8s-worker.
Подготовка к установке
- На всех нодах откройте файл /etc/hosts в любом текстовом редакторе, например nano:
1 |
sudo nano /etc/hosts |
- Удалите строку с IP-адресом вашего сервера. Затем добавьте записи:
1 2 |
IP_MASTER_NODE k8s-master IP_WORKER_NODE k8s-worker |
Где:
- IP_MASTER_NODE — IP-адрес мастер-ноды,
- IP_WORKER_NODE — IP-адрес рабочей ноды.
Чтобы сохранить изменения и закрыть файл, нажмите Ctrl+X, Y, Enter.
- Измените имя хоста в master node:
1 |
<em>sudo hostnamectl set-hostname k8s-master</em> |
- Измените имя хоста в worker node:
1 |
sudo hostnamectl set-hostname k8s-worker |
- Перезайдите на каждый из серверов.
Установка Kubernetes
На всех нодах проделайте следующие шаги:
- Введите команды:
1 2 |
sudo apt update sudo apt upgrade -y |
- Установите необходимые пакеты с помощью команды:
1 |
sudo apt-get install -y apt-transport-https ca-certificates curl gpg gnupg2 software-properties-common |
- Создайте директорию /etc/apt/keyrings:
1 |
mkdir /etc/apt/keyrings |
- Добавьте GPG-ключ репозитория:
1 |
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg |
- Добавьте репозиторий K8s с помощью команды:
1 |
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg |
- Обновите список доступных пакетов с помощью команды:
1 |
sudo apt-get update |
Обратите внимание: во время выполнения этой команды может возникнуть ошибка 403:
1 2 |
E: Failed to fetch https://apt.kubernetes.io/dists/kubernetes-xenial/InRelease 403 Forbidden [IP: 2600:1901:0:26f3:: 443] E: The repository 'https://apt.kubernetes.io kubernetes-xenial InRelease' is not signed. |
Проблема возникает из-за подключения к серверам по IPv6. Чтобы ее устранить, можно отключить использование IPv6.
Чтобы временно (до перезагрузки) отключить использование IPv6, введите команды:
1 2 3 |
sysctl -w net.ipv6.conf.all.disable_ipv6=1 sysctl -w net.ipv6.conf.default.disable_ipv6=1 sysctl -w net.ipv6.conf.lo.disable_ipv6=1 |
Чтобы включить IPv6, воспользуйтесь командами:
1 2 3 |
sysctl -w net.ipv6.conf.all.disable_ipv6=0 sysctl -w net.ipv6.conf.default.disable_ipv6=0 sysctl -w net.ipv6.conf.lo.disable_ipv6=0 |
Чтобы полностью отключить использование IPv6, откройте файл /etc/sysctl.conf:
1 |
nano /etc/sysctl.conf |
Добавьте в него параметры:
1 2 3 |
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 |
После сохраните изменения и закройте файл, нажав Ctrl+X, Y, Enter.
- Установите необходимые пакеты с помощью команды:
1 |
sudo apt-get install -y kubelet kubeadm kubectl vim git curl wget |
- Отключите автоматическое обновление kubelet, kubeadm и kubectl:
1 |
sudo apt-mark hold kubelet kubeadm kubectl |
- Включите kubelet с помощью команды:
1 |
sudo systemctl enable --now kubelet |
- Проверьте установленную версию kubeadm:
1 |
kubeadm version |
- Отключите подкачку памяти:
1 |
sudo swapoff -a |
Включение модулей ядра и изменение настроек sysctl
На всех нодах проделайте следующие шаги:
- Включите модули overlay и br_netfliter с помощью команд:
1 2 |
sudo modprobe overlay sudo modprobe br_netfilter |
- Настройте sysctl. Для этого откройте файл kubernetes.conf:
1 |
sudo nano /etc/sysctl.d/kubernetes.conf |
- Добавьте в файл следующие параметры:
1 2 3 |
net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 |
Чтобы сохранить изменения и закрыть файл, нажмите Ctrl+X, Y, Enter.
- Перезапустите sysctl с помощью команды:
1 |
sudo sysctl --system |
Установка Containerd
На всех нодах проделайте следующие шаги:
- Включите постоянную загрузку модулей Containerd при помощи команды (обратите внимание: нужно ввести сразу все 4 строки):
1 2 3 4 |
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF |
- Выполните перезагрузку sysctl:
1 |
sudo sysctl --system |
- Добавьте GPG-ключ для репозитория с помощью команды:
1 |
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - |
- Добавьте репозиторий Docker при помощи команды:
1 |
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" |
- Обновите список доступных пакетов и установите Сontainerd:
1 2 |
sudo apt update sudo apt install containerd.io -y |
- Авторизуйтесь под пользователем root:
1 |
sudo su - |
- Создайте новую директорию для Сontainerd с помощью команды:
1 |
mkdir -p /etc/containerd |
- Добавьте в директорию конфигурационный файл:
1 |
containerd config default>/etc/containerd/config.toml |
- Откройте файл config.toml в любом текстовом редакторе, например nano:
1 |
nano /etc/containerd/config.toml |
- Измените значение параметра SystemdCgroup на true:
1 |
SystemdCgroup = true |
После сохраните изменения и закройте файл, нажав Ctrl+X, Y, Enter.
- Выйдите из-под root-пользователя:
1 |
exit |
- Выполните перезагрузку Containerd:
1 |
sudo systemctl restart containerd |
- Включите автоматический запуск службы Containerd:
1 |
sudo systemctl enable containerd |
Развертывание Kubernetes
- Войдите в k8s-master и извлеките образы контейнеров:
1 |
sudo kubeadm config images pull |
- Инициализируйте ноды с помощью команды:
1 |
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 |
- После выполнения команды в терминале появится информация о команде kubeadm join. Скопируйте эту команду.
Затем введите скопированную команду на k8s-worker. Так вы присоедините ноду к кластеру.
Если вы забыли сохранить команду, для повторного получения откройте ноду k8s-master и введите:
1 |
sudo kubeadm token create --print-join-command |
- Откройте k8s-master и создайте директорию для кластера при помощи команды:
1 |
mkdir -p $HOME/.kube |
- Скопируйте K8s config-файл в созданную директорию и измените владельца файла с помощью команды:
1 2 |
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config |
- Разверните сеть подов с помощью команды:
1 |
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
- Убедитесь, что вы успешно развернули сеть:
1 |
kubectl get pods --all-namespaces |
- В ноде k8s-master присвойте ноде k8s-worker роль worker при помощи команды:
1 |
sudo kubectl label node k8s-worker node-role.kubernetes.io/worker=worker |
- Затем выполните команду:
1 |
kubectl get nodes |
В списке должна появиться master node и одна worker node.
На этом установка и развертывание K8s завершены. Вы создали самый примитивный кластер с минимально необходимыми настройками.
Пример использования
В качестве примера использования Kubernetes мы создадим pod, запустим сервис NodePort и получим доступ к поду через узел кластера. Для этого:
- Создайте файл манифеста для пода с именем pod.yaml:
1 |
touch pod.yaml |
- Откройте файл в любом текстовом редакторе, например, nano:
1 |
nano pod.yaml |
- Добавьте в файл следующие строки:
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: Pod metadata: name: my-pod labels: app: my-app spec: containers: - name: my-container image: nginx ports: - containerPort: 80 |
Затем сохраните и закройте файл, нажав Ctrl+X, Y, Enter.
- Примените манифест с помощью команды:
1 |
kubectl apply -f pod.yaml |
- Создайте файл манифеста для сервиса NodePort и именем service.yaml:
1 |
touch service.yaml |
- Откройте файл в любом текстовом редакторе, например nano:
1 |
nano service.yaml |
- Добавьте в файл следующие строки:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30007 # Здесь можно указать любой доступный порт из диапазона 30000-32767 type: NodePort |
Затем сохраните и закройте файл, нажав Ctrl+X, Y, Enter.
- Примените манифест с помощью команды:
1 |
kubectl apply -f service.yaml |
- Теперь сервис NodePort будет доступен на любом узле кластера по IP-адресу узла и заданному в шаге 7 порту. Например, если в качестве значения nodePort указан порт 30007, а IP-адрес одного из узлов — 192.168.1.100, то pod будет доступен по адресу http://192.168.1.100:30007. Для проверки можно использовать команду curl:
1 |
curl http://<NodeIP>:30007 |
Где <NodeIP> — IP вашей ноды.
Вывод будет примерно следующим:
Внедрение Kubernetes в бизнес
Внедрение Kubernetes может значительно улучшить процессы разработки, развертывания и управления приложениями. Однако процесс внедрения требует тщательного планирования. Чтобы определиться, нужен ли Kubernetes вашему бизнесу:
- Проведите аудит существующей ИТ-инфраструктуры и определите, какие приложения и сервисы могут быть контейнеризированы.
- Оцените готовность команды к работе с Kubernetes и потребность в обучении и поддержке.
Затем подготовьтесь к миграции:
- Разработайте план миграции, включающий этапы контейнеризации приложений, развертывания кластера Kubernetes и тестирования.
- Определите, какие приложения будут мигрированы первыми, чтобы минимизировать риски и обеспечить плавный переход.
Для перехода на K8s:
- Разверните кластер Кубера и мигрируйте первое приложение либо разверните тестовый проект. Выявите проблемы и при необходимости адаптируйте процессы.
- Внедрите практику CI/CD, чтобы автоматизировать развертывание приложений в Kubernetes.
- Настройте системы мониторинга и логирования для отслеживания состояния кластера и производительности приложений.
- Уделите внимание безопасности кластера, настройте ролевое управление доступом и защиту сетевого трафика.
- Постепенно продолжайте оптимизировать и масштабировать кластер.
При правильном планировании и реализации Kubernetes может стать ключевым инструментом для достижения бизнес-целей и поддержки современных подходов к разработке ПО. Грамотное планирование, подготовка инфраструктуры, обучение команды и постоянная оптимизация помогут использовать возможности Kubernetes по максимуму и обеспечат устойчивый рост и развитие бизнеса.
Анастасия Мартынова