Дайджесты новостей
Патентный чертёж и строгая инфографика GitOps-пайплайна доставки в Kubernetes через ArgoCD для платежной платформы.

GitOps, ArgoCD и Kubernetes: как Dodo Payments построили прозрачный деплой для PCI DSS

Если твой сервис обрабатывает платежи банковскими картами или подписки, само словосочетание «прохождение ежегодного аудита» вызывает вполне понятный холодок по спине. Стандарт безопасности платежных систем PCI DSS (Payment Card Industry Data Security Standard) и регламенты SOC 2 не прощают вольностей: любой внешний аудитор требует детального ответа на вопрос: кто именно, когда, на каком основании и какую конкретно строчку кода изменил на боевом сервере.

Если в компании деплой до сих пор устроен как вызов рукописного bash-скрипта из CI/CD пайплайна или, что еще опаснее, через права администратора у дежурного инженера с прямым доступом kubectl apply -f, пройти проверку честным путем практически невозможно. Кто-то накатил срочный хотфикс в полночь прямо в консоли кластера, конфигурация уплыла от репозитория (production drift), и через месяц никто в команде уже не понимает, почему контейнер в бою ведет себя иначе, чем на тестовом контуре.

Технический директор международной платежной платформы Dodo Payments Аюш Агарвал (Ayush Agarwal) опубликовал подробный разбор того, как их инженерная команда перестроила доставку изменений на базе концепции GitOps и оркестратора ArgoCD. Им удалось не только гарантировать стопроцентную прозрачность для аудита, но и свести количество сбоев при обновлениях к нулю.

Zero kubectl: Git как единственный источник истины

Первым и самым жестким архитектурным решением стал полный отзыв прямого административного доступа к продакшен-кластеру Kubernetes у всех живых разработчиков и DevOps-инженеров. Никаких клиентских сертификатов на личных ноутбуках, никаких аварийных SSH-туннелей.

Вся инфраструктура была разделена на два изолированных репозитория:

  1. Репозиторий приложений (app-repo): здесь живет только исходный код платежных сервисов, юнит-тесты и пайплайны сборки Docker-образов. При слиянии Pull Request система сборки пушит готовый протестированный образ в реестр контейнеров с уникальным тегом коммита.
  2. Инфраструктурный репозиторий (infra-gitops-repo): здесь в виде декларативных маниспортов описано эталонное состояние всей платформы. Репозиторий строго разбит на ветки окружений (staging и main для продакшена).

Единственной сущностью, имеющей права на изменение ресурсов в кластере, стал сервисный аккаунт самого контроллера ArgoCD. Инженер вносит правки в манифест, открывает Pull Request, проходит обязательное код-ревью с аппрувом двух сеньор-разработчиков и автоматические тесты безопасности. После слияния коммита в ветку main ArgoCD самостоятельно считывает изменения и приводит кластер к описанному состоянию.

Если кто-то внутри инфраструктуры попытается вручную изменить количество реплик или отредактировать переменную окружения пода, ArgoCD зафиксирует дрифт и в течение нескольких секунд перезапишет ресурс эталонным значением из Git (механизм Self-Heal).

Декларация ArgoCD Application и автоматический аудит

Для управления сервисом в кластере разворачивается манифест Application. Ниже приведен реальный конфигурационный файл основного платежного ядра:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: payment-core
  namespace: argocd
spec:
  project: default
  source:
    repoURL: 'https://github.com/dodopayments/infra-gitops-repo.git'
    targetRevision: main
    path: environments/production/payment-core
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: payments
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Обрати внимание на блок syncPolicy.automated: опция prune: true удаляет из кластера устаревшие ресурсы, если они были стерты из Git, а selfHeal: true мгновенно ликвидирует любой несанкционированный ручной дрифт. Для аудитора PCI DSS журнал Git-коммитов становится исчерпывающим доказательством: каждая точка конфигурации подписана криптографическим GPG-ключом автора коммита.

Сайдкар базы данных и двухфазный graceful shutdown

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

Команда Dodo Payments решила эту задачу связкой двух проверенных паттернов:

  1. Database Proxy Sidecar: рядом с контейнером приложения в том же поде крутится легковесный сайдкар-прокси базы данных. Приложение общается с ним через локальный сокет, а прокси удерживает постоянный пул соединений с базой данных, изолируя кратковременные сетевые скачки.
  2. Двухфазная задержка preStop: по умолчанию Kubernetes отправляет сигнал SIGTERM в контейнер одновременно с исключением его IP-адреса из списка Endpoints сервиса. Из-за асинхронности iptables балансировщик успевает заслать еще несколько запросов в уже умирающий контейнер.

Чтобы полностью устранить эту проблему, в манифест Deployment была добавлена пятнадцатисекундная пауза жизненного цикла:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: payment-service
  namespace: payments
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: payment-api
        image: dodopayments/payment-core:v2.14.0
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 15"]
      - name: db-proxy-sidecar
        image: dodopayments/db-pool-proxy:v1.2.0

Пока выполняется команда sleep 15, внешний Ingress-контроллер гарантированно успевает убрать узел из пула балансировки, новые запросы перенаправляются на соседние реплики, а контейнер спокойно дорабатывает активные финансовые операции и только после этого закрывает соединения.

Управление секретами без компрометации Git

Один из главных страхов при переходе на GitOps — случайная утечка приватных ключей шифрования и токенов платежных шлюзов в публичный или внутренний репозиторий.

В Dodo Payments эту задачу закрыли через связку оператора External Secrets Operator и корпоративного хранилища HashiCorp Vault. В Git хранятся исключительно ссылки на ключи (манифесты ExternalSecret), описывающие, откуда именно нужно забрать токен. ArgoCD синхронизирует эти ссылки, а оператор внутри защищенного периметра кластера подтягивает фактические значения из Vault прямо в оперативную память Kubernetes Secrets.

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

Таймауты синхронизации ArgoCD

Если в твоем инфраструктурном репозитории сотни манифестов, никогда не ставь опрос Git (polling interval) короче трех минут: GitHub быстро заблокирует запросы по лимитам API. Настрой передачу Webhook-уведомлений от репозитория к серверу ArgoCD при каждом успешном пуше — синхронизация будет срабатывать мгновенно и без паразитной нагрузки.

Итоги перехода

Результат этой архитектурной перестройки говорит сам за себя. Сертификационный аудит PCI DSS был пройден без единого замечания к пайплайну доставки, количество сетевых ошибок 502 Bad Gateway при ежедневных релизах упало до нуля, а время полного аварийного развертывания всей инфраструктуры с нуля в резервном регионе теперь занимает считанные минуты.