Manual Approval Gate для Tekton Pipelines
Содержание
Обзор функцииСценарии использованияПредварительные требованияШаги1. Объявите шаг одобрения в pipeline2. Отслеживайте статус одобрения3. Одобрение или отклонениеОдобрение пользователямиОдобрение группой4. Увеличьте таймаутыPipelineRun для длительных одобренийРезультаты работыУстранение неполадокИдентификаторы пользователей и группДополнительная информацияОбзор функции
Manual Approval Gate позволяет авторам pipeline приостанавливать выполнение PipelineRun до тех пор, пока назначенные утверждающие не рассмотрят и не одобрят операцию. За кулисами контроллер, предоставляемый оператором, создаёт ресурс ApprovalTask для каждого шага одобрения, отслеживает ответы утверждающих и записывает результат обратно в исходный CustomRun.
Сценарии использования
- Обеспечение контрольных точек с участием человека перед развертыванием в production или выполнением разрушительного обслуживания.
- Реализация политики многоуровневого одобрения с помощью комбинации отдельных пользователей и групп с параметром
numberOfApprovalsRequired. - Аудит того, кто одобрил или отклонил изменение, путём запроса полей статуса
ApprovalTaskили вывода CLI.
Предварительные требования
- Администратор кластера развернул
Manual Approval Gate. Если нет, обратитесь к руководству по развертыванию. - У вас есть права на создание или редактирование объектов
Pipeline/PipelineRunв целевом namespace. - Утверждающие могут выполнять патчи ресурсов
approvaltasks.openshift-pipelines.org(обычно черезkubectl) в целевом namespace. Платформы, такие какAlauda Container Platform, предоставляют эту возможность по умолчанию; изменяйте RBAC только если вы явно удалили встроенные разрешения.
Шаги
1. Объявите шаг одобрения в pipeline
Когда pipeline достигает шага wait-for-approval, Tekton создаёт CustomRun. Контроллер одобрения создаёт ApprovalTask с вашими параметрами и удерживает PipelineRun в состоянии ожидания, пока не будет достигнут кворум или не произойдёт отклонение.
2. Отслеживайте статус одобрения
Важные поля статуса:
status.state: общее состояние шлюза, напримерpending,approvedилиrejected.status.approvalsRequired/status.approvalsReceived: отслеживание кворума (число полученных ответов появляется только после того, как хотя бы один утверждающий ответит).status.approversResponse: результат по каждому пользователю/группе с сообщениями, полезно для аудита.
3. Одобрение или отклонение
Одобрение пользователями
Сначала проверьте список утверждающих, чтобы определить правильный индекс:
Чтобы одобрить как пользователь:
Чтобы отклонить как пользователь:
Одобрение группой
Если в качестве утверждающего настроена группа, отдельные её участники могут отправлять своё одобрение, добавляя свой ответ в массив users внутри записи группы. Несколько участников группы могут одобрять независимо, и каждое одобрение учитывается в общем числе approvalsReceived.
Изначально запись группы не содержит поле users:
Первый участник группы создаёт массив users и устанавливает input группы в approve:
Последующие участники добавляют свои записи в существующий массив и обновляют input группы:
Чтобы отклонить как участник группы:
После этих патчей проверьте запись группы и статус, чтобы увидеть ответы всех участников:
В этом примере и bob, и carol из группы release-managers одобрили. Каждое одобрение участника группы увеличивает approvalsReceived отдельно, поэтому два одобрения членов группы считаются как два одобрения для достижения требуемого количества. Поле status.approversResponse показывает подробную информацию об одобрениях, включая ответы отдельных участников группы.
Основные моменты для одобрения группой:
- Каждый участник группы должен выполнить две обязательные операции: добавить свою запись в массив
usersИ установитьinputгруппы (либоapprove, либоreject). Опционально можно также задать полеmessageгруппы. - Первый участник создаёт массив
usersпо пути/spec/approvers/<index>/usersсо значением массива. - Последующие участники добавляют записи в массив по пути
/spec/approvers/<index>/users/-, где-означает добавление в конец массива. - Каждая запись пользователя в массиве
usersсодержит только поляnameиinput(без поляmessageвнутри записи пользователя). - Поле
messageна уровне группы является опциональным и общим; оно будет перезаписано последующими ответами, если они предоставят новое сообщение. - Каждое одобрение участника группы увеличивает
approvalsReceivedнезависимо. - Несколько участников из одной группы могут одобрять, и каждое одобрение учитывается в общем требуемом количестве.
- Поле
status.approversResponseотслеживает подробную информацию об одобрениях, включая отдельных участников группы. - Используйте
--as <username> --as-group <groupname>, чтобы идентифицироваться как участник группы при патче.
Контроллер устанавливает соответствующие CustomRun и PipelineRun в состояние Succeeded или Failed соответственно: одобрения накапливаются до достижения numberOfApprovalsRequired, тогда как любое отклонение немедленно приводит к сбою этой части pipeline.
Совет: Используйте
--as <username>(обязательно) и--as-group <group>, когда нужно одобрить от имени конкретной личности. Валидационный webhook позволяет изменять только запись, соответствующую этому пользователю и группе. RBAC должен предоставлять права на имитацию. Например,kubectl patch ... --as bob --as-group release-managersидентифицирует вас как пользователяbob, действующего в группеrelease-managers.
4. Увеличьте таймауты PipelineRun для длительных одобрений
Если одобрение может занять часы или дни, настройте оба параметра PipelineRun.spec.timeouts.pipeline и PipelineRun.spec.timeouts.tasks так, чтобы они превышали окно одобрения, чтобы выполнение не завершилось до ответа утверждающих. Пример простого PipelineRun для проверки шлюза одобрения:
Убедитесь, что параметр timeout задачи одобрения короче таймаута pipeline. Иначе PipelineRun может завершиться раньше, оставив одобрение нерешённым.
Результаты работы
kubectl get approvaltasks -o yamlпоказывает каждый шлюз одобрения с полямиstateи связанными с кворумом (столбецapprovalsReceivedпоявляется после ответа хотя бы одного утверждающего).- Статус
PipelineRunотражает результат одобрения: при одобрении последующие задачи продолжаются; при отклонении выполнение завершается с ошибкой, причина которой передаётся изApprovalTask. - Логи диспетчера или вывод
kubectl get approvaltask -o yamlпредоставляют историю одобрений для аудита.
Устранение неполадок
- Задача одобрения не появляется: Убедитесь, что установленный администратором CR
ManualApprovalGateв состоянииREADY. Без контроллера объектыCustomRunостаются в ожидании. - Утверждающим не хватает прав: Предоставьте им доступ
get,list,updateиpatchк ресурсамapprovaltasks.openshift-pipelines.orgв соответствующем namespace. - Pipeline завершился до окончания одобрения: Установите таймауты
PipelineRun.spec.timeouts.pipelineиPipelineRun.spec.timeouts.tasks, покрывающие ожидаемое окно одобрения, и убедитесь, что таймаут задачи одобрения реалистичен. Иначе выполнение может завершиться по таймауту, даже если утверждающие не ответили. - Зависание в состоянии ожидания даже после одобрений: Проверьте
status.approversResponseна наличие пользователей, изменивших голос или отклонивших. Возможно, потребуется обновить список утверждающих и повторно запустить pipeline.
Идентификаторы пользователей и групп
Manual Approval Gate опирается на провайдера идентификации вашей платформы для сопоставления имён утверждающих. Всегда используйте канонические идентификаторы, предоставляемые провайдером, а не отображаемые имена в UI. Например, в Alauda Container Platform:
Используйте столбец USERNAME (например, admin) при добавлении пользователей-утверждающих.
Используйте столбец NAME (например, g-v9mfs) при ссылке на группы утверждающих (например, group:g-v9mfs). Другие платформы предоставляют аналогичные ресурсы — обратитесь к документации службы идентификации для точных названий полей.