Поиск по сайту:

Декларативное и императивное управление объектами Kubernetes


Kubernetes обычно называют декларативной системой. Большую часть времени вы работаете с YAML, который определяет, как должно выглядеть конечное состояние системы. Kubernetes также поддерживает императивные API, когда вы вводите команду и получаете немедленный результат.

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

Декларативный и императивный: определения

Сначала полезно изучить терминологию.

Что-то декларативное утверждает конечный результат, указывая на намерение, но не на процесс его достижения. В Kubernetes это означает: «Должен быть ReplicaSet с тремя подами».

императив действует как команда. В то время как декларатив является пассивным, императивы являются активными и немедленными: «Создайте ReplicaSet с тремя подами».

Экосистема Kubernetes предоставляет механизмы для взаимодействия с вашим кластером в любой из этих форм. Императивные подходы обслуживаются командами CLI и отдельными файлами YAML. Декларативная конфигурация упрощается с помощью каталогов файлов, которые объединяются в окончательное представление ресурсов.

Императивное управление объектами

Вот пример императивного создания Deployment:

kubectl create deployment my-deployment --image my-image:latest

Вы указываете Kubernetes немедленно добавить новое развертывание в ваш кластер. Команда включает один глагол (create) и имя типа ресурса, с которым вы работаете (deployment).

Вы также можете написать файл YAML и принудительно применить его с помощью команды create:

apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
        # ...
kubectl create -f deployment.yml

Как и прежде, вы отдаете немедленную команду с помощью активного глагола. Kubernetes возьмет конфигурацию из вашего файла и создаст соответствующие ресурсы в кластере. Если вам нужно обновить ресурс, вы должны изменить свой YAML и использовать команду replace, чтобы изменения вступили в силу:

kubectl replace -f deployment.yml

Эта операция удалит спецификацию всех существующих ресурсов и заменит ее версией в файле конфигурации. Об этом сообщает название команды replace. Это означает, что вы потеряете любые изменения, внесенные в ваши живые объекты, которых нет в вашем YAML.

Когда Kubernetes использует императивные команды, ему нужно точно сказать, что делать. Следовательно, нет возможности выборочно применить только измененные части вашего YAML. Для этого вам нужно переключиться на декларативные операции.

Пробуем декларативное управление

Декларативное управление доступно только при использовании конфигурационных файлов YAML. Нет такой вещи, как декларативная команда. Когда вы используете декларативные операции, вы не указываете Kubernetes, что делать, предоставляя глагол (create/replace). Вместо этого вы используете одну команду apply и доверяете Kubernetes разработку необходимых действий.

kubectl apply -f deployment.yml

Продолжая приведенный выше пример развертывания, применение приведенного выше YAML к вашему кластеру изначально будет действовать так же, как императивная команда create. Для начала не будет подходящего ресурса, поэтому Kubernetes должен создать новый.

Затем вы можете изменить поле replicas на 5 и повторить команду apply. На этот раз Kubernetes сопоставит существующий ресурс, обнаружит изменение в вашем YAML и масштабирует развертывание, не затрагивая другие поля.

При императивном подходе вам потребуется использовать команду kubectl scale, чтобы изменить количество реплик существующего развертывания. Если вы изменили YAML, который вы использовали с kubectl create, вам нужно будет запустить kubectl replace, но это заменит всю spec развертывания, вместо простого масштабирования количества реплик.

Декларативный и императивный: сравнение компромиссов

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

Декларативное управление раскрывает реальную мощь Kubernetes. Вы объявляете, как должно выглядеть конечное состояние, а затем пусть Kubernetes сделает все остальное. Каждая команда имеет одно и то же императивное действие — применить этот набор файлов YAML и перевести кластер в состояние, которое они определяют.

Декларативное управление идеально подходит для автоматизированных развертываний. Вам не нужно тратить время на создание набора инструкций по миграции каждый раз при обновлении ресурса. Вместо этого настройте свой YAML, чтобы он создавал правильно сконфигурированные объекты, если они были созданы заново в настоящее время. Kubernetes будет обрабатывать обновления существующих объектов, чтобы они также соответствовали новому состоянию.

Декларативные файлы YAML легко версионировать, просматривать и объединять как часть вашей системы управления версиями. Если вы используете императивные команды, у вас нет возможности отслеживать, как развивался ваш кластер, и будет сложнее откатиться к более раннему состоянию. В отличие от императивных операций, декларативные обновления не перезаписывают весь объект, поэтому вы сохраните изменения, сделанные с помощью других механизмов, независимо от файлов YAML.

Тем не менее императивное управление сохраняет некоторые преимущества. Декларативная конфигурация добавляет уровни сложности и ее может быть сложнее отлаживать, особенно когда Kubernetes выбирает неожиданный курс действий. Каждое изменение приводит к операции слияния и исправления, чтобы привести ваши объекты в соответствие с желаемым состоянием. В императивной модели то, что вы просите, это то, что вы получите, если только не произойдет ошибка.

Как всегда, когда предлагаются два подхода, обе стратегии полезны, и выбор зависит от контекста. Для производственных кластеров, в которых размещаются активные приложения с частыми изменениями, вам, вероятно, понадобятся версионные декларативные файлы YAML. Если вы быстро запускаете новые контейнеры в кластере разработки, императивные команды сэкономят время и с ними будет проще работать.

Заключение

Декларативное и императивное управление — это два способа взаимодействия с вашим кластером Kubernetes и его ресурсами. Kubectl имеет встроенную поддержку обеих этих стратегий, но методы не следует смешивать для каждого объекта. Если вы создаете объект декларативно, им следует управлять таким образом на протяжении всей его жизни — использование с ним императивных команд может привести к неожиданному поведению.

Императивные операции влияют на живые объекты в вашем кластере. Вы определяете глагол, ресурс и конфигурацию с помощью аргументов и флагов команды. Декларативное управление основано на изменениях в локальных файлах конфигурации, которые Kubectl анализирует и применяет к кластеру с помощью исправлений при использовании команд kubectl diff и kubectl apply.




Все права защищены. © Linux-Console.net • 2019-2024