В чем разница между модулем и развертыванием?

241

Я создавал модули с, type:deploymentно я вижу, что некоторая документация использует type:pod, более конкретно документацию для контейнеров с несколькими контейнерами :

apiVersion: v1
kind: Pod
metadata:
  name: ""
  labels:
    name: ""
  namespace: ""
  annotations: []
  generateName: ""
spec:
  ? "// See 'The spec schema' for details."
  : ~

Но для создания модулей я могу просто использовать тип развертывания :

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ""
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: ""
    spec:
      containers:
        etc

Я заметил, что документация на стручок гласит:

Команду create можно использовать для непосредственного создания модуля, а также для создания модуля или модуля через развертывание. Настоятельно рекомендуется использовать Deployment для создания ваших модулей. Он следит за неисправными модулями и запускает новые, если требуется поддерживать указанное количество. Если вы не хотите, чтобы Deployment отслеживал ваш модуль (например, ваш модуль записывает непостоянные данные, которые не сохранятся после перезапуска, или ваш модуль должен быть очень недолговечным), вы можете создать модуль напрямую с помощью команда создания.

Примечание. Мы рекомендуем использовать Deployment для создания модулей. Вы должны использовать приведенные ниже инструкции, только если вы не хотите создавать развертывание.

Но это поднимает вопрос о том, что kind:podхорошо? Можете ли вы как-то ссылаться на стручки в развертывании? Я не видел пути. Похоже, что вы получаете с модулями дополнительные метаданные, но ни один из параметров развертывания, таких как replicaили политика перезапуска. Что хорошего в модуле, который не сохраняет данные, переживает перезапуск? Я думаю, что смогу создать многоконтейнерный модуль с развертыванием.

Bjorn
источник

Ответы:

191

И Pod, и Deployment являются полноценными объектами в API Kubernetes. Развертывание управляет созданием модулей с помощью ReplicaSets. Все сводится к тому, что при развертывании будут создаваться модули со спецификацией, взятой из шаблона. Весьма маловероятно, что вам когда-либо понадобится создавать стручки напрямую для производственного сценария использования.

Радек Гоблин Песченка
источник
7
Спасибо, но когда вы будете создавать стручки напрямую?
Бьорн
11
Наличие пользовательского контроллера - это тот случай, когда вы, вероятно, захотите создавать и управлять модулями напрямую, вместо использования одной из абстракций более высокого уровня.
Анируд Раманатан
24
@BjornTipling Я создаю модули без развертывания, когда мне не нужны kubernetes для повторного создания модулей при удалении. Один из вариантов использования - сначала протестировать создание пакета.
user2526795
243

Ответ Радека очень хороший, но я хотел бы поделиться с моим опытом, вы почти никогда не будете использовать объект с добрым стручком , потому что это не имеет никакого смысла на практике.

Поскольку вам нужно развертывание объект - или другие объекты API Kubernetes вроде контроллера репликации или replicaset - что нужно держать на реплики (стручки) живы (это своего рода точку с помощью kubernetes).

Что вы будете использовать на практике для типичного приложения:

  1. Объект развертывания (где вы будете указывать контейнер / контейнеры приложений), в котором будет размещаться контейнер вашего приложения с некоторыми другими спецификациями.

  2. Сервисный объект (который похож на группирующий объект и дает ему так называемый виртуальный IP-адрес (кластерный IP-адрес) для объекта podsс определенной меткой - и podsэто в основном контейнеры приложения, которые вы развернули с помощью предыдущего объекта развертывания ).

У вас должен быть сервисный объект, потому что podsисходный объект развертывания может быть уничтожен, масштабирован вверх и вниз, и вы не можете полагаться на их IP-адреса, потому что они не будут постоянными.

Таким образом, вам нужен объект, такой как сервис , который дает этим podsстабильный IP.

Просто хотел дать вам некоторый контекст вокруг pods, чтобы вы знали, как все работает вместе.

