Обзор Pod
В этом посте представлен обзор Pod, самого маленького развертываемого объекта в объектной модели Kubernetes.
Pod (модуль) - это базовая исполнительная единица приложения Kubernetes - наименьшая и самая простая единица в объектной модели Kubernetes, которую вы создаете или разворачиваете. Pod представляет процессы, запущенные в вашем кластере.
Pod инкапсулирует контейнер приложения (или, в некоторых случаях, несколько контейнеров), ресурсы хранения, уникальный сетевой IP-адрес и параметры, определяющие порядок работы контейнера (-ов). Pod представляет собой единицу развертывания: один экземпляр приложения в Kubernetes, который может состоять из одного контейнера или небольшого числа контейнеров, которые тесно связаны между собой и совместно используют ресурсы.
Docker - наиболее распространенная среда выполнения контейнеров, используемая в Pod'ах Kubernetes, но Pod'ы поддерживают и другие среды выполнения контейнеров.
Pod'ы в кластере Kubernetes можно использовать двумя основными способами:
- Pod'ы, которые запускают один контейнер. Модель "один контейнер на Pod" (one-container-per-Pod) является наиболее распространенным вариантом использования Kubernetes; в этом случае вы можете рассматривать Pod как обертку вокруг одного контейнера, и Kubernetes управляет pod'ами, а не контейнерами напрямую.
- Pod'ы, которые запускают несколько контейнеров, которые должны работать вместе. Pod может инкапсулировать приложение, состоящее из нескольких совместно расположенных контейнеров, которые тесно связаны между собой и должны совместно использовать ресурсы. Эти совместно расположенные контейнеры могут образовывать целостную единицу обслуживания - один контейнер, обслуживающий файлы из общего тома в общем доступе, в то время как отдельный контейнер "sidecar" обновляет обновляет эти файлы. Pod упаковывает эти контейнеры и ресурсы хранения в единый управляемый объект.
Каждый Pod предназначен для запуска одного экземпляра данного приложения. Если вы хотите масштабировать приложение по горизонтали (например, запускать несколько экземпляров), вам следует использовать несколько pod'ов, по одному для каждого экземпляра. В Kubernetes это обычно называют репликацией. Реплицированные Pod'ы обычно создаются и управляются как группа с помощью абстракции, называемой контроллером (Controller).
Как Pod'ы управляют несколькими контейнерами
Pod'ы предназначены для поддержки нескольких взаимодействующих процессов (в виде контейнеров), которые образуют целостную единицу обслуживания. Контейнеры в pod'е автоматически размещаются и планируются на одной физической или виртуальной машине в кластере. Контейнеры могут совместно использовать ресурсы и зависимости, взаимодействовать друг с другом и координировать, когда и как они завершаются.
Обратите внимание, что группирование нескольких совместно расположенных и совместно управляемых контейнеров в одном pod является относительно сложным вариантом использования. Вы должны использовать этот шаблон только в определенных случаях, когда ваши контейнеры тесно связаны. Например, у вас может быть контейнер, который действует как веб-сервер для файлов в общем томе, и отдельный контейнер "sidecar", который обновляет эти файлы из удаленного источника.
Некоторые Pod имеют init контейнеры, а также контейнеры приложений. Init контейнеры запускаются и завершаются до запуска контейнеров приложения.
Pod'ы предоставляют два вида общих ресурсов для составляющих их контейнеров: сеть (networking) и хранилище (storage).
Сеть
Каждому pod назначается уникальный IP-адрес. Каждый контейнер в pod разделяет пространство имен сети, включая IP-адрес и сетевые порты. Контейнеры внутри Pod могут связываться друг с другом, используя localhost. Когда контейнеры в pod взаимодействуют с объектами вне pod, они должны координировать использование общих сетевых ресурсов (таких как порты).
Хранилище (storage)
Pod может указывать набор общих томов хранилища. Все контейнеры в pod имеют доступ к общим томам, что позволяет этим контейнерам обмениваться данными. Тома также позволяют сохраняться постоянным данным в pod в случае, если необходимо перезапустить один из контейнеров внутри.
Работа с pod'ами
Вы редко будете создавать отдельные Pod непосредственно в Kubernetes - даже синглтон Pod'ы (Pod'ы существующие в единственном экземпляре). Это потому, что pod разработаны как относительно эфемерные, одноразовые объекты. Когда Pod создается (напрямую вами или косвенно контроллером), он запускается на узле (Node) в вашем кластере. Pod остается на этом узле до тех пор, пока процесс не будет завершен, объект pod'а не будет удален, pod будет удален из-за недостатка ресурсов или если узел обрушится.
Примечание. Перезапуск контейнера в pod'е не следует путать с перезапуском pod'а. Сам Pod не запускается, но является средой, в которой работают контейнеры, и сохраняется до тех пор, пока он не будет удален.
Pod'ы сами по себе не излечиваются (не восстанавливаются до работающего состояния). Если Pod назначен планировщиком для Узла, который обрушился, или если сама операция планирования не удалась, Pod удаляется; аналогично, Pod не выживет из-за нехватки ресурсов или обслуживания Node. Kubernetes использует абстракцию более высокого уровня, называемую Controller, которая отвечает за работу по управлению относительно одноразовыми экземплярами Pod. Таким образом, хотя можно использовать Pod напрямую, в Kubernetes гораздо чаще можно управлять вашими pod с помощью контроллера.
Pod'ы и Контроллеры
Контроллер может создавать и управлять несколькими pod для вас, обрабатывая репликацию и развертывание, а также предоставляя возможности самовосстановления в отдельной области кластера. Например, в случае сбоя узла, контроллер может автоматически заменить pod, запланировав идентичную замену на другом узле.
Некоторые примеры контроллеров, которые содержат один или несколько pod:
- Deployment
- StatefulSet
- DaemonSet
Обычно контроллеры используют предоставленный вами шаблон pod'а (Pod Template) для создания pod'ов, за которые он отвечает.
Шаблоны (Pod Template)
Шаблоны pod'ов- это спецификации pod, которые включены в другие объекты, такие как контроллеры репликации (Replication Controllers), задания (Jobs) и DaemonSets. Контроллеры используют шаблоны pod'ов для создания реальных pod. Пример ниже представляет собой простой манифест для Pod, который содержит контейнер, печатающий сообщение.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
Вместо того, чтобы указывать текущее желаемое состояние всех реплик, шаблоны pod похожи на формы для печенья. После того, как печенье было вырезано, оно не имеет отношения к резцу. Последующие изменения в шаблоне или даже переключение на новый шаблон не оказывают прямого влияния на уже созданные pod. Аналогично, pod'ы, созданные контроллером репликации, могут впоследствии обновляться напрямую. Это намеренно контрастирует с pod'ами, которые указывают текущее требуемое состояние всех контейнеров, принадлежащих pod'у. Этот подход радикально упрощает семантику системы и увеличивает гибкость примитива.
Читайте также:
- Контейнеры в Kubernetes: образы (images)
- Контейнеры в Kubernetes: образы, использование частных реестров (Private Registry)
- Переменные среды контейнера в Kubernetes
Комментарии
Отправить комментарий