mirror of https://github.com/fluxcd/flagger.git
				
				
				
			Upgrade CRD to v1alpha2
- add required fields for deployment and hpa targets - make service port mandatory - add webhooks validation
This commit is contained in:
		
							parent
							
								
									0d96bedfee
								
							
						
					
					
						commit
						199e3b36c6
					
				
							
								
								
									
										18
									
								
								README.md
								
								
								
								
							
							
						
						
									
										18
									
								
								README.md
								
								
								
								
							| 
						 | 
				
			
			@ -73,7 +73,7 @@ You can change the canary analysis _max weight_ and the _step weight_ percentage
 | 
			
		|||
For a deployment named _podinfo_, a canary promotion can be defined using Flagger's custom resource:
 | 
			
		||||
 | 
			
		||||
```yaml
 | 
			
		||||
apiVersion: flagger.app/v1alpha1
 | 
			
		||||
apiVersion: flagger.app/v1alpha2
 | 
			
		||||
kind: Canary
 | 
			
		||||
metadata:
 | 
			
		||||
  name: podinfo
 | 
			
		||||
| 
						 | 
				
			
			@ -87,7 +87,7 @@ spec:
 | 
			
		|||
  # the maximum time in seconds for the canary deployment
 | 
			
		||||
  # to make progress before it is rollback (default 600s)
 | 
			
		||||
  progressDeadlineSeconds: 60
 | 
			
		||||
  # hpa reference (optional)
 | 
			
		||||
  # HPA reference (optional)
 | 
			
		||||
  autoscalerRef:
 | 
			
		||||
    apiVersion: autoscaling/v2beta1
 | 
			
		||||
    kind: HorizontalPodAutoscaler
 | 
			
		||||
| 
						 | 
				
			
			@ -100,16 +100,17 @@ spec:
 | 
			
		|||
    - public-gateway.istio-system.svc.cluster.local
 | 
			
		||||
    # Istio virtual service host names (optional)
 | 
			
		||||
    hosts:
 | 
			
		||||
    - app.istio.weavedx.com
 | 
			
		||||
    - app.iowa.weavedx.com
 | 
			
		||||
  canaryAnalysis:
 | 
			
		||||
    # max number of failed metric checks before rollback
 | 
			
		||||
    threshold: 5
 | 
			
		||||
    threshold: 10
 | 
			
		||||
    # max traffic percentage routed to canary
 | 
			
		||||
    # percentage (0-100)
 | 
			
		||||
    maxWeight: 50
 | 
			
		||||
    # canary increment step
 | 
			
		||||
    # percentage (0-100)
 | 
			
		||||
    stepWeight: 10
 | 
			
		||||
    stepWeight: 5
 | 
			
		||||
    # Istio Prometheus checks
 | 
			
		||||
    metrics:
 | 
			
		||||
    - name: istio_requests_total
 | 
			
		||||
      # minimum req success rate (non 5xx responses)
 | 
			
		||||
| 
						 | 
				
			
			@ -121,6 +122,13 @@ spec:
 | 
			
		|||
      # milliseconds
 | 
			
		||||
      threshold: 500
 | 
			
		||||
      interval: 30s
 | 
			
		||||
    # external checks (optional)
 | 
			
		||||
    webhooks:
 | 
			
		||||
      - name: integration-tests
 | 
			
		||||
        url: http://podinfo.test:9898/echo
 | 
			
		||||
        timeout: 5s
 | 
			
		||||
        metadata:
 | 
			
		||||
          test: "all"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The canary analysis is using the following promql queries:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
apiVersion: flagger.app/v1alpha1
 | 
			
		||||
apiVersion: flagger.app/v1alpha2
 | 
			
		||||
kind: Canary
 | 
			
		||||
metadata:
 | 
			
		||||
  name: podinfo
 | 
			
		||||
| 
						 | 
				
			
			@ -35,6 +35,7 @@ spec:
 | 
			
		|||
    # canary increment step
 | 
			
		||||
    # percentage (0-100)
 | 
			
		||||
    stepWeight: 5
 | 
			
		||||
    # Istio Prometheus checks
 | 
			
		||||
    metrics:
 | 
			
		||||
    - name: istio_requests_total
 | 
			
		||||
      # minimum req success rate (non 5xx responses)
 | 
			
		||||
| 
						 | 
				
			
			@ -46,3 +47,10 @@ spec:
 | 
			
		|||
      # milliseconds
 | 
			
		||||
      threshold: 500
 | 
			
		||||
      interval: 30s
 | 
			
		||||
    # external checks (optional)
 | 
			
		||||
    webhooks:
 | 
			
		||||
      - name: integration-tests
 | 
			
		||||
        url: http://podinfo.test:9898/echo
 | 
			
		||||
        timeout: 5s
 | 
			
		||||
        metadata:
 | 
			
		||||
          test: "all"
 | 
			
		||||
| 
						 | 
				
			
			@ -4,11 +4,14 @@ metadata:
 | 
			
		|||
  name: canaries.flagger.app
 | 
			
		||||
spec:
 | 
			
		||||
  group: flagger.app
 | 
			
		||||
  version: v1alpha1
 | 
			
		||||
  version: v1alpha2
 | 
			
		||||
  versions:
 | 
			
		||||
    - name: v1alpha1
 | 
			
		||||
    - name: v1alpha2
 | 
			
		||||
      served: true
 | 
			
		||||
      storage: true
 | 
			
		||||
    - name: v1alpha1
 | 
			
		||||
      served: true
 | 
			
		||||
      storage: false
 | 
			
		||||
  names:
 | 
			
		||||
    plural: canaries
 | 
			
		||||
    singular: canary
 | 
			
		||||
| 
						 | 
				
			
			@ -26,6 +29,8 @@ spec:
 | 
			
		|||
            progressDeadlineSeconds:
 | 
			
		||||
              type: number
 | 
			
		||||
            targetRef:
 | 
			
		||||
              type: object
 | 
			
		||||
              required: ['apiVersion', 'kind', 'name']
 | 
			
		||||
              properties:
 | 
			
		||||
                apiVersion:
 | 
			
		||||
                  type: string
 | 
			
		||||
| 
						 | 
				
			
			@ -34,6 +39,8 @@ spec:
 | 
			
		|||
                name:
 | 
			
		||||
                  type: string
 | 
			
		||||
            autoscalerRef:
 | 
			
		||||
              type: object
 | 
			
		||||
              required: ['apiVersion', 'kind', 'name']
 | 
			
		||||
              properties:
 | 
			
		||||
                apiVersion:
 | 
			
		||||
                  type: string
 | 
			
		||||
| 
						 | 
				
			
			@ -42,6 +49,8 @@ spec:
 | 
			
		|||
                name:
 | 
			
		||||
                  type: string
 | 
			
		||||
            service:
 | 
			
		||||
              type: object
 | 
			
		||||
              required: ['number']
 | 
			
		||||
              properties:
 | 
			
		||||
                port:
 | 
			
		||||
                  type: number
 | 
			
		||||
| 
						 | 
				
			
			@ -58,6 +67,7 @@ spec:
 | 
			
		|||
                  properties:
 | 
			
		||||
                    items:
 | 
			
		||||
                      type: object
 | 
			
		||||
                      required: ['name', 'interval', 'threshold']
 | 
			
		||||
                      properties:
 | 
			
		||||
                        name:
 | 
			
		||||
                          type: string
 | 
			
		||||
| 
						 | 
				
			
			@ -66,3 +76,18 @@ spec:
 | 
			
		|||
                          pattern: "^[0-9]+(m)"
 | 
			
		||||
                        threshold:
 | 
			
		||||
                          type: number
 | 
			
		||||
                webhooks:
 | 
			
		||||
                  type: array
 | 
			
		||||
                  properties:
 | 
			
		||||
                    items:
 | 
			
		||||
                      type: object
 | 
			
		||||
                      required: ['name', 'url', 'timeout']
 | 
			
		||||
                      properties:
 | 
			
		||||
                        name:
 | 
			
		||||
                          type: string
 | 
			
		||||
                        url:
 | 
			
		||||
                          type: string
 | 
			
		||||
                          format: url
 | 
			
		||||
                        timeout:
 | 
			
		||||
                          type: string
 | 
			
		||||
                          pattern: "^[0-9]+(s)"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ spec:
 | 
			
		|||
      serviceAccountName: flagger
 | 
			
		||||
      containers:
 | 
			
		||||
      - name: flagger
 | 
			
		||||
        image: quay.io/stefanprodan/flagger:0.1.2
 | 
			
		||||
        image: quay.io/stefanprodan/flagger:0.2.0-alpha.1
 | 
			
		||||
        imagePullPolicy: Always
 | 
			
		||||
        ports:
 | 
			
		||||
        - name: http
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
apiVersion: v1
 | 
			
		||||
name: flagger
 | 
			
		||||
version: 0.1.2
 | 
			
		||||
appVersion: 0.1.2
 | 
			
		||||
appVersion: 0.2.0-alpha.1
 | 
			
		||||
kubeVersion: ">=1.9.0-0"
 | 
			
		||||
engine: gotpl
 | 
			
		||||
description: Flagger is a Kubernetes operator that automates the promotion of canary deployments using Istio routing for traffic shifting and Prometheus metrics for canary analysis.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,15 +3,16 @@ apiVersion: apiextensions.k8s.io/v1beta1
 | 
			
		|||
kind: CustomResourceDefinition
 | 
			
		||||
metadata:
 | 
			
		||||
  name: canaries.flagger.app
 | 
			
		||||
  annotations:
 | 
			
		||||
    "helm.sh/resource-policy": keep
 | 
			
		||||
spec:
 | 
			
		||||
  group: flagger.app
 | 
			
		||||
  version: v1alpha1
 | 
			
		||||
  version: v1alpha2
 | 
			
		||||
  versions:
 | 
			
		||||
    - name: v1alpha1
 | 
			
		||||
    - name: v1alpha2
 | 
			
		||||
      served: true
 | 
			
		||||
      storage: true
 | 
			
		||||
    - name: v1alpha1
 | 
			
		||||
      served: true
 | 
			
		||||
      storage: false
 | 
			
		||||
  names:
 | 
			
		||||
    plural: canaries
 | 
			
		||||
    singular: canary
 | 
			
		||||
| 
						 | 
				
			
			@ -22,13 +23,15 @@ spec:
 | 
			
		|||
      properties:
 | 
			
		||||
        spec:
 | 
			
		||||
          required:
 | 
			
		||||
          - targetRef
 | 
			
		||||
          - service
 | 
			
		||||
          - canaryAnalysis
 | 
			
		||||
            - targetRef
 | 
			
		||||
            - service
 | 
			
		||||
            - canaryAnalysis
 | 
			
		||||
          properties:
 | 
			
		||||
            progressDeadlineSeconds:
 | 
			
		||||
              type: number
 | 
			
		||||
            targetRef:
 | 
			
		||||
              type: object
 | 
			
		||||
              required: ['apiVersion', 'kind', 'name']
 | 
			
		||||
              properties:
 | 
			
		||||
                apiVersion:
 | 
			
		||||
                  type: string
 | 
			
		||||
| 
						 | 
				
			
			@ -37,6 +40,8 @@ spec:
 | 
			
		|||
                name:
 | 
			
		||||
                  type: string
 | 
			
		||||
            autoscalerRef:
 | 
			
		||||
              type: object
 | 
			
		||||
              required: ['apiVersion', 'kind', 'name']
 | 
			
		||||
              properties:
 | 
			
		||||
                apiVersion:
 | 
			
		||||
                  type: string
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +50,8 @@ spec:
 | 
			
		|||
                name:
 | 
			
		||||
                  type: string
 | 
			
		||||
            service:
 | 
			
		||||
              type: object
 | 
			
		||||
              required: ['number']
 | 
			
		||||
              properties:
 | 
			
		||||
                port:
 | 
			
		||||
                  type: number
 | 
			
		||||
| 
						 | 
				
			
			@ -61,6 +68,7 @@ spec:
 | 
			
		|||
                  properties:
 | 
			
		||||
                    items:
 | 
			
		||||
                      type: object
 | 
			
		||||
                      required: ['name', 'interval', 'threshold']
 | 
			
		||||
                      properties:
 | 
			
		||||
                        name:
 | 
			
		||||
                          type: string
 | 
			
		||||
| 
						 | 
				
			
			@ -69,4 +77,20 @@ spec:
 | 
			
		|||
                          pattern: "^[0-9]+(m)"
 | 
			
		||||
                        threshold:
 | 
			
		||||
                          type: number
 | 
			
		||||
                webhooks:
 | 
			
		||||
                  type: array
 | 
			
		||||
                  properties:
 | 
			
		||||
                    items:
 | 
			
		||||
                      type: object
 | 
			
		||||
                      required: ['name', 'url', 'timeout']
 | 
			
		||||
                      properties:
 | 
			
		||||
                        name:
 | 
			
		||||
                          type: string
 | 
			
		||||
                        url:
 | 
			
		||||
                          type: string
 | 
			
		||||
                          format: url
 | 
			
		||||
                        timeout:
 | 
			
		||||
                          type: string
 | 
			
		||||
                          pattern: "^[0-9]+(s)"
 | 
			
		||||
 | 
			
		||||
{{- end }}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
image:
 | 
			
		||||
  repository: quay.io/stefanprodan/flagger
 | 
			
		||||
  tag: 0.1.2
 | 
			
		||||
  tag: 0.2.0-alpha.1
 | 
			
		||||
  pullPolicy: IfNotPresent
 | 
			
		||||
 | 
			
		||||
controlLoopInterval: "10s"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@
 | 
			
		|||
For a deployment named _podinfo_, a canary promotion can be defined using Flagger's custom resource:
 | 
			
		||||
 | 
			
		||||
```yaml
 | 
			
		||||
