Контейнеризация приложения — это не конец истории. Для любого серьезного применения это начало нового мира оркестровки. Нам нужно подумать о многих вещах, таких как:
- Это не должно быть вниз. Если вниз или разбивается, либо перезапустите, либо начните новую как можно скорее.
- Это выступает как ожидалось? Как мы отслеживаем потребление ресурсов?
- Как масштабировать вверх/вниз с минимальными усилиями?
- Как переместить его на другую машину на случай, если хост столкнулся с проблемой?
Это не так просто, как кажется, даже для простого использования. Итак, что мы можем сделать с этим? Вот где находится оркестратор в картину.
Официальный Документация Определяет Кубератусы как:
Kubernetes, также известный как K8S, является системой открытого исходности для автоматизации развертывания, масштабирования и управления контейнерными приложениями.
Запуск контейнеров на одном хосте или запуск одного контейнера недостаточно для широкомасштабного приложения. Нам нужно масштабируемое решение, такое как k8s, которые могут обрабатывать контейнеры в масштабе и толерантным образом.
Кубернаны могут работать практически в любом месте — ноутбук, на премии, облако, голые металлические, VMS и т. Д.
Самым большим преимуществом K8S является то, что если приложение может работать в контейнере, он (скорее всего,) работает на K8S независимо от базовой инфраструктуры.
K8S обеспечивает абстракцию над базовой инфраструктурой, которая позволяет это возможным.
Функции
Вот краткий список от официальной документации:
- Открытие услуг и балансировка нагрузки
- Количество обновлений и откатов
- Самовещание — убивает и перезапускается безразличный масштабирование контейнеров
- Автоматически монтировать широкий спектр систем хранения для хранения данных
- Управление секретом и конфигурацией — для управления конфиденциальными данными и конфиг отдельно от контейнеров
- Rbac (контроль доступа на основе ролей)
Кластер K8S имеет две основные части — главные узлы и работники узлы
Плоскость управления с главными узлами
Плоскость управления с помощью главных узлов, управляет состоянием кластера K8S. Не рекомендуется запускать пользовательские приложения на главных узлах.
Рабочие узлы
Рабочие узлы запускают пользовательские/клиентские приложения.
В кластере K8S плоскость управления с главными узлами управляет рабочими узлами, а общий кластер. Посмотрим, что находится внутри плоскости управления.
Компоненты
1) API Server (Kube-Apiserver)
API Server — это лицо кластера K8S. Он обнажает набор API, которые используются всеми компонентами. Все компоненты разговаривают друг с другом через API. Основная реализация сервера API Kubernetes — Kube-Apiserver, который предназначен для масштаба горизонтально.
2) Планировщик (Kube-планировщик)
Он наблюдает за новыми задачами (вновь созданные стручки), представленные кластеру K8S, и выбирает узел рабочего, который может запустить эти стручки. Чтобы выбрать узел рабочего, оно рассматривает здоровье рабочих узлов, их нагрузку, аффинности правила, любые другие программные или аппаратные требования.
3) кластерный магазин (ETCD)
K8S использует EtCD для хранения конфигурации и состояния кластера. ETCD сильно согласуется и надежный магазин распределенного ключа. Обратите внимание, что ETCD не используется для хранения данных контейнеров или пользовательских приложений, это только для кластерного состояния.
4) Менеджер контроллера (Cube-Controller-Manager)
Это управляет и управляет контроллерами и отвечает на различные события. Основная задача контроллера состоит в том, чтобы отслеживать общее состояние кластера и сделать все возможные изменения для достижения желаемого состояния, если текущее состояние не является желаемым состоянием, больше на это позже.
5) облачный контроллер (облачный контроллер-менеджер)
Это специфично для облака, на котором работает кластер K8S. Если вы не используете K8S на облаке, не будет менеджера контроллера облака. От Kubernetes Docs — Cloud Controller Manager позволяет связать ваш кластер в API вашего облачного провайдера и разделяет компоненты, которые взаимодействуют с этой облачной платформой от компонентов, которые взаимодействуют только с вашим кластером.
Концепция желаемого состояния и текущего состояния
Когда мы на борту рабочей нагрузки/приложения на K8S, мы говорим K8S, например, наши ожидания. Нам нужны 3 контейнера всегда вверх и бега.
Итак, это становится желаемым состоянием нашего кластера. Как правило, он является частью различных полезных нагрузок, таких как конфиг развертывания POD, в котором вы можете определить количество реплик.
K8S постоянно контролирует текущее состояние системы, и если между желаемым и текущим состоянием отличается от желаемого и текущего состояния, он пытается достичь ожидаемого состояния — он автоматически расширяется/вниз, перезапускается/завершает контейнеры и т. Д.
Итак, скажем, мы начали с 3 реплик нашего контейнера.
- Желаемые реплики
После времени t одна реплика разбилась.
- Текущие реплики
- C8S Controller Manager заметил это событие и выяснил, что текущее состояние больше не является желаемым состоянием.
- K8S примет корректирующие действия и запускает новую реплику для соответствия желаемому состоянию из 3 реплик.
И хорошая вещь — это сделает это в автоматическом порядке.
Узел работника отвечает за запуск приложения пользователя. На очень высоком уровне рабочий узел:
- Получает новую задачу, когда планировщик (KUBE-планировщик) выбирает этот узел для «сделать что-то» через API Server (Kube-Apiserver)
- Выполняет данную задачу
- Отвечает на мастер через API после завершения задачи.
Узел рабочего сочетания:
Кублет
- Кублет бежит на рабочем узле. Kublet — главный агент, который делает много критических вещей, таких как — зарегистрировав узел с кластером и отчетность обратно к планирующему, независимо от того, сможет ли он работать.
Kube-proxy.
- Kube-Proxy отвечает за локальную кластерную сеть
Контейнерное время выполнения
- Время выполнения контейнера отвечает за создание и управление контейнерами. K8S может использовать любой CRI, совместимый время выполнения E.G. Docker, Containerd и т. Д.
Диаграмма суммирует поток, который мы видели до сих пор.
Давайте теперь посмотрим на некоторые из самых критических объектов K8S.
Подвигание
POD — обертка вокруг контейнера. Это самая маленькая развертываемая единица в K8S.
Итак, когда мы предоставляем Docker Image и попросите K8S запустить и управлять контейнером, он создает POD для этого приложения. Контейнерное приложение работает внутри POD.
Рекомендуется иметь один-контейнер-контейнер для PER-POD, но POD может иметь несколько связанных контейнеров.
У POD есть шаблон, который обычно определяется в файле yaml, который сообщает, какой контейнер должен хостить POD.
Когда POD снизится, K8S создает новый стручок.
Каждый новый POD имеет другой IP.
Если POD имеет больше, чем контейнеры — эти контейнеры будут делиться такими же POD IP и другими сетевыми ресурсами.
Контейнер внутри стручка может быть в одном из трех состояний —
- Ожидающий
- Бег
- Прекращено
Контейнер также может иметь политику перезагрузки:
- Всегда (по умолчанию)
- Onerror.
- Никогда
Реплизет
Реплизует — это еще один объект K8S, который действует как обертка вокруг стручка. Это управляется депоносированием.
Цель реплизета состоит в том, чтобы поддерживать стабильный набор репликных стручков в любой момент времени.
Реплизует знает с его конфигурации POD для запуска и сколько репликов необходимы. Затем он использует шаблон POD для создания этих многочисленных копий POD. Чтобы масштабировать приложение, ReplicaSet создает новые стручки.
Развертывание
Документация Kubernetes определяет развертывание, как показано ниже: вы описываете желаемое состояние в развертывании, а контроллер развертывания изменяет фактическое состояние в желаемое состояние при контролируемой скорости. Вы можете определить развертывание для создания новых реплизментов или удалить существующие развертывания и принять все их ресурсы с новыми развертываниями.
Развертывание поддерживает самовосстановление, масштабирование, обновления Rolling, Rollackss и т. Д.
Государственные средства
Когда POD снизится, K8S создает новый POD с новой идентичностью, но с одного и того же шаблона POD, а новый POD будет иметь новый IP. Таким образом, в основном старый стручок потерян.
Установки могут быть использованы для управления стручками, когда нам нужно сохранить идентичность POD.
Установка статей полезно для заявления о состоянии состояния. Они похожи на развертывание, но когда состояние отменит контейнер, он сохраняет личность POD, также называемую — липкую идентичность.
Daemonset.
Это прямо из официальной документации: DAEMONSET гарантирует, что все (или некоторые) узлы запускают копию стручка. В качестве узлов добавляются к кластеру, к ним добавляется стручки. В качестве узлов удаляются из кластера, эти стручки собираются мусором. Удаление DAEMONSET будет очистить его созданные стручки. Некоторые типичные виды использования Daemonset являются:
- Запуск демона хранения кластера на каждом узле
- Запуск демона коллекции журналов на каждом узле
- Запуск демона мониторинга узла на каждом узле
Итак, поток выглядит что-то вроде ниже:
Для запуска приложения пользователя K8S использует развертывание для управления стручками. Развертывание управляет реплизетками, а реплизет управляет стручками.
Масштабирование и самовосстановление
Единственная цель реплизет — поддерживать стабильный набор стручков реплики в любой момент времени.
- Масштабирование — В зависимости от реплик, определенных в шаблоне YAML, реплиз может создать много новых стручков для соответствия спросу.
- Самоцелевое — Точно так же, когда POD разбивается, ReplicaSet замечает изменения в кластерном состоянии и пытается запустить новый POD для замены мертвых.
Количество обновлений и откатов
Вот как это работает в K8S- Допустим, у нас есть приложение Java.
- Мы создали Docker Image V1
- Мы создали развертывание с помощью шаблона YAML, который относится к изображению — V1
- Развертывание создает новый реплиз RS1 RS1
- ReplicaSet создает новый набор стручков в зависимости от настроенного количества реплик
- Теперь, скажем, мы что-то изменили в приложении — исправление ошибки, улучшение и т. Д.
- Мы создаем новый документ Docker V2
- Мы обновляем YAML и измените ссылку на изображение на v2
- Контроллер наблюдает изменение изображения I.E. V1 -> V2
- K8S создает новый реплиз RS2 (для V2) параллельно, не касаясь старого реплизет RS1
- K8S начинает создавать новые стручки в RS2 параллельно
- В это время развертывание работает как реплизет — RS1 и RS2
- RS1 — со старым изображением V1
- RS2 — с новым изображением v2
- В то же время K8S начинает новый стручок в новом репликете и бросает стручок в старый реплиз
- Наконец, старый реплизет становится пустым, а новый реплизет становится полностью оперативной с новыми стручками, Запускное изображение V2.
- На данный момент K8S не удаляет старый реплиз, который пуст
- Пустой реплизет используется в обратном процессе
- К откату K8S просто делает переключатель на пустой реплиз, и он начинает тот же процесс в противоположном направлении — RS2 до R1
В течение всего этого процесса K8S продолжает управлять приложением, нет простоя.
Документация K8S определяет такую услугу
Сервис — это абстракция, которая определяет логический набор стручков и политика, к которому можно получить доступ к ним. Набор стручков, ориентированных на службу, обычно определяется селектором.
Сервис — это логическая группировка набора стручков, которые также действуют как балансировщик нагрузки.
Стручки могут говорить друг с другом через сервис.
Вызов снаружи кластера K8S перехвачен службой, который затем пересылает запрос на определенный POD из его набора.
Таким образом, сервис также действует как абстракция сети, которая скрывает все сетевые сложности.
Основные компоненты обслуживания
Есть два основных компонента обслуживания:
- Селектор — Селектор используется для выбора PODS, которые образуют логическую группу, которая представлена службой
- Конечные точки — Это список здоровых стручков. Сервис сохраняет список современных путем мониторинга изменений в стручках E.g. Разбитый стручок, новый стручок присоединяется к кластеру и т. Д.
Как сервис образует группу стручков?
Служба использует селектор метки для выбора струй.
Ярлыки — это просто набор пар клавишных пар, которые мы можем прикрепить к определенным объектам K8S, как POD.
Давайте предположим, у нас есть три стручка P1, P2 и P3 Отказ И у нас есть две этикетки — env и Версия Вот как эти стручки помечены этими этикетками:
- P1 — а,0.
- P2 — и.1
- P3 — And.0 Давайте также предположим, что у нас есть услуга с селектором метки, определенным как:> а.0
Итак, на основе этого сервис будет иметь два стручка в его наборе — P1 и P3 P2 не будет выбран услугой Потому что в то время как его ярлык ENV совпадает со значением PROD, но версия отличается — Услуги ожидания.0 и P2 имеет 1.
Типы обслуживания
Есть в основном три типа услуг:
- Кластер IP — Чтобы получить доступ к стручкам изнутри
- NodePort — Для доступа к стручкам снаружи
- LoadBalancer — Для интеграции облачного удельного балансировщика нагрузки E.G. Azure и AWS будут иметь разные балансировщики нагрузки.
Тома
Тома используются в качестве раствора для хранения для кластера K8S.
Мы используем или монтируем объемы монтирования, чтобы постоянно хранить данные приложения, чтобы, если POD разбит и запущен, он не потерял бы его данные.
K8S использует слой плагина для обработки объемов, поэтому он способен работать с различными типами растворов для хранения.
Например, мы можем использовать Azure Disk, EBS и т. Д. В качестве раствора хранения.
Постоянный том
Он действует как абстракция хранения, которая обеспечивает API для доступа и управлять постоянным хранением.
Настойчивый том представляет собой хранилище, приложение будет связывать на постоянный том через плагин.
Например, Azure Storage будет иметь свой собственный плагин, который можно использовать для соединения азаронизации Azure в качестве постоянного тома.
Претензии персистентно
Это запросы на хранение, сделанные пользователем. Запрос пользователей на постоянный том, основанный на определенных критериях, и если найден постоянный том, он связан с претензиями для персистентного потребления.
Configmap — это объект K8S, который используется для хранения нечувствительных конфигураций POD. Это пара клавиш.
Для конфиденциальных данных рекомендуется использовать секреты, а не конфигурацию.
CONFIGMAP — отличный способ отделить конфиги из кода.
CONFIGMAP может быть введен в контейнер тремя способами:
- Переменные среды
- Командная строка args.
- Как файл в объеме
Единственная проблема с первыми двумя состоит в том, что это статически.
Итак, как только приложение начнется, и если в конфигурации конфигурации есть какие-либо изменения, то он не будет отражен до тех пор, пока не перезапустим приложение, потому что нет способа перезагрузить конфигурацию, который был введен через переменные среды или команду запуска.
Третий вариант, используя объемы, является наиболее гибким способом, где мы создаем громкость для ConfigPlap. Любые изменения в файле будут отражены в том объеме и будут выбраны приложением.
Не стесняйтесь проверить мою страницу https://www.vmtechblog.com/search/label/kubernetes.
Оригинал: «https://dev.to/vmtechhub/the-theory-of-kubernetes-in-10-mins-2e10»