Open christianh814 opened 3 years ago
Hey @christianh814 , we found the same issue and decided to build a controller around that: https://github.com/Skyscanner/argocd-progressive-rollout
You basically define in your CRD how you want to update your generated Applications, and the operator will do the sync for you
It's very alpha stage, we will have something for testing when we complete Milestone 2. Happy to hear any feedback you might have.
https://github.com/argoproj-labs/applicationset/issues/61 feels very similar to this.
Has any progress been made on this front? I believe this to be a major blocker for adopting ApplicationSet.
Hey @ghostsquad, on our side (github.com/skyscanner/applicationset-progressive-sync) we've been doing some progress but for Q4 2021 we had to pause the project. We hope we will be able to resume it in Q1 2022.
It's blocking us as well but we other priorities got in the way.
@maruina thank you for the update!
We are using app-of-apps and would like to adopt ApplicationSets but need functionality defined in this RFE. Thanks for documenting this, and it would meet our use-case, which is defined deployment ordering of Applications by leveraging sync-wave annotations on those Applications.
Instead of using regex, could you use the semantics that many of us may already be aware of and used to, that being the K8s Preferred Affinity semantics?
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
so basically, instead of requiring regex, which is not all that easy to use, instead leverage the labels of the applications, and the label selector functionality?
Instead of using regex, could you use the semantics that many of us may already be aware of and used to, that being the K8s Preferred Affinity semantics?
preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value
so basically, instead of requiring regex, which is not all that easy to use, instead leverage the labels of the applications, and the label selector functionality?
Yes.
Except this should be an "in addition to" and not "instead" 😁
We have seen the similar issue when using ApplicationSet w/ app-of-apps pattern. Using a top level app to include all ApplicationSets, and all apps will be spawned simultaneously, although some apps need to be synced prior to others. Right now, as a workaround, I have to insert some "check" jobs into these apps to ensure the sync order, which makes it very ugly and invasive to existing apps.
Related:
https://github.com/argoproj/argo-cd/issues/7437 https://github.com/argoproj/argo-cd/pull/3892
Looks like having the Application
resource having a dependsOn
feature would help here
Any news on this feature?
Does this solution offer any sync-waves integration? I'm looking for a sync-wave compliant app-of-appsets capability.
@ron1 that's what this does
Say I have an app with 10 appsets and those appsets each have 5 apps. Then say the 50 leaf apps are assigned sync-wave numbers 1 through 50. Will the 50 leaf apps then be deployed one-by-one in sync-wave order?
I didn't get the impression that the new progressive rollouts feature worked like I am describing above.
And another question is regarding rollbacks. if applicationsetcontroller.default.application.progressing.timeout is exceeded, will the applications be rollbacked to the previous version using reverse ordering of progressing steps?
@christianh814
Support for "SyncWaves" for ApplicationSets
ApplicationSets currently does not have support for "syncwaves" like how "App of Apps" does. This is a RFE to provide this same concept with something that we're calling a "syncset". A "syncset" is conceptually the same as a "syncwave".
The current proposed specification is to match the "syncset" by the
Application
name that theApplicationSet
generates.The
matches
will look for anApplication
name defined that theApplicationSet
generates. In the above exampleApplication
"foobar" will have the "syncset" set to"2"
.The potential exists for regex as well
Above example would match
cluster1-foobar
,cluster2-foobar
,cluster3-foobar
but NOTcluster4-bazz
Things to note:
Application
name field0
and log it "no match found".spec.sycnwave
or an emtpy entry likesyncset: {}
will result in theApplicationSet
behaving like it does now. AKA "Application Factory"ApplicationSet
itself, needs to be updated to also check the sync status of theApplication
. It's already checking if it exits, but now needs to check for sync status.Flow:
ApplicationSet
will create theApplication
(s) as it normally does ("factory ofApplication
manifest")Application
. It will wait for it to report "synced" before applying the nextApplication
.syncset
isn't defined,as stated above, no sync checks are performed.Below are example manifests
List Generator
Since
cluster1-bgd
(which will be generated based on the Generator) isn't listed, it will be deployed with0
Cluster Generator
All clusters matching
bgd=dev
with theApplication
name matching will get2
Git File Generator
Any name that ends with
-bgd
(from theconfig.json
file) gets2
(this is a regex example)Git Directory Generator
Here each
Application
gets a "weight" assinged that matches the name and will be deployed in order.Feedback
This is just a mockup of what it can look like. I'm open for suggestions. The "spirit" of the idea is assign the "syncset" number based on the
Application
name field.