From eaf56bc1b6209cc13bb5c44ca34637127a3579bf Mon Sep 17 00:00:00 2001 From: Admin Date: Sun, 1 Feb 2026 23:24:13 +0000 Subject: [PATCH] feat: convert Deployment to Rollout CRD with canary strategy - Replace deployment.yaml with rollout.yaml - Add canary-service.yaml for traffic splitting - Add analysistemplate.yaml for Prometheus health checks - Update HTTPRoute with dual backends (stable + canary) - Update overlays with Rollout patches - Add Rollout transformer configuration for Kustomize --- apps/myapp/base/analysistemplate.yaml | 22 +++++++++ apps/myapp/base/canary-service.yaml | 13 +++++ apps/myapp/base/deployment.yaml | 21 --------- apps/myapp/base/httproute.yaml | 2 + apps/myapp/base/kustomization.yaml | 7 ++- apps/myapp/base/rollout.yaml | 47 +++++++++++++++++++ .../overlays/production/kustomization.yaml | 2 +- ...ployment-patch.yaml => rollout-patch.yaml} | 10 +++- .../myapp/overlays/staging/kustomization.yaml | 2 +- ...ployment-patch.yaml => rollout-patch.yaml} | 10 +++- 10 files changed, 108 insertions(+), 28 deletions(-) create mode 100644 apps/myapp/base/analysistemplate.yaml create mode 100644 apps/myapp/base/canary-service.yaml delete mode 100644 apps/myapp/base/deployment.yaml create mode 100644 apps/myapp/base/rollout.yaml rename apps/myapp/overlays/production/{deployment-patch.yaml => rollout-patch.yaml} (58%) rename apps/myapp/overlays/staging/{deployment-patch.yaml => rollout-patch.yaml} (59%) diff --git a/apps/myapp/base/analysistemplate.yaml b/apps/myapp/base/analysistemplate.yaml new file mode 100644 index 0000000..fa2e065 --- /dev/null +++ b/apps/myapp/base/analysistemplate.yaml @@ -0,0 +1,22 @@ +apiVersion: argoproj.io/v1alpha1 +kind: AnalysisTemplate +metadata: + name: success-rate + labels: + app: myapp + managed-by: argocd +spec: + args: + - name: service-name + metrics: + - name: success-rate + interval: 30s + successCondition: result[0] >= 0.95 + failureLimit: 3 + provider: + prometheus: + address: http://kube-prometheus-stack-prometheus.monitoring.svc.cluster.local:9090 + query: | + sum(rate(http_requests_total{service="{{args.service-name}}",code=~"2.."}[1m])) + / + sum(rate(http_requests_total{service="{{args.service-name}}"}[1m])) diff --git a/apps/myapp/base/canary-service.yaml b/apps/myapp/base/canary-service.yaml new file mode 100644 index 0000000..e0d3a78 --- /dev/null +++ b/apps/myapp/base/canary-service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: myapp-canary + labels: + app: myapp + managed-by: argocd +spec: + selector: + app: myapp + ports: + - port: 80 + targetPort: 80 diff --git a/apps/myapp/base/deployment.yaml b/apps/myapp/base/deployment.yaml deleted file mode 100644 index e095559..0000000 --- a/apps/myapp/base/deployment.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: myapp - labels: - app: myapp - managed-by: argocd -spec: - selector: - matchLabels: - app: myapp - template: - metadata: - labels: - app: myapp - spec: - containers: - - name: myapp - image: nginx:alpine - ports: - - containerPort: 80 diff --git a/apps/myapp/base/httproute.yaml b/apps/myapp/base/httproute.yaml index 380a60c..5ee1fa6 100644 --- a/apps/myapp/base/httproute.yaml +++ b/apps/myapp/base/httproute.yaml @@ -17,3 +17,5 @@ spec: backendRefs: - name: myapp port: 80 + - name: myapp-canary + port: 80 diff --git a/apps/myapp/base/kustomization.yaml b/apps/myapp/base/kustomization.yaml index c9845ca..a609a99 100644 --- a/apps/myapp/base/kustomization.yaml +++ b/apps/myapp/base/kustomization.yaml @@ -2,6 +2,11 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: -- deployment.yaml +- rollout.yaml - service.yaml +- canary-service.yaml - httproute.yaml +- analysistemplate.yaml + +configurations: +- https://argoproj.github.io/argo-rollouts/features/kustomize/rollout-transform-kustomize-v5.yaml diff --git a/apps/myapp/base/rollout.yaml b/apps/myapp/base/rollout.yaml new file mode 100644 index 0000000..2a2bb93 --- /dev/null +++ b/apps/myapp/base/rollout.yaml @@ -0,0 +1,47 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: myapp + labels: + app: myapp + managed-by: argocd +spec: + revisionHistoryLimit: 3 + selector: + matchLabels: + app: myapp + strategy: + canary: + canaryService: myapp-canary + stableService: myapp + trafficRouting: + plugins: + argoproj-labs/gatewayAPI: + httpRoute: myapp-route + namespace: default + analysis: + templates: + - templateName: success-rate + args: + - name: service-name + value: myapp + startingStep: 1 + steps: + - setWeight: 10 + - pause: {duration: 30s} + - setWeight: 30 + - pause: {duration: 1m} + - setWeight: 60 + - pause: {duration: 1m} + - setWeight: 100 + template: + metadata: + labels: + app: myapp + spec: + containers: + - name: myapp + image: nginx:alpine + ports: + - name: http + containerPort: 80 diff --git a/apps/myapp/overlays/production/kustomization.yaml b/apps/myapp/overlays/production/kustomization.yaml index 3f17306..a4594e5 100644 --- a/apps/myapp/overlays/production/kustomization.yaml +++ b/apps/myapp/overlays/production/kustomization.yaml @@ -7,7 +7,7 @@ resources: - ../../base patches: -- path: deployment-patch.yaml +- path: rollout-patch.yaml - path: httproute-patch.yaml images: diff --git a/apps/myapp/overlays/production/deployment-patch.yaml b/apps/myapp/overlays/production/rollout-patch.yaml similarity index 58% rename from apps/myapp/overlays/production/deployment-patch.yaml rename to apps/myapp/overlays/production/rollout-patch.yaml index 461dc8d..49afa9d 100644 --- a/apps/myapp/overlays/production/deployment-patch.yaml +++ b/apps/myapp/overlays/production/rollout-patch.yaml @@ -1,9 +1,15 @@ -apiVersion: apps/v1 -kind: Deployment +apiVersion: argoproj.io/v1alpha1 +kind: Rollout metadata: name: myapp spec: replicas: 2 + strategy: + canary: + trafficRouting: + plugins: + argoproj-labs/gatewayAPI: + namespace: myapp-production template: spec: containers: diff --git a/apps/myapp/overlays/staging/kustomization.yaml b/apps/myapp/overlays/staging/kustomization.yaml index fb83471..ca9ee84 100644 --- a/apps/myapp/overlays/staging/kustomization.yaml +++ b/apps/myapp/overlays/staging/kustomization.yaml @@ -7,7 +7,7 @@ resources: - ../../base patches: -- path: deployment-patch.yaml +- path: rollout-patch.yaml - path: httproute-patch.yaml images: diff --git a/apps/myapp/overlays/staging/deployment-patch.yaml b/apps/myapp/overlays/staging/rollout-patch.yaml similarity index 59% rename from apps/myapp/overlays/staging/deployment-patch.yaml rename to apps/myapp/overlays/staging/rollout-patch.yaml index 9c11540..c4f18be 100644 --- a/apps/myapp/overlays/staging/deployment-patch.yaml +++ b/apps/myapp/overlays/staging/rollout-patch.yaml @@ -1,9 +1,15 @@ -apiVersion: apps/v1 -kind: Deployment +apiVersion: argoproj.io/v1alpha1 +kind: Rollout metadata: name: myapp spec: replicas: 1 + strategy: + canary: + trafficRouting: + plugins: + argoproj-labs/gatewayAPI: + namespace: myapp-staging template: spec: containers: