116 lines
13 KiB
Markdown
116 lines
13 KiB
Markdown
---
|
||
title: Контроллеры
|
||
content_type: concept
|
||
weight: 30
|
||
---
|
||
|
||
<!-- overview -->
|
||
|
||
В робототехнике и автоматизации, _цикл управления_ - это непрерывный цикл, который регулирует состояние системы.
|
||
|
||
Вот один из примеров контура управления: термостат в помещении.
|
||
|
||
Когда вы устанавливаете температуру, это говорит термостату о вашем *желаемом состоянии*. Фактическая температура в помещении - это
|
||
*текущее состояние*. Термостат действует так, чтобы приблизить текущее состояние к желаемому состоянию, путем включения или выключения оборудования.
|
||
|
||
{{< glossary_definition term_id="controller" length="short">}}
|
||
|
||
|
||
|
||
|
||
<!-- body -->
|
||
|
||
## Шаблон контроллера
|
||
|
||
Контроллер отслеживает по крайней мере один тип ресурса Kubernetes.
|
||
Эти [объекты](/docs/concepts/overview/working-with-objects/kubernetes-objects/#kubernetes-objects)
|
||
имеют поле спецификации, которое представляет желаемое состояние. Контроллер (ы) для этого ресурса несут ответственность за приближение текущего состояния к желаемому состоянию
|
||
|
||
Контроллер может выполнить это действие сам; чаще всего в Kubernetes,
|
||
контроллер отправляет сообщения на
|
||
{{< glossary_tooltip text="сервер API" term_id="kube-apiserver" >}} которые имеют
|
||
полезные побочные эффекты. Пример этого вы можете увидеть ниже.
|
||
|
||
{{< comment >}}
|
||
Некоторые встроенные контроллеры, такие как контроллер пространства имен, действуют на объекты, не имеющие спецификации. Для простоты эта страница опускает объяснение этих деталей.
|
||
{{< /comment >}}
|
||
|
||
### Управление с помощью сервера API
|
||
|
||
Контроллер {{< glossary_tooltip term_id="job" >}} является примером встроенного контроллера Kubernetes. Встроенные контроллеры управляют состоянием, взаимодействуя с кластером сервера API.
|
||
|
||
Задание - это ресурс Kubernetes, который запускает
|
||
{{< glossary_tooltip term_id="pod" >}}, или возможно несколько Pod-ов, выполняющих задачу и затем останавливающихся.
|
||
|
||
(После [планирования](/docs/concepts/scheduling-eviction/), Pod объекты становятся частью желаемого состояния для kubelet).
|
||
|
||
Когда контроллер задания видит новую задачу, он убеждается что где-то в вашем кластере kubelet-ы на множестве узлов запускают нужное количество Pod-ов для выполнения работы.
|
||
Контроллер задания сам по себе не запускает никакие Pod-ы или контейнеры. Вместо этого контроллер задания сообщает серверу API о создании или удалении Pod-ов.
|
||
Другие компоненты в
|
||
{{< glossary_tooltip text="плоскости управления" term_id="control-plane" >}}
|
||
действуют на основе информации (имеются ли новые запланированные Pod-ы для запуска), и в итоге работа завершается.
|
||
|
||
После того как вы создадите новое задание, желаемое состояние для этого задания будет завершено. Контроллер задания приближает текущее состояние этой задачи к желаемому состоянию: создает Pod-ы, выполняющие работу, которую вы хотели для этой задачи, чтобы задание было ближе к завершению.
|
||
|
||
Контроллеры также обновляют объекты которые их настраивают.
|
||
Например: как только работа выполнена для задания, контроллер задания обновляет этот объект задание, чтобы пометить его как `Завершенный`.
|
||
|
||
(Это немного похоже на то, как некоторые термостаты выключают свет, чтобы указать, что теперь ваша комната имеет установленную вами температуру).
|
||
|
||
### Прямое управление
|
||
|
||
В отличие от Задания, некоторым контроллерам нужно вносить изменения в вещи за пределами вашего кластера.
|
||
|
||
Например, если вы используете контур управления, чтобы убедиться, что в вашем кластере достаточно {{< glossary_tooltip text="Узлов" term_id="node" >}},
|
||
тогда этому контроллеру нужно что-то вне текущего кластера, чтобы при необходимости запустить новые узлы.
|
||
|
||
Контроллеры, которые взаимодействуют с внешним состоянием, находят свое желаемое состояние с сервера API, а затем напрямую взаимодействуют с внешней системой, чтобы приблизить текущее состояние.
|
||
|
||
(На самом деле существует [контроллер](https://github.com/kubernetes/autoscaler/), который горизонтально масштабирует узлы в вашем кластере.)
|
||
|
||
Важным моментом здесь является то, что контроллер вносит некоторые изменения, чтобы вызвать желаемое состояние, а затем сообщает текущее состояние обратно на сервер API вашего кластера. Другие контуры управления могут наблюдать за этими отчетными данными и предпринимать собственные действия.
|
||
|
||
В примере с термостатом, если в помещении очень холодно, тогда другой контроллер может также включить обогреватель для защиты от замерзания. В кластерах Kubernetes, плоскость управления косвенно работает с инструментами управления IP-адресами, службами хранения данных, API облачных провайдеров и другими службами для реализации
|
||
[расширения Kubernetes](/docs/concepts/extend-kubernetes/).
|
||
|
||
## Желаемое против текущего состояния {#desired-vs-current}
|
||
|
||
Kubernetes использует систему вида cloud-native и способен справляться с постоянными изменениями.
|
||
|
||
Ваш кластер может изменяться в любой по мере выполнения работы и контуры управления автоматически устраняют сбой. Это означает, что потенциально Ваш кластер никогда не достигнет стабильного состояния.
|
||
|
||
Пока контроллеры вашего кластера работают и могут вносить полезные изменения, не имеет значения, является ли общее состояние стабильным или нет.
|
||
|
||
## Дизайн
|
||
|
||
В качестве принципа своей конструкции Kubernetes использует множество контроллеров, каждый из которых управляет определенным аспектом состояния кластера. Чаще всего конкретный контур управления (контроллер) использует один вид ресурса в качестве своего желаемого состояния и имеет другой вид ресурса, которым он управляет, чтобы это случилось. Например, контроллер для заданий отслеживает объекты заданий (для обнаружения новой работы) и объекты модулей (для выполнения заданий, а затем для того, чтобы видеть, когда работа завершена). В этом случае что-то еще создает задания, тогда как контроллер заданий создает Pod-ы.
|
||
|
||
Полезно иметь простые контроллеры, а не один монолитный набор взаимосвязанных контуров управления. Контроллеры могут выйти из строя, поэтому Kubernetes предназначен для этого.
|
||
|
||
{{< note >}}
|
||
Существует несколько контроллеров, которые создают или обновляют один и тот же тип объекта. За кулисами контроллеры Kubernetes следят за тем, чтобы обращать внимание только на ресурсы, связанные с их контролирующим ресурсом.
|
||
|
||
Например, у вас могут быть развертывания и задания; они оба создают Pod-ы. Контроллер заданий не удаляет Pod-ы созданные вашим развертыванием, потому что имеется информационные ({{< glossary_tooltip term_id="label" text="метки" >}})
|
||
которые могут быть использованы контроллерами тем самым показывая отличие Pod-ов.
|
||
{{< /note >}}
|
||
|
||
## Способы запуска контроллеров {#running-controllers}
|
||
|
||
Kubernetes поставляется с набором встроенных контроллеров, которые работают внутри {{< glossary_tooltip term_id="kube-controller-manager" >}}. Эти встроенные контроллеры обеспечивают важные основные функции.
|
||
|
||
Контроллер развертывания и контроллер заданий - это примеры контроллеров, которые входят в состав самого Kubernetes («встроенные» контроллеры).
|
||
Kubernetes позволяет вам запускать устойчивую плоскость управления, так что в случае отказа одного из встроенных контроллеров работу берет на себя другая часть плоскости управления.
|
||
|
||
Вы можете найти контроллеры, которые работают вне плоскости управления, чтобы расширить Kubernetes.
|
||
Или, если вы хотите, можете написать новый контроллер самостоятельно. Вы можете запустить свой собственный контроллер в виде наборов Pod-ов,
|
||
или внешнее в Kubernetes. Что подойдет лучше всего, будет зависеть от того, что делает этот конкретный контроллер.
|
||
|
||
|
||
|
||
## {{% heading "whatsnext" %}}
|
||
|
||
* Прочтите о [плоскости управления Kubernetes ](/docs/concepts/overview/components/#control-plane-components)
|
||
* Откройте для себя некоторые из основных [объектов Kubernetes ](/docs/concepts/overview/working-with-objects/kubernetes-objects/)
|
||
* Узнайте больше о [Kubernetes API](/docs/concepts/overview/kubernetes-api/)
|
||
* Если вы хотите написать собственный контроллер, см [Шаблоны расширения](/docs/concepts/extend-kubernetes/extend-cluster/#extension-patterns) в расширении Kubernetes.
|