ArgoCD синхронизирует волны между приложениями
У нас есть проект ArgoCD. В этом проекте у нас есть несколько приложений (назовем их A, B и C), которые передают сообщения друг другу через кластер Kafka. Для этого нужно создать темы.
Приложение A отвечает за управление кластером Kafka (помимо прочего). У нас есть перехватчик PreSync в приложении A для создания и настройки тем перед обновлением других ресурсов, от которых зависят приложения B и C.
Это означает, что нам нужно приложение A для синхронизации перед другими приложениями, чтобы обеспечить плавное развертывание. Чтобы попытаться справиться с этим, мы добавили приложение A в SyncWave
-1
, с другими по умолчанию
0
kind: Application
metadata:
name: "A"
annotations:
argocd.argoproj.io/sync-wave: "-1"
Наше первоначальное предположение (возможно, глупое) заключалось в том, что координация синхронизации применяется в рамках проекта, однако кажется, что она применяется только в приложении.
Итак, происходит то, что ресурсы в приложении A ждут, пока перехватчик PreSync подготовит темы, как ожидалось, но приложения B и C не ждут, пока приложение A будет синхронизировано.
Есть ли способ контролировать порядок / зависимости синхронизации между приложениями внутри проекта?
Я видел упоминание о шаблоне "приложение из приложений", когда у вас есть одно приложение, которое развертывает все другие приложения. Позволит ли это нам использовать SyncWave, чтобы убедиться, что приложение A полностью разрешится, прежде чем пытаться синхронизировать приложения B и C? Если нет, есть ли другой способ?
2 ответа
Начиная с версии 1.8 ArgoCD, часть, делающая это возможным, была удалена. Более подробную информацию можно найти здесь .
Необходимо обновить argocd-cm, чтобы включить проверку работоспособности приложения с использованием части resource.customizations, как в примере ниже. Более подробную информацию можно найти здесь и здесь .
---
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
labels:
app.kubernetes.io/name: argocd-cm
app.kubernetes.io/part-of: argocd
data:
resource.customizations: |
argoproj.io/Application:
health.lua: |
hs = {}
hs.status = "Progressing"
hs.message = ""
if obj.status ~= nil then
if obj.status.health ~= nil then
hs.status = obj.status.health.status
if obj.status.health.message ~= nil then
hs.message = obj.status.health.message
end
end
end
return hs
У нас есть app-of-apps (приложение для начальной загрузки), и именно так мы организуем волны синхронизации между приложениями. Однако мне не повезло, ТАКЖЕ добавление волн синхронизации в манифесты В каждом приложении. Судя по документации, манифесты применяются по типу (например, сначала пространства имен), а затем в алфавитном порядке по имени (без учета регистра).