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