Upgrade CRD to v1alpha2

- add required fields for deployment and hpa targets
- make service port mandatory
- add webhooks validation
This commit is contained in:
stefanprodan 2018-12-26 13:46:59 +02:00
parent 0d96bedfee
commit 199e3b36c6
11 changed files with 100 additions and 28 deletions

View File

@ -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:

View File

@ -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"

View File

@ -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)"

View File

@ -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

View File

@ -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.

View File

@ -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 }}

View File

@ -2,7 +2,7 @@
image:
repository: quay.io/stefanprodan/flagger
tag: 0.1.2
tag: 0.2.0-alpha.1
pullPolicy: IfNotPresent
controlLoopInterval: "10s"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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