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
This commit is contained in:
22
apps/myapp/base/analysistemplate.yaml
Normal file
22
apps/myapp/base/analysistemplate.yaml
Normal file
@@ -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]))
|
||||
13
apps/myapp/base/canary-service.yaml
Normal file
13
apps/myapp/base/canary-service.yaml
Normal file
@@ -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
|
||||
@@ -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
|
||||
@@ -17,3 +17,5 @@ spec:
|
||||
backendRefs:
|
||||
- name: myapp
|
||||
port: 80
|
||||
- name: myapp-canary
|
||||
port: 80
|
||||
|
||||
@@ -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
|
||||
|
||||
47
apps/myapp/base/rollout.yaml
Normal file
47
apps/myapp/base/rollout.yaml
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user