Надеюсь, что кое-что прояснит для вас, не так давно я был на вашем месте :)

Томислав Микулин
источник
1
Хороший ответ, нужен ли нам replicaSet или ReplicationController, потому что я думал, что объект Deployment оборачивает эти объекты, контролируя реплики?
user_mda
3
да, объект Deployment обрабатывает репликационный набор, но вы также можете использовать объект с типом: ReplicationController или kind: ReplicaSet самостоятельно, если вы действительно этого хотите, но я практически не видел этого на практике ...
Томислав Микулин
2
Почему kind: Podв качестве примера приводятся несколько кубернетских документов ? Например, как использовать секреты , как окр вары: kubernetes.io/docs/concepts/configuration/secret/...
rm.rf.etc
1
Я не совсем уверен, может быть, потому что в k8 легче объяснить концепции .. без учета веса контроллеров, развертываний и т. Д.
Томислав Микулин
1
В некоторых случаях вы хотите создать модуль pod, например, если вы запускаете тестовую коляску (пример helm test), когда вам не нужно вечно запускать приложение, и нам не нужны множественные реплики, в этом случае pod подходит.
Балкришна
61

У Kubernetes есть три типа объектов, о которых вы должны знать:

  • Pods - запускает один или несколько тесно связанных контейнеров
  • Сервисы - настройка сети в кластере Kubernetes
  • Развертывание - поддерживает набор идентичных модулей, гарантируя, что они имеют правильную конфигурацию и что правильное количество их существует.

Бобы:

  • Запускает один набор контейнеров
  • Хорошо для одноразовых целей
  • Редко используется непосредственно в производстве

Развертывание:

  • Запускает набор одинаковых контейнеров
  • Отслеживает состояние каждого модуля, обновляя при необходимости
  • Хорошо для разработчиков
  • Хорошо для производства

И я согласился бы с другими ответами, забыл о модулях и просто использовал развертывание. Зачем? Посмотрите на второй пункт маркера, он отслеживает состояние каждого модуля, обновляя при необходимости.

Таким образом, вместо того, чтобы бороться с сообщениями об ошибках, такими как этот:

Запрещено: обновления модуля не могут изменять поля, кроме spec.containers[*].image

Так что просто рефакторинг или полностью воссоздать ваш Pod в Deployment, который создает модуль, чтобы делать то, что вам нужно сделать. С помощью Deployment вы можете изменить любую конфигурацию, какую захотите, и вам не нужно беспокоиться о том, чтобы увидеть это сообщение об ошибке.

Даниил
источник
9

Pod - это экземпляр контейнера.

введите описание изображения здесь

Это выход replicas: 3

Подумайте, deploymentможет быть много запущенных экземпляров (реплика).

//deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: tomcat-deployment222
spec:
  selector:
    matchLabels:
      app: tomcat
  replicas: 3
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: tomcat:9.0
        ports:
        - containerPort: 8080
Серкан
источник
Лучший ответ на данный момент. Другие ответы сосредоточены на том, чтобы показать, как развертывания являются более важной концепцией и что вы редко используете модули в работе, но не хватает четкой информации о том, как они связаны друг с другом.
Диего Кейроз
Итак, можем ли мы назвать модуль одним из реплик развертывания?
Киория
@kioria, что вы подразумеваете под "репликами развертывания"?
Серкан
@serkan Я имею в виду эти реплики: 3 из спецификации развертывания.
Киория
@kioria, replicas: 3ссылка на верхнюю часть изображения. Это означает «эй, когда вы запустите этот процесс, создайте 3 виртуальных / реальных компьютера - экземпляры». Это как «развертывание» - это дом, а «стручки» - это люди. Один дом и три человека в нем, которые делают работу. Что вы пытаетесь сделать конкретно для этого?
Серкан
6

Pod представляет собой коллекцию контейнеров и базового объекта Kuberntes. Все контейнеры контейнера находятся в одном узле.

  • Не подходит для производства
  • Нет обновлений

Развертывание является своего рода контроллером в Kubernetes.

Controllers use a Pod Template that you provide to create the Pods for which it is responsible.

Развертывание создает ReplicaSet, который, в свою очередь, гарантирует, что CurrentReplicas всегда совпадает с требуемымиReplicas.

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

  • Вы можете развернуть и откатить изменения, используя развертывание
  • Контролирует состояние каждого модуля
  • Лучше всего подходит для производства
  • Поддерживает непрерывные обновления
Нихил Кумар
источник
4

Я хочу добавить некоторую информацию из Kubernetes в книгу действий , чтобы вы могли видеть всю картину и связь между ресурсами Kubernetes, такими как Pod, Deployment и ReplicationController (ReplicaSet)

Бобы

являются основным развертываемым подразделением в Kubernetes. Но в реальных случаях использования вы хотите, чтобы ваши развертывания работали автоматически и работали без какого-либо ручного вмешательства. Для этого рекомендуется использовать Deployment , которое под капотом создает ReplicaSet .

Набор ReplicaSet , как следует из названия, представляет собой набор реплик (модулей), поддерживаемых с их историей ревизий .

(ReplicaSet расширяет старый объект с именем ReplicationController, который точно такой же, но без истории изменений.)

ReplicaSet постоянно следит за списком запущенных модулей и следит за тем, чтобы текущее количество модулей, соответствующих определенной спецификации, всегда совпадало с требуемым числом.

введите описание изображения здесь

Removing a pod from the scope of the ReplicationController comes in handy
when you want to perform actions on a specific pod. For example, you might 
have a bug that causes your pod to start behaving badly after a specific amount 
of time or a specific event.

Развертывание

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

Когда вы создаете развертывание , под ним создается ресурс ReplicaSet (со временем их становится больше). ReplicaSets также позволяет копировать и управлять модулями. При использовании развертывания фактические модули создаются и управляются наборами реплик развертывания , а не непосредственно развертыванием.введите описание изображения здесь

Давайте подумаем о том, что произошло. Изменяя шаблон модуля в своем ресурсе развертывания, вы обновили свое приложение до более новой версии, изменив одно поле!

введите описание изображения здесь

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

Эти изображения также из книги Kubernetes In Action .

fgul
источник
2

Старайтесь избегать Pods и внедрите Deployments вместо этого для управления контейнерами, поскольку объекты типа Pod не будут перепланированы (или самоисцелены) в случае сбоя узла или прекращения работы pod.

Развертывание, как правило, предпочтительнее, поскольку оно определяет ReplicaSet, чтобы гарантировать, что желаемое количество модулей всегда доступно, и определяет стратегию замены модулей, такую ​​как RollingUpdate.

maelga
источник
1

В Кубернетесе Бобы - самые маленькие развертываемые единицы. Каждый раз, когда мы создаем объект kubernetes, такой как Deployments, replica-sets, statefulsets, daemonsets, он создает pod.

Как упомянуто выше, при развертывании создаются модули на основе желаемого состояния, указанного в вашем объекте развертывания. Например, вам нужно 5 реплик приложения, которые вы упомянули replicas: 5в манифесте развертывания. Теперь контроллер развертывания отвечает за создание 5 идентичных реплик (не менее, не более) данного приложения со всеми метаданными, такими как политика RBAC, сетевая политика, метки, аннотации, проверка работоспособности, квоты ресурсов, заражение / допуски и другие, и связывание с каждым модулем. это создает.

В некоторых случаях вы хотите создать модуль pod, например, если вы запускаете тестовую коляску, в которой вам не нужно вечно запускать приложение, вам не нужно несколько реплик, и вы запускаете приложение, когда хотите выполнить в нем Корпус подходит. Например helm test, это определение модуля, которое указывает контейнер с заданной командой для запуска.

Balkrishna
источник