apiVersion: flagger.app/v1alpha1
 | 
			
		||||
apiVersion: flagger.app/v1alpha2
 | 
			
		||||
kind: Canary
 | 
			
		||||
metadata:
 | 
			
		||||
  name: podinfo
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ spec:
 | 
			
		|||
  # the maximum time in seconds for the canary deployment
 | 
			
		||||
  # to make progress before it is rollback (default 600s)
 | 
			
		||||
  progressDeadlineSeconds: 60
 | 
			
		||||
  # hpa reference (optional)
 | 
			
		||||
  # HPA reference (optional)
 | 
			
		||||
  autoscalerRef:
 | 
			
		||||
    apiVersion: autoscaling/v2beta1
 | 
			
		||||
    kind: HorizontalPodAutoscaler
 | 
			
		||||
| 
						 | 
				
			
			@ -36,16 +36,17 @@ spec:
 | 
			
		|||
    - public-gateway.istio-system.svc.cluster.local
 | 
			
		||||
    # Istio virtual service host names (optional)
 | 
			
		||||
    hosts:
 | 
			
		||||
    - app.istio.weavedx.com
 | 
			
		||||
    - app.iowa.weavedx.com
 | 
			
		||||
  canaryAnalysis:
 | 
			
		||||
    # max number of failed metric checks before rollback
 | 
			
		||||
    threshold: 5
 | 
			
		||||
    threshold: 10
 | 
			
		||||
    # max traffic percentage routed to canary
 | 
			
		||||
    # percentage (0-100)
 | 
			
		||||
    maxWeight: 50
 | 
			
		||||
    # canary increment step
 | 
			
		||||
    # percentage (0-100)
 | 
			
		||||
    stepWeight: 10
 | 
			
		||||
    stepWeight: 5
 | 
			
		||||
    # Istio Prometheus checks
 | 
			
		||||
    metrics:
 | 
			
		||||
    - name: istio_requests_total
 | 
			
		||||
      # minimum req success rate (non 5xx responses)
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +58,13 @@ spec:
 | 
			
		|||
      # milliseconds
 | 
			
		||||
      threshold: 500
 | 
			
		||||
      interval: 30s
 | 
			
		||||
      
 | 
			
		||||
    # external checks (optional)
 | 
			
		||||
    webhooks:
 | 
			
		||||
      - name: integration-tests
 | 
			
		||||
        url: http://podinfo.test:9898/echo
 | 
			
		||||
        timeout: 5s
 | 
			
		||||
        metadata:
 | 
			
		||||
          test: "all"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Canary Deployment
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -333,7 +333,7 @@ kubectl create secret generic cert-manager-credentials \
 | 
			
		|||
Create a letsencrypt issuer for CloudDNS \(replace `email@example.com` with a valid email address and `my-gcp-project`with your project ID\):
 | 
			
		||||
 | 
			
		||||
```yaml
 | 
			
		||||
apiVersion: certmanager.k8s.io/v1alpha1
 | 
			
		||||
apiVersion: v1alpha2
 | 
			
		||||
kind: Issuer
 | 
			
		||||
metadata:
 | 
			
		||||
  name: letsencrypt-prod
 | 
			
		||||
| 
						 | 
				
			
			@ -363,7 +363,7 @@ kubectl apply -f ./letsencrypt-issuer.yaml
 | 
			
		|||
Create a wildcard certificate \(replace `example.com` with your domain\):
 | 
			
		||||
 | 
			
		||||
```yaml
 | 
			
		||||
apiVersion: certmanager.k8s.io/v1alpha1
 | 
			
		||||
apiVersion: v1alpha2
 | 
			
		||||
kind: Certificate
 | 
			
		||||
metadata:
 | 
			
		||||
  name: istio-gateway
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
 | 
			
		|||
Create a canary custom resource \(replace example.com with your own domain\):
 | 
			
		||||
 | 
			
		||||
```yaml
 | 
			
		||||
apiVersion: flagger.app/v1alpha1
 | 
			
		||||
apiVersion: v1alpha2
 | 
			
		||||
kind: Canary
 | 
			
		||||
metadata:
 | 
			
		||||
  name: podinfo
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,6 +23,6 @@ CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-ge
 | 
			
		|||
 | 
			
		||||
${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \
 | 
			
		||||
  github.com/stefanprodan/flagger/pkg/client github.com/stefanprodan/flagger/pkg/apis \
 | 
			
		||||
  flagger:v1alpha1 \
 | 
			
		||||
  flagger:v1alpha2 \
 | 
			
		||||
  --go-header-file ${SCRIPT_ROOT}/hack/boilerplate.go.txt
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue