diff --git a/artifacts/appmesh/canary.yaml b/artifacts/appmesh/canary.yaml deleted file mode 100644 index e1db1314..00000000 --- a/artifacts/appmesh/canary.yaml +++ /dev/null @@ -1,70 +0,0 @@ -apiVersion: flagger.app/v1alpha3 -kind: Canary -metadata: - name: podinfo - namespace: test -spec: - # deployment reference - targetRef: - apiVersion: apps/v1 - kind: Deployment - name: podinfo - # the maximum time in seconds for the canary deployment - # to make progress before it is rollback (default 600s) - progressDeadlineSeconds: 60 - # HPA reference (optional) - autoscalerRef: - apiVersion: autoscaling/v2beta1 - kind: HorizontalPodAutoscaler - name: podinfo - service: - # container port - port: 9898 - # container port name (optional) - # can be http or grpc - portName: http - # App Mesh reference - meshName: global - # App Mesh retry policy (optional) - retries: - attempts: 3 - perTryTimeout: 1s - retryOn: "gateway-error,client-error,stream-error" - # define the canary analysis timing and KPIs - canaryAnalysis: - # schedule interval (default 60s) - interval: 10s - # max number of failed metric checks before rollback - threshold: 10 - # max traffic percentage routed to canary - # percentage (0-100) - maxWeight: 50 - # canary increment step - # percentage (0-100) - stepWeight: 5 - # App Mesh Prometheus checks - metrics: - - name: request-success-rate - # minimum req success rate (non 5xx responses) - # percentage (0-100) - threshold: 99 - interval: 1m - - name: request-duration - # maximum req duration P99 - # milliseconds - threshold: 500 - interval: 30s - # testing (optional) - webhooks: - - name: acceptance-test - type: pre-rollout - url: http://flagger-loadtester.test/ - timeout: 30s - metadata: - type: bash - cmd: "curl -sd 'test' http://podinfo-canary.test:9898/token | grep token" - - name: load-test - url: http://flagger-loadtester.test/ - timeout: 5s - metadata: - cmd: "hey -z 1m -q 10 -c 2 http://podinfo.test:9898/" diff --git a/artifacts/appmesh/deployment.yaml b/artifacts/appmesh/deployment.yaml deleted file mode 100644 index 5d1ee25f..00000000 --- a/artifacts/appmesh/deployment.yaml +++ /dev/null @@ -1,65 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: podinfo - namespace: test - labels: - app: podinfo -spec: - minReadySeconds: 5 - revisionHistoryLimit: 5 - progressDeadlineSeconds: 60 - strategy: - rollingUpdate: - maxUnavailable: 0 - type: RollingUpdate - selector: - matchLabels: - app: podinfo - template: - metadata: - annotations: - prometheus.io/scrape: "true" - labels: - app: podinfo - spec: - containers: - - name: podinfod - image: stefanprodan/podinfo:3.1.0 - imagePullPolicy: IfNotPresent - ports: - - containerPort: 9898 - name: http - protocol: TCP - command: - - ./podinfo - - --port=9898 - - --level=info - env: - - name: PODINFO_UI_COLOR - value: blue - livenessProbe: - exec: - command: - - podcli - - check - - http - - localhost:9898/healthz - initialDelaySeconds: 5 - timeoutSeconds: 5 - readinessProbe: - exec: - command: - - podcli - - check - - http - - localhost:9898/readyz - initialDelaySeconds: 5 - timeoutSeconds: 5 - resources: - limits: - cpu: 2000m - memory: 512Mi - requests: - cpu: 100m - memory: 64Mi diff --git a/artifacts/appmesh/global-mesh.yaml b/artifacts/appmesh/global-mesh.yaml deleted file mode 100644 index 01d6c8ff..00000000 --- a/artifacts/appmesh/global-mesh.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: appmesh.k8s.aws/v1beta1 -kind: Mesh -metadata: - name: global -spec: - serviceDiscoveryType: dns diff --git a/artifacts/appmesh/hpa.yaml b/artifacts/appmesh/hpa.yaml deleted file mode 100644 index fa2b5a6f..00000000 --- a/artifacts/appmesh/hpa.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: autoscaling/v2beta1 -kind: HorizontalPodAutoscaler -metadata: - name: podinfo - namespace: test -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: podinfo - minReplicas: 2 - maxReplicas: 4 - metrics: - - type: Resource - resource: - name: cpu - # scale up if usage is above - # 99% of the requested CPU (100m) - targetAverageUtilization: 99 diff --git a/artifacts/appmesh/ingress.yaml b/artifacts/appmesh/ingress.yaml deleted file mode 100644 index b4d69eb2..00000000 --- a/artifacts/appmesh/ingress.yaml +++ /dev/null @@ -1,172 +0,0 @@ ---- -kind: ConfigMap -apiVersion: v1 -metadata: - name: ingress-config - namespace: test - labels: - app: ingress -data: - envoy.yaml: | - static_resources: - listeners: - - address: - socket_address: - address: 0.0.0.0 - port_value: 8080 - filter_chains: - - filters: - - name: envoy.http_connection_manager - config: - access_log: - - name: envoy.file_access_log - config: - path: /dev/stdout - codec_type: auto - stat_prefix: ingress_http - http_filters: - - name: envoy.router - config: {} - route_config: - name: local_route - virtual_hosts: - - name: local_service - domains: ["*"] - routes: - - match: - prefix: "/" - route: - cluster: podinfo - host_rewrite: podinfo.test - timeout: 15s - retry_policy: - retry_on: "gateway-error,connect-failure,refused-stream" - num_retries: 10 - per_try_timeout: 5s - clusters: - - name: podinfo - connect_timeout: 0.30s - type: strict_dns - lb_policy: round_robin - load_assignment: - cluster_name: podinfo - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: podinfo.test - port_value: 9898 - admin: - access_log_path: /dev/null - address: - socket_address: - address: 0.0.0.0 - port_value: 9999 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: ingress - namespace: test - labels: - app: ingress -spec: - replicas: 1 - selector: - matchLabels: - app: ingress - strategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 0 - template: - metadata: - labels: - app: ingress - annotations: - prometheus.io/path: "/stats/prometheus" - prometheus.io/port: "9999" - prometheus.io/scrape: "true" - # dummy port to exclude ingress from mesh traffic - # only egress should go over the mesh - appmesh.k8s.aws/ports: "444" - spec: - terminationGracePeriodSeconds: 30 - containers: - - name: ingress - image: "envoyproxy/envoy-alpine:v1.11.1" - securityContext: - capabilities: - drop: - - ALL - add: - - NET_BIND_SERVICE - command: - - /usr/local/bin/envoy - args: - - -l - - $loglevel - - -c - - /config/envoy.yaml - - --base-id - - "1234" - ports: - - name: admin - containerPort: 9999 - protocol: TCP - - name: http - containerPort: 8080 - protocol: TCP - livenessProbe: - initialDelaySeconds: 5 - tcpSocket: - port: admin - readinessProbe: - initialDelaySeconds: 5 - tcpSocket: - port: admin - resources: - requests: - cpu: 100m - memory: 64Mi - volumeMounts: - - name: config - mountPath: /config - volumes: - - name: config - configMap: - name: ingress-config ---- -kind: Service -apiVersion: v1 -metadata: - name: ingress - namespace: test -spec: - selector: - app: ingress - ports: - - protocol: TCP - name: http - port: 80 - targetPort: http - type: LoadBalancer ---- -apiVersion: appmesh.k8s.aws/v1beta1 -kind: VirtualNode -metadata: - name: ingress - namespace: test -spec: - meshName: global - listeners: - - portMapping: - port: 80 - protocol: http - serviceDiscovery: - dns: - hostName: ingress.test - backends: - - virtualService: - virtualServiceName: podinfo.test \ No newline at end of file diff --git a/artifacts/canaries/abtest.yaml b/artifacts/canaries/abtest.yaml deleted file mode 100644 index 65afa929..00000000 --- a/artifacts/canaries/abtest.yaml +++ /dev/null @@ -1,67 +0,0 @@ -apiVersion: flagger.app/v1alpha3 -kind: Canary -metadata: - name: podinfo - namespace: test -spec: - # deployment reference - targetRef: - apiVersion: apps/v1 - kind: Deployment - name: podinfo - # the maximum time in seconds for the canary deployment - # to make progress before it is rollback (default 600s) - progressDeadlineSeconds: 60 - # HPA reference (optional) - autoscalerRef: - apiVersion: autoscaling/v2beta1 - kind: HorizontalPodAutoscaler - name: podinfo - service: - # container port - port: 9898 - # Istio gateways (optional) - gateways: - - public-gateway.istio-system.svc.cluster.local - - mesh - # Istio virtual service host names (optional) - hosts: - - app.example.com - # Istio traffic policy (optional) - trafficPolicy: - tls: - # use ISTIO_MUTUAL when mTLS is enabled - mode: DISABLE - canaryAnalysis: - # schedule interval (default 60s) - interval: 10s - # max number of failed metric checks before rollback - threshold: 10 - # total number of iterations - iterations: 10 - # canary match condition - match: - - headers: - cookie: - regex: "^(.*?;)?(type=insider)(;.*)?$" - - headers: - user-agent: - regex: "(?=.*Safari)(?!.*Chrome).*$" - metrics: - - name: request-success-rate - # minimum req success rate (non 5xx responses) - # percentage (0-100) - threshold: 99 - interval: 1m - - name: request-duration - # maximum req duration P99 - # milliseconds - threshold: 500 - interval: 30s - # external checks (optional) - webhooks: - - name: load-test - url: http://flagger-loadtester.test/ - timeout: 5s - metadata: - cmd: "hey -z 1m -q 10 -c 2 -H 'Cookie: type=insider' http://podinfo.test:9898/" diff --git a/artifacts/canaries/canary.yaml b/artifacts/canaries/canary.yaml deleted file mode 100644 index 9fdc9c21..00000000 --- a/artifacts/canaries/canary.yaml +++ /dev/null @@ -1,88 +0,0 @@ -apiVersion: flagger.app/v1alpha3 -kind: Canary -metadata: - name: podinfo - namespace: test -spec: - # service mesh provider (default istio) - # can be: kubernetes, istio, appmesh, smi, nginx, gloo, supergloo - # use the kubernetes provider for Blue/Green style deployments - provider: istio - # deployment reference - targetRef: - apiVersion: apps/v1 - kind: Deployment - name: podinfo - # the maximum time in seconds for the canary deployment - # to make progress before it is rollback (default 600s) - progressDeadlineSeconds: 60 - # HPA reference (optional) - autoscalerRef: - apiVersion: autoscaling/v2beta1 - kind: HorizontalPodAutoscaler - name: podinfo - service: - # container port - port: 9898 - # port name can be http or grpc (default http) - portName: http - # add all the other container ports - # when generating ClusterIP services (default false) - portDiscovery: false - # Istio gateways (optional) - gateways: - - public-gateway.istio-system.svc.cluster.local - # remove the mesh gateway if the public host is - # shared across multiple virtual services - - mesh - # Istio virtual service host names (optional) - hosts: - - app.example.com - # Istio traffic policy (optional) - trafficPolicy: - tls: - # use ISTIO_MUTUAL when mTLS is enabled - mode: DISABLE - # HTTP match conditions (optional) - match: - - uri: - prefix: / - # HTTP rewrite (optional) - rewrite: - uri: / - # HTTP timeout (optional) - timeout: 30s - # promote the canary without analysing it (default false) - skipAnalysis: false - canaryAnalysis: - # schedule interval (default 60s) - interval: 10s - # max number of failed metric checks before rollback - threshold: 10 - # max traffic percentage routed to canary - # percentage (0-100) - maxWeight: 50 - # canary increment step - # percentage (0-100) - stepWeight: 5 - # Prometheus checks - metrics: - - name: request-success-rate - # minimum req success rate (non 5xx responses) - # percentage (0-100) - threshold: 99 - interval: 1m - - name: request-duration - # maximum req duration P99 - # milliseconds - threshold: 500 - interval: 30s - # external checks (optional) - webhooks: - - name: load-test - url: http://flagger-loadtester.test/ - timeout: 5s - metadata: - type: cmd - cmd: "hey -z 1m -q 10 -c 2 http://podinfo-canary.test:9898/" - logCmdOutput: "true" diff --git a/artifacts/canaries/deployment.yaml b/artifacts/canaries/deployment.yaml deleted file mode 100644 index 602fd477..00000000 --- a/artifacts/canaries/deployment.yaml +++ /dev/null @@ -1,68 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: podinfo - namespace: test - labels: - app: podinfo -spec: - minReadySeconds: 5 - revisionHistoryLimit: 5 - progressDeadlineSeconds: 60 - strategy: - rollingUpdate: - maxUnavailable: 0 - type: RollingUpdate - selector: - matchLabels: - app: podinfo - template: - metadata: - annotations: - prometheus.io/scrape: "true" - prometheus.io/port: "9898" - labels: - app: podinfo - spec: - containers: - - name: podinfod - image: stefanprodan/podinfo:3.1.0 - imagePullPolicy: IfNotPresent - ports: - - containerPort: 9898 - name: http - protocol: TCP - command: - - ./podinfo - - --port=9898 - - --level=info - - --random-delay=false - - --random-error=false - env: - - name: PODINFO_UI_COLOR - value: blue - livenessProbe: - exec: - command: - - podcli - - check - - http - - localhost:9898/healthz - initialDelaySeconds: 5 - timeoutSeconds: 5 - readinessProbe: - exec: - command: - - podcli - - check - - http - - localhost:9898/readyz - initialDelaySeconds: 5 - timeoutSeconds: 5 - resources: - limits: - cpu: 2000m - memory: 512Mi - requests: - cpu: 100m - memory: 64Mi diff --git a/artifacts/canaries/hpa.yaml b/artifacts/canaries/hpa.yaml deleted file mode 100644 index fa2b5a6f..00000000 --- a/artifacts/canaries/hpa.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: autoscaling/v2beta1 -kind: HorizontalPodAutoscaler -metadata: - name: podinfo - namespace: test -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: podinfo - minReplicas: 2 - maxReplicas: 4 - metrics: - - type: Resource - resource: - name: cpu - # scale up if usage is above - # 99% of the requested CPU (100m) - targetAverageUtilization: 99 diff --git a/artifacts/cluster/namespaces/test.yaml b/artifacts/cluster/namespaces/test.yaml deleted file mode 100644 index 6126d753..00000000 --- a/artifacts/cluster/namespaces/test.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: test - labels: - istio-injection: enabled diff --git a/artifacts/cluster/releases/test/backend.yaml b/artifacts/cluster/releases/test/backend.yaml deleted file mode 100644 index 79ac9bbb..00000000 --- a/artifacts/cluster/releases/test/backend.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: flux.weave.works/v1beta1 -kind: HelmRelease -metadata: - name: backend - namespace: test - annotations: - flux.weave.works/automated: "true" - flux.weave.works/tag.chart-image: regexp:^1.7.* -spec: - releaseName: backend - chart: - repository: https://flagger.app/ - name: podinfo - version: 2.2.0 - values: - image: - repository: quay.io/stefanprodan/podinfo - tag: 1.7.0 - httpServer: - timeout: 30s - canary: - enabled: true - istioIngress: - enabled: false - loadtest: - enabled: true diff --git a/artifacts/cluster/releases/test/frontend.yaml b/artifacts/cluster/releases/test/frontend.yaml deleted file mode 100644 index 0a62c895..00000000 --- a/artifacts/cluster/releases/test/frontend.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: flux.weave.works/v1beta1 -kind: HelmRelease -metadata: - name: frontend - namespace: test - annotations: - flux.weave.works/automated: "true" - flux.weave.works/tag.chart-image: semver:~1.7 -spec: - releaseName: frontend - chart: - repository: https://flagger.app/ - name: podinfo - version: 2.2.0 - values: - image: - repository: quay.io/stefanprodan/podinfo - tag: 1.7.0 - backend: http://backend-podinfo:9898/echo - canary: - enabled: true - istioIngress: - enabled: true - gateway: public-gateway.istio-system.svc.cluster.local - host: frontend.istio.example.com - loadtest: - enabled: true diff --git a/artifacts/cluster/releases/test/loadtester.yaml b/artifacts/cluster/releases/test/loadtester.yaml deleted file mode 100644 index bd742d60..00000000 --- a/artifacts/cluster/releases/test/loadtester.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: flux.weave.works/v1beta1 -kind: HelmRelease -metadata: - name: loadtester - namespace: test - annotations: - flux.weave.works/automated: "true" - flux.weave.works/tag.chart-image: glob:0.* -spec: - releaseName: flagger-loadtester - chart: - repository: https://flagger.app/ - name: loadtester - version: 0.6.0 - values: - image: - repository: weaveworks/flagger-loadtester - tag: 0.6.1 diff --git a/artifacts/eks/appmesh-prometheus.yaml b/artifacts/eks/appmesh-prometheus.yaml deleted file mode 100644 index c9386d6f..00000000 --- a/artifacts/eks/appmesh-prometheus.yaml +++ /dev/null @@ -1,264 +0,0 @@ ---- -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - name: prometheus - labels: - app: prometheus -rules: - - apiGroups: [""] - resources: - - nodes - - services - - endpoints - - pods - - nodes/proxy - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: - - configmaps - verbs: ["get"] - - nonResourceURLs: ["/metrics"] - verbs: ["get"] ---- -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRoleBinding -metadata: - name: prometheus - labels: - app: prometheus -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: prometheus -subjects: - - kind: ServiceAccount - name: prometheus - namespace: appmesh-system ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: prometheus - namespace: appmesh-system - labels: - app: prometheus ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: prometheus - namespace: appmesh-system - labels: - app: prometheus -data: - prometheus.yml: |- - global: - scrape_interval: 5s - scrape_configs: - - # Scrape config for AppMesh Envoy sidecar - - job_name: 'appmesh-envoy' - metrics_path: /stats/prometheus - kubernetes_sd_configs: - - role: pod - - relabel_configs: - - source_labels: [__meta_kubernetes_pod_container_name] - action: keep - regex: '^envoy$' - - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: ${1}:9901 - target_label: __address__ - - action: labelmap - regex: __meta_kubernetes_pod_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - action: replace - target_label: kubernetes_namespace - - source_labels: [__meta_kubernetes_pod_name] - action: replace - target_label: kubernetes_pod_name - - # Exclude high cardinality metrics - metric_relabel_configs: - - source_labels: [ cluster_name ] - regex: '(outbound|inbound|prometheus_stats).*' - action: drop - - source_labels: [ tcp_prefix ] - regex: '(outbound|inbound|prometheus_stats).*' - action: drop - - source_labels: [ listener_address ] - regex: '(.+)' - action: drop - - source_labels: [ http_conn_manager_listener_prefix ] - regex: '(.+)' - action: drop - - source_labels: [ http_conn_manager_prefix ] - regex: '(.+)' - action: drop - - source_labels: [ __name__ ] - regex: 'envoy_tls.*' - action: drop - - source_labels: [ __name__ ] - regex: 'envoy_tcp_downstream.*' - action: drop - - source_labels: [ __name__ ] - regex: 'envoy_http_(stats|admin).*' - action: drop - - source_labels: [ __name__ ] - regex: 'envoy_cluster_(lb|retry|bind|internal|max|original).*' - action: drop - - # Scrape config for API servers - - job_name: 'kubernetes-apiservers' - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scheme: https - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - relabel_configs: - - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] - action: keep - regex: kubernetes;https - - # Scrape config for nodes - - job_name: 'kubernetes-nodes' - scheme: https - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - kubernetes_sd_configs: - - role: node - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - source_labels: [__meta_kubernetes_node_name] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/${1}/proxy/metrics - - # scrape config for cAdvisor - - job_name: 'kubernetes-cadvisor' - scheme: https - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - kubernetes_sd_configs: - - role: node - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - source_labels: [__meta_kubernetes_node_name] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor - - # scrape config for pods - - job_name: kubernetes-pods - kubernetes_sd_configs: - - role: pod - relabel_configs: - - action: keep - regex: true - source_labels: - - __meta_kubernetes_pod_annotation_prometheus_io_scrape - - source_labels: [ __address__ ] - regex: '.*9901.*' - action: drop - - action: replace - regex: (.+) - source_labels: - - __meta_kubernetes_pod_annotation_prometheus_io_path - target_label: __metrics_path__ - - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - source_labels: - - __address__ - - __meta_kubernetes_pod_annotation_prometheus_io_port - target_label: __address__ - - action: labelmap - regex: __meta_kubernetes_pod_label_(.+) - - action: replace - source_labels: - - __meta_kubernetes_namespace - target_label: kubernetes_namespace - - action: replace - source_labels: - - __meta_kubernetes_pod_name - target_label: kubernetes_pod_name ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: prometheus - namespace: appmesh-system - labels: - app: prometheus -spec: - replicas: 1 - selector: - matchLabels: - app: prometheus - template: - metadata: - labels: - app: prometheus - annotations: - version: "appmesh-v1alpha1" - spec: - serviceAccountName: prometheus - containers: - - name: prometheus - image: "docker.io/prom/prometheus:v2.7.1" - imagePullPolicy: IfNotPresent - args: - - '--storage.tsdb.retention=6h' - - '--config.file=/etc/prometheus/prometheus.yml' - ports: - - containerPort: 9090 - name: http - livenessProbe: - httpGet: - path: /-/healthy - port: 9090 - readinessProbe: - httpGet: - path: /-/ready - port: 9090 - resources: - requests: - cpu: 10m - memory: 128Mi - volumeMounts: - - name: config-volume - mountPath: /etc/prometheus - volumes: - - name: config-volume - configMap: - name: prometheus ---- -apiVersion: v1 -kind: Service -metadata: - name: prometheus - namespace: appmesh-system - labels: - name: prometheus -spec: - selector: - app: prometheus - ports: - - name: http - protocol: TCP - port: 9090 diff --git a/artifacts/examples/appmesh-abtest.yaml b/artifacts/examples/appmesh-abtest.yaml new file mode 100644 index 00000000..6fddb07e --- /dev/null +++ b/artifacts/examples/appmesh-abtest.yaml @@ -0,0 +1,62 @@ +apiVersion: flagger.app/v1beta1 +kind: Canary +metadata: + name: podinfo + namespace: test +spec: + provider: appmesh + progressDeadlineSeconds: 600 + targetRef: + apiVersion: apps/v1 + kind: Deployment + name: podinfo + autoscalerRef: + apiVersion: autoscaling/v2beta1 + kind: HorizontalPodAutoscaler + name: podinfo + service: + port: 80 + targetPort: 9898 + meshName: global + retries: + attempts: 3 + perTryTimeout: 5s + retryOn: "gateway-error,client-error,stream-error" + timeout: 35s + match: + - uri: + prefix: / + rewrite: + uri: / + analysis: + interval: 15s + threshold: 10 + iterations: 10 + match: + - headers: + x-canary: + exact: "insider" + metrics: + - name: request-success-rate + thresholdRange: + min: 99 + interval: 1m + - name: request-duration + thresholdRange: + max: 500 + interval: 30s + webhooks: + - name: conformance-test + type: pre-rollout + url: http://flagger-loadtester.test/ + timeout: 15s + metadata: + type: "bash" + cmd: "curl -sd 'test' http://podinfo-canary.test/token | grep token" + - name: load-test + type: rollout + url: http://flagger-loadtester.test/ + timeout: 5s + metadata: + type: cmd + cmd: "hey -z 1m -q 10 -c 2 -H 'X-Canary: insider' http://podinfo-canary.test/" diff --git a/artifacts/examples/appmesh-canary.yaml b/artifacts/examples/appmesh-canary.yaml new file mode 100644 index 00000000..dcf40c43 --- /dev/null +++ b/artifacts/examples/appmesh-canary.yaml @@ -0,0 +1,59 @@ +apiVersion: flagger.app/v1beta1 +kind: Canary +metadata: + name: podinfo + namespace: test +spec: + provider: appmesh + progressDeadlineSeconds: 600 + targetRef: + apiVersion: apps/v1 + kind: Deployment + name: podinfo + autoscalerRef: + apiVersion: autoscaling/v2beta1 + kind: HorizontalPodAutoscaler + name: podinfo + service: + port: 80 + targetPort: http + meshName: global + retries: + attempts: 3 + perTryTimeout: 5s + retryOn: "gateway-error,client-error,stream-error" + timeout: 35s + match: + - uri: + prefix: / + rewrite: + uri: / + analysis: + interval: 15s + threshold: 10 + maxWeight: 50 + stepWeight: 5 + metrics: + - name: request-success-rate + thresholdRange: + min: 99 + interval: 1m + - name: request-duration + thresholdRange: + max: 500 + interval: 30s + webhooks: + - name: conformance-test + type: pre-rollout + url: http://flagger-loadtester.test/ + timeout: 15s + metadata: + type: "bash" + cmd: "curl -sd 'test' http://podinfo-canary.test/token | grep token" + - name: load-test + type: rollout + url: http://flagger-loadtester.test/ + timeout: 5s + metadata: + type: cmd + cmd: "hey -z 1m -q 10 -c 2 http://podinfo-canary.test/" diff --git a/artifacts/examples/istio-abtest.yaml b/artifacts/examples/istio-abtest.yaml new file mode 100644 index 00000000..f0492bc2 --- /dev/null +++ b/artifacts/examples/istio-abtest.yaml @@ -0,0 +1,70 @@ +apiVersion: flagger.app/v1beta1 +kind: Canary +metadata: + name: podinfo + namespace: test +spec: + provider: istio + targetRef: + apiVersion: apps/v1 + kind: Deployment + name: podinfo + autoscalerRef: + apiVersion: autoscaling/v2beta1 + kind: HorizontalPodAutoscaler + name: podinfo + service: + name: podinfo + port: 80 + targetPort: 9898 + portName: http + portDiscovery: true + gateways: + - public-gateway.istio-system.svc.cluster.local + - mesh + hosts: + - app.example.com + trafficPolicy: + tls: + mode: DISABLE + match: + - uri: + prefix: / + rewrite: + uri: / + timeout: 30s + analysis: + interval: 15s + threshold: 10 + iterations: 10 + match: + - headers: + cookie: + regex: "^(.*?;)?(type=insider)(;.*)?$" + - headers: + user-agent: + regex: "(?=.*Safari)(?!.*Chrome).*$" + metrics: + - name: request-success-rate + thresholdRange: + min: 99 + interval: 1m + - name: request-duration + thresholdRange: + max: 500 + interval: 30s + webhooks: + - name: conformance-test + type: pre-rollout + url: http://flagger-loadtester.test/ + timeout: 15s + metadata: + type: "bash" + cmd: "curl -sd 'test' http://podinfo-canary.test/token | grep token" + - name: load-test + type: rollout + url: http://flagger-loadtester.test/ + timeout: 5s + metadata: + type: cmd + cmd: "hey -z 1m -q 10 -c 2 -H 'Cookie: type=insider' http://podinfo.test/" diff --git a/artifacts/examples/istio-canary.yaml b/artifacts/examples/istio-canary.yaml new file mode 100644 index 00000000..6f576098 --- /dev/null +++ b/artifacts/examples/istio-canary.yaml @@ -0,0 +1,66 @@ +apiVersion: flagger.app/v1beta1 +kind: Canary +metadata: + name: podinfo + namespace: test +spec: + provider: istio + progressDeadlineSeconds: 600 + targetRef: + apiVersion: apps/v1 + kind: Deployment + name: podinfo + autoscalerRef: + apiVersion: autoscaling/v2beta1 + kind: HorizontalPodAutoscaler + name: podinfo + service: + name: podinfo + port: 80 + targetPort: 9898 + portName: http + portDiscovery: true + gateways: + - public-gateway.istio-system.svc.cluster.local + - mesh + hosts: + - app.example.com + trafficPolicy: + tls: + mode: DISABLE + match: + - uri: + prefix: / + rewrite: + uri: / + timeout: 30s + skipAnalysis: false + analysis: + interval: 15s + threshold: 10 + maxWeight: 50 + stepWeight: 5 + metrics: + - name: request-success-rate + thresholdRange: + min: 99 + interval: 1m + - name: request-duration + thresholdRange: + max: 500 + interval: 30s + webhooks: + - name: conformance-test + type: pre-rollout + url: http://flagger-loadtester.test/ + timeout: 15s + metadata: + type: "bash" + cmd: "curl -sd 'test' http://podinfo-canary.test/token | grep token" + - name: load-test + type: rollout + url: http://flagger-loadtester.test/ + timeout: 5s + metadata: + type: cmd + cmd: "hey -z 1m -q 10 -c 2 http://podinfo-canary.test/" diff --git a/artifacts/examples/linkerd-canary.yaml b/artifacts/examples/linkerd-canary.yaml new file mode 100644 index 00000000..63884b9f --- /dev/null +++ b/artifacts/examples/linkerd-canary.yaml @@ -0,0 +1,52 @@ +apiVersion: flagger.app/v1beta1 +kind: Canary +metadata: + name: podinfo + namespace: test +spec: + provider: linkerd + progressDeadlineSeconds: 600 + targetRef: + apiVersion: apps/v1 + kind: Deployment + name: podinfo + autoscalerRef: + apiVersion: autoscaling/v2beta1 + kind: HorizontalPodAutoscaler + name: podinfo + service: + name: podinfo + port: 80 + targetPort: 9898 + portName: http + portDiscovery: true + skipAnalysis: false + analysis: + interval: 15s + threshold: 10 + maxWeight: 50 + stepWeight: 5 + metrics: + - name: request-success-rate + thresholdRange: + min: 99 + interval: 1m + - name: request-duration + thresholdRange: + max: 500 + interval: 30s + webhooks: + - name: conformance-test + type: pre-rollout + url: http://flagger-loadtester.test/ + timeout: 15s + metadata: + type: "bash" + cmd: "curl -sd 'test' http://podinfo-canary.test/token | grep token" + - name: load-test + type: rollout + url: http://flagger-loadtester.test/ + timeout: 5s + metadata: + type: cmd + cmd: "hey -z 1m -q 10 -c 2 http://podinfo-canary.test/" diff --git a/artifacts/gke/istio-gateway.yaml b/artifacts/gke/istio-gateway.yaml deleted file mode 100644 index 79c01615..00000000 --- a/artifacts/gke/istio-gateway.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: networking.istio.io/v1alpha3 -kind: Gateway -metadata: - name: public-gateway - namespace: istio-system -spec: - selector: - istio: ingressgateway - servers: - - port: - number: 80 - name: http - protocol: HTTP - hosts: - - "*" - tls: - httpsRedirect: true - - port: - number: 443 - name: https - protocol: HTTPS - hosts: - - "*" - tls: - mode: SIMPLE - privateKey: /etc/istio/ingressgateway-certs/tls.key - serverCertificate: /etc/istio/ingressgateway-certs/tls.crt diff --git a/artifacts/gke/istio-prometheus.yaml b/artifacts/gke/istio-prometheus.yaml deleted file mode 100644 index 07944d6e..00000000 --- a/artifacts/gke/istio-prometheus.yaml +++ /dev/null @@ -1,834 +0,0 @@ -# Source: istio/charts/prometheus/templates/configmap.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: prometheus - namespace: istio-system - labels: - app: prometheus - chart: prometheus-1.0.6 - heritage: Tiller - release: istio -data: - prometheus.yml: |- - global: - scrape_interval: 15s - scrape_configs: - - - job_name: 'istio-mesh' - # Override the global default and scrape targets from this job every 5 seconds. - scrape_interval: 5s - - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - istio-system - - relabel_configs: - - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] - action: keep - regex: istio-telemetry;prometheus - - - # Scrape config for envoy stats - - job_name: 'envoy-stats' - metrics_path: /stats/prometheus - kubernetes_sd_configs: - - role: pod - - relabel_configs: - - source_labels: [__meta_kubernetes_pod_container_port_name] - action: keep - regex: '.*-envoy-prom' - - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:15090 - target_label: __address__ - - action: labelmap - regex: __meta_kubernetes_pod_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - action: replace - target_label: namespace - - source_labels: [__meta_kubernetes_pod_name] - action: replace - target_label: pod_name - - metric_relabel_configs: - # Exclude some of the envoy metrics that have massive cardinality - # This list may need to be pruned further moving forward, as informed - # by performance and scalability testing. - - source_labels: [ cluster_name ] - regex: '(outbound|inbound|prometheus_stats).*' - action: drop - - source_labels: [ tcp_prefix ] - regex: '(outbound|inbound|prometheus_stats).*' - action: drop - - source_labels: [ listener_address ] - regex: '(.+)' - action: drop - - source_labels: [ http_conn_manager_listener_prefix ] - regex: '(.+)' - action: drop - - source_labels: [ http_conn_manager_prefix ] - regex: '(.+)' - action: drop - - source_labels: [ __name__ ] - regex: 'envoy_tls.*' - action: drop - - source_labels: [ __name__ ] - regex: 'envoy_tcp_downstream.*' - action: drop - - source_labels: [ __name__ ] - regex: 'envoy_http_(stats|admin).*' - action: drop - - source_labels: [ __name__ ] - regex: 'envoy_cluster_(lb|retry|bind|internal|max|original).*' - action: drop - - - - job_name: 'istio-policy' - # Override the global default and scrape targets from this job every 5 seconds. - scrape_interval: 5s - # metrics_path defaults to '/metrics' - # scheme defaults to 'http'. - - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - istio-system - - - relabel_configs: - - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] - action: keep - regex: istio-policy;http-monitoring - - - job_name: 'istio-telemetry' - # Override the global default and scrape targets from this job every 5 seconds. - scrape_interval: 5s - # metrics_path defaults to '/metrics' - # scheme defaults to 'http'. - - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - istio-system - - relabel_configs: - - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] - action: keep - regex: istio-telemetry;http-monitoring - - - job_name: 'pilot' - # Override the global default and scrape targets from this job every 5 seconds. - scrape_interval: 5s - # metrics_path defaults to '/metrics' - # scheme defaults to 'http'. - - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - istio-system - - relabel_configs: - - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] - action: keep - regex: istio-pilot;http-monitoring - - - job_name: 'galley' - # Override the global default and scrape targets from this job every 5 seconds. - scrape_interval: 5s - # metrics_path defaults to '/metrics' - # scheme defaults to 'http'. - - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - istio-system - - relabel_configs: - - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] - action: keep - regex: istio-galley;http-monitoring - - # scrape config for API servers - - job_name: 'kubernetes-apiservers' - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scheme: https - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - relabel_configs: - - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] - action: keep - regex: kubernetes;https - - # scrape config for nodes (kubelet) - - job_name: 'kubernetes-nodes' - scheme: https - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - kubernetes_sd_configs: - - role: node - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - source_labels: [__meta_kubernetes_node_name] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/${1}/proxy/metrics - - # Scrape config for Kubelet cAdvisor. - # - # This is required for Kubernetes 1.7.3 and later, where cAdvisor metrics - # (those whose names begin with 'container_') have been removed from the - # Kubelet metrics endpoint. This job scrapes the cAdvisor endpoint to - # retrieve those metrics. - # - # In Kubernetes 1.7.0-1.7.2, these metrics are only exposed on the cAdvisor - # HTTP endpoint; use "replacement: /api/v1/nodes/${1}:4194/proxy/metrics" - # in that case (and ensure cAdvisor's HTTP server hasn't been disabled with - # the --cadvisor-port=0 Kubelet flag). - # - # This job is not necessary and should be removed in Kubernetes 1.6 and - # earlier versions, or it will cause the metrics to be scraped twice. - - job_name: 'kubernetes-cadvisor' - scheme: https - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - kubernetes_sd_configs: - - role: node - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - source_labels: [__meta_kubernetes_node_name] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor - - # scrape config for service endpoints. - - job_name: 'kubernetes-service-endpoints' - kubernetes_sd_configs: - - role: endpoints - relabel_configs: - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] - action: keep - regex: true - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] - action: replace - target_label: __scheme__ - regex: (https?) - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] - action: replace - target_label: __address__ - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - action: replace - target_label: kubernetes_namespace - - source_labels: [__meta_kubernetes_service_name] - action: replace - target_label: kubernetes_name - - - job_name: 'kubernetes-pods' - kubernetes_sd_configs: - - role: pod - relabel_configs: # If first two labels are present, pod should be scraped by the istio-secure job. - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] - action: keep - regex: true - - source_labels: [__meta_kubernetes_pod_annotation_sidecar_istio_io_status] - action: drop - regex: (.+) - - source_labels: [__meta_kubernetes_pod_annotation_istio_mtls] - action: drop - regex: (true) - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - target_label: __address__ - - action: labelmap - regex: __meta_kubernetes_pod_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - action: replace - target_label: namespace - - source_labels: [__meta_kubernetes_pod_name] - action: replace - target_label: pod_name - - - job_name: 'kubernetes-pods-istio-secure' - scheme: https - tls_config: - ca_file: /etc/istio-certs/root-cert.pem - cert_file: /etc/istio-certs/cert-chain.pem - key_file: /etc/istio-certs/key.pem - insecure_skip_verify: true # prometheus does not support secure naming. - kubernetes_sd_configs: - - role: pod - relabel_configs: - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] - action: keep - regex: true - # sidecar status annotation is added by sidecar injector and - # istio_workload_mtls_ability can be specifically placed on a pod to indicate its ability to receive mtls traffic. - - source_labels: [__meta_kubernetes_pod_annotation_sidecar_istio_io_status, __meta_kubernetes_pod_annotation_istio_mtls] - action: keep - regex: (([^;]+);([^;]*))|(([^;]*);(true)) - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: [__address__] # Only keep address that is host:port - action: keep # otherwise an extra target with ':443' is added for https scheme - regex: ([^:]+):(\d+) - - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - target_label: __address__ - - action: labelmap - regex: __meta_kubernetes_pod_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - action: replace - target_label: namespace - - source_labels: [__meta_kubernetes_pod_name] - action: replace - target_label: pod_name - ---- - -# Source: istio/charts/prometheus/templates/clusterrole.yaml -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - name: prometheus-istio-system - labels: - app: prometheus - chart: prometheus-1.0.6 - heritage: Tiller - release: istio -rules: - - apiGroups: [""] - resources: - - nodes - - services - - endpoints - - pods - - nodes/proxy - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: - - configmaps - verbs: ["get"] - - nonResourceURLs: ["/metrics"] - verbs: ["get"] - ---- - -# Source: istio/charts/prometheus/templates/serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: prometheus - namespace: istio-system - labels: - app: prometheus - chart: prometheus-1.0.6 - heritage: Tiller - release: istio - ---- - -# Source: istio/charts/prometheus/templates/clusterrolebindings.yaml -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRoleBinding -metadata: - name: prometheus-istio-system - labels: - app: prometheus - chart: prometheus-1.0.6 - heritage: Tiller - release: istio -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: prometheus-istio-system -subjects: - - kind: ServiceAccount - name: prometheus - namespace: istio-system - ---- - -# Source: istio/charts/prometheus/templates/service.yaml -apiVersion: v1 -kind: Service -metadata: - name: prometheus - namespace: istio-system - annotations: - prometheus.io/scrape: 'true' - labels: - name: prometheus -spec: - selector: - app: prometheus - ports: - - name: http-prometheus - protocol: TCP - port: 9090 - ---- - -# Source: istio/charts/prometheus/templates/deployment.yaml -apiVersion: apps/v1beta1 -kind: Deployment -metadata: - name: prometheus - namespace: istio-system - labels: - app: prometheus - chart: prometheus-1.0.6 - heritage: Tiller - release: istio -spec: - replicas: 1 - selector: - matchLabels: - app: prometheus - template: - metadata: - labels: - app: prometheus - annotations: - sidecar.istio.io/inject: "false" - scheduler.alpha.kubernetes.io/critical-pod: "" - spec: - serviceAccountName: prometheus - containers: - - name: prometheus - image: "docker.io/prom/prometheus:v2.3.1" - imagePullPolicy: IfNotPresent - args: - - '--storage.tsdb.retention=6h' - - '--config.file=/etc/prometheus/prometheus.yml' - ports: - - containerPort: 9090 - name: http - livenessProbe: - httpGet: - path: /-/healthy - port: 9090 - readinessProbe: - httpGet: - path: /-/ready - port: 9090 - resources: - requests: - cpu: 10m - - volumeMounts: - - name: config-volume - mountPath: /etc/prometheus - - mountPath: /etc/istio-certs - name: istio-certs - volumes: - - name: config-volume - configMap: - name: prometheus - - name: istio-certs - secret: - defaultMode: 420 - optional: true - secretName: istio.default - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: beta.kubernetes.io/arch - operator: In - values: - - amd64 - - ppc64le - - s390x - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 2 - preference: - matchExpressions: - - key: beta.kubernetes.io/arch - operator: In - values: - - amd64 - - weight: 2 - preference: - matchExpressions: - - key: beta.kubernetes.io/arch - operator: In - values: - - ppc64le - - weight: 2 - preference: - matchExpressions: - - key: beta.kubernetes.io/arch - operator: In - values: - - s390x - ---- -apiVersion: "config.istio.io/v1alpha2" -kind: metric -metadata: - name: requestcount - namespace: istio-system -spec: - value: "1" - dimensions: - reporter: conditional((context.reporter.kind | "inbound") == "outbound", "source", "destination") - source_workload: source.workload.name | "unknown" - source_workload_namespace: source.workload.namespace | "unknown" - source_principal: source.principal | "unknown" - source_app: source.labels["app"] | "unknown" - source_version: source.labels["version"] | "unknown" - destination_workload: destination.workload.name | "unknown" - destination_workload_namespace: destination.workload.namespace | "unknown" - destination_principal: destination.principal | "unknown" - destination_app: destination.labels["app"] | "unknown" - destination_version: destination.labels["version"] | "unknown" - destination_service: destination.service.host | "unknown" - destination_service_name: destination.service.name | "unknown" - destination_service_namespace: destination.service.namespace | "unknown" - request_protocol: api.protocol | context.protocol | "unknown" - response_code: response.code | 200 - connection_security_policy: conditional((context.reporter.kind | "inbound") == "outbound", "unknown", conditional(connection.mtls | false, "mutual_tls", "none")) - monitored_resource_type: '"UNSPECIFIED"' ---- -apiVersion: "config.istio.io/v1alpha2" -kind: metric -metadata: - name: requestduration - namespace: istio-system -spec: - value: response.duration | "0ms" - dimensions: - reporter: conditional((context.reporter.kind | "inbound") == "outbound", "source", "destination") - source_workload: source.workload.name | "unknown" - source_workload_namespace: source.workload.namespace | "unknown" - source_principal: source.principal | "unknown" - source_app: source.labels["app"] | "unknown" - source_version: source.labels["version"] | "unknown" - destination_workload: destination.workload.name | "unknown" - destination_workload_namespace: destination.workload.namespace | "unknown" - destination_principal: destination.principal | "unknown" - destination_app: destination.labels["app"] | "unknown" - destination_version: destination.labels["version"] | "unknown" - destination_service: destination.service.host | "unknown" - destination_service_name: destination.service.name | "unknown" - destination_service_namespace: destination.service.namespace | "unknown" - request_protocol: api.protocol | context.protocol | "unknown" - response_code: response.code | 200 - connection_security_policy: conditional((context.reporter.kind | "inbound") == "outbound", "unknown", conditional(connection.mtls | false, "mutual_tls", "none")) - monitored_resource_type: '"UNSPECIFIED"' ---- -apiVersion: "config.istio.io/v1alpha2" -kind: metric -metadata: - name: requestsize - namespace: istio-system -spec: - value: request.size | 0 - dimensions: - reporter: conditional((context.reporter.kind | "inbound") == "outbound", "source", "destination") - source_workload: source.workload.name | "unknown" - source_workload_namespace: source.workload.namespace | "unknown" - source_principal: source.principal | "unknown" - source_app: source.labels["app"] | "unknown" - source_version: source.labels["version"] | "unknown" - destination_workload: destination.workload.name | "unknown" - destination_workload_namespace: destination.workload.namespace | "unknown" - destination_principal: destination.principal | "unknown" - destination_app: destination.labels["app"] | "unknown" - destination_version: destination.labels["version"] | "unknown" - destination_service: destination.service.host | "unknown" - destination_service_name: destination.service.name | "unknown" - destination_service_namespace: destination.service.namespace | "unknown" - request_protocol: api.protocol | context.protocol | "unknown" - response_code: response.code | 200 - connection_security_policy: conditional((context.reporter.kind | "inbound") == "outbound", "unknown", conditional(connection.mtls | false, "mutual_tls", "none")) - monitored_resource_type: '"UNSPECIFIED"' ---- -apiVersion: "config.istio.io/v1alpha2" -kind: metric -metadata: - name: responsesize - namespace: istio-system -spec: - value: response.size | 0 - dimensions: - reporter: conditional((context.reporter.kind | "inbound") == "outbound", "source", "destination") - source_workload: source.workload.name | "unknown" - source_workload_namespace: source.workload.namespace | "unknown" - source_principal: source.principal | "unknown" - source_app: source.labels["app"] | "unknown" - source_version: source.labels["version"] | "unknown" - destination_workload: destination.workload.name | "unknown" - destination_workload_namespace: destination.workload.namespace | "unknown" - destination_principal: destination.principal | "unknown" - destination_app: destination.labels["app"] | "unknown" - destination_version: destination.labels["version"] | "unknown" - destination_service: destination.service.host | "unknown" - destination_service_name: destination.service.name | "unknown" - destination_service_namespace: destination.service.namespace | "unknown" - request_protocol: api.protocol | context.protocol | "unknown" - response_code: response.code | 200 - connection_security_policy: conditional((context.reporter.kind | "inbound") == "outbound", "unknown", conditional(connection.mtls | false, "mutual_tls", "none")) - monitored_resource_type: '"UNSPECIFIED"' ---- -apiVersion: "config.istio.io/v1alpha2" -kind: metric -metadata: - name: tcpbytesent - namespace: istio-system -spec: - value: connection.sent.bytes | 0 - dimensions: - reporter: conditional((context.reporter.kind | "inbound") == "outbound", "source", "destination") - source_workload: source.workload.name | "unknown" - source_workload_namespace: source.workload.namespace | "unknown" - source_principal: source.principal | "unknown" - source_app: source.labels["app"] | "unknown" - source_version: source.labels["version"] | "unknown" - destination_workload: destination.workload.name | "unknown" - destination_workload_namespace: destination.workload.namespace | "unknown" - destination_principal: destination.principal | "unknown" - destination_app: destination.labels["app"] | "unknown" - destination_version: destination.labels["version"] | "unknown" - destination_service: destination.service.name | "unknown" - destination_service_name: destination.service.name | "unknown" - destination_service_namespace: destination.service.namespace | "unknown" - connection_security_policy: conditional((context.reporter.kind | "inbound") == "outbound", "unknown", conditional(connection.mtls | false, "mutual_tls", "none")) - monitored_resource_type: '"UNSPECIFIED"' ---- -apiVersion: "config.istio.io/v1alpha2" -kind: metric -metadata: - name: tcpbytereceived - namespace: istio-system -spec: - value: connection.received.bytes | 0 - dimensions: - reporter: conditional((context.reporter.kind | "inbound") == "outbound", "source", "destination") - source_workload: source.workload.name | "unknown" - source_workload_namespace: source.workload.namespace | "unknown" - source_principal: source.principal | "unknown" - source_app: source.labels["app"] | "unknown" - source_version: source.labels["version"] | "unknown" - destination_workload: destination.workload.name | "unknown" - destination_workload_namespace: destination.workload.namespace | "unknown" - destination_principal: destination.principal | "unknown" - destination_app: destination.labels["app"] | "unknown" - destination_version: destination.labels["version"] | "unknown" - destination_service: destination.service.name | "unknown" - destination_service_name: destination.service.name | "unknown" - destination_service_namespace: destination.service.namespace | "unknown" - connection_security_policy: conditional((context.reporter.kind | "inbound") == "outbound", "unknown", conditional(connection.mtls | false, "mutual_tls", "none")) - monitored_resource_type: '"UNSPECIFIED"' ---- -apiVersion: "config.istio.io/v1alpha2" -kind: prometheus -metadata: - name: handler - namespace: istio-system -spec: - metrics: - - name: requests_total - instance_name: requestcount.metric.istio-system - kind: COUNTER - label_names: - - reporter - - source_app - - source_principal - - source_workload - - source_workload_namespace - - source_version - - destination_app - - destination_principal - - destination_workload - - destination_workload_namespace - - destination_version - - destination_service - - destination_service_name - - destination_service_namespace - - request_protocol - - response_code - - connection_security_policy - - name: request_duration_seconds - instance_name: requestduration.metric.istio-system - kind: DISTRIBUTION - label_names: - - reporter - - source_app - - source_principal - - source_workload - - source_workload_namespace - - source_version - - destination_app - - destination_principal - - destination_workload - - destination_workload_namespace - - destination_version - - destination_service - - destination_service_name - - destination_service_namespace - - request_protocol - - response_code - - connection_security_policy - buckets: - explicit_buckets: - bounds: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10] - - name: request_bytes - instance_name: requestsize.metric.istio-system - kind: DISTRIBUTION - label_names: - - reporter - - source_app - - source_principal - - source_workload - - source_workload_namespace - - source_version - - destination_app - - destination_principal - - destination_workload - - destination_workload_namespace - - destination_version - - destination_service - - destination_service_name - - destination_service_namespace - - request_protocol - - response_code - - connection_security_policy - buckets: - exponentialBuckets: - numFiniteBuckets: 8 - scale: 1 - growthFactor: 10 - - name: response_bytes - instance_name: responsesize.metric.istio-system - kind: DISTRIBUTION - label_names: - - reporter - - source_app - - source_principal - - source_workload - - source_workload_namespace - - source_version - - destination_app - - destination_principal - - destination_workload - - destination_workload_namespace - - destination_version - - destination_service - - destination_service_name - - destination_service_namespace - - request_protocol - - response_code - - connection_security_policy - buckets: - exponentialBuckets: - numFiniteBuckets: 8 - scale: 1 - growthFactor: 10 - - name: tcp_sent_bytes_total - instance_name: tcpbytesent.metric.istio-system - kind: COUNTER - label_names: - - reporter - - source_app - - source_principal - - source_workload - - source_workload_namespace - - source_version - - destination_app - - destination_principal - - destination_workload - - destination_workload_namespace - - destination_version - - destination_service - - destination_service_name - - destination_service_namespace - - connection_security_policy - - name: tcp_received_bytes_total - instance_name: tcpbytereceived.metric.istio-system - kind: COUNTER - label_names: - - reporter - - source_app - - source_principal - - source_workload - - source_workload_namespace - - source_version - - destination_app - - destination_principal - - destination_workload - - destination_workload_namespace - - destination_version - - destination_service - - destination_service_name - - destination_service_namespace - - connection_security_policy ---- -apiVersion: "config.istio.io/v1alpha2" -kind: rule -metadata: - name: promhttp - namespace: istio-system -spec: - match: context.protocol == "http" || context.protocol == "grpc" - actions: - - handler: handler.prometheus - instances: - - requestcount.metric - - requestduration.metric - - requestsize.metric - - responsesize.metric ---- -apiVersion: "config.istio.io/v1alpha2" -kind: rule -metadata: - name: promtcp - namespace: istio-system -spec: - match: context.protocol == "tcp" - actions: - - handler: handler.prometheus - instances: - - tcpbytesent.metric - - tcpbytereceived.metric ---- diff --git a/artifacts/gloo/canary.yaml b/artifacts/gloo/canary.yaml deleted file mode 100644 index 2412f6ae..00000000 --- a/artifacts/gloo/canary.yaml +++ /dev/null @@ -1,52 +0,0 @@ -apiVersion: flagger.app/v1alpha3 -kind: Canary -metadata: - name: podinfo - namespace: test -spec: - provider: gloo - targetRef: - apiVersion: apps/v1 - kind: Deployment - name: podinfo - progressDeadlineSeconds: 60 - autoscalerRef: - apiVersion: autoscaling/v2beta1 - kind: HorizontalPodAutoscaler - name: podinfo - service: - port: 9898 - canaryAnalysis: - interval: 10s - threshold: 10 - maxWeight: 50 - stepWeight: 5 - metrics: - - name: request-success-rate - threshold: 99 - interval: 1m - - name: request-duration - threshold: 500 - interval: 30s - webhooks: - - name: acceptance-test - type: pre-rollout - url: http://flagger-loadtester.test/ - timeout: 10s - metadata: - type: bash - cmd: "curl -sd 'test' http://podinfo-canary:9898/token | grep token" - - name: gloo-acceptance-test - type: pre-rollout - url: http://flagger-loadtester.test/ - timeout: 10s - metadata: - type: bash - cmd: "curl -sd 'test' -H 'Host: app.example.com' http://gateway-proxy-v2.gloo-system/token | grep token" - - name: load-test - url: http://flagger-loadtester.test/ - timeout: 5s - metadata: - type: cmd - cmd: "hey -z 2m -q 5 -c 2 -host app.example.com http://gateway-proxy-v2.gloo-system" - logCmdOutput: "true" diff --git a/artifacts/gloo/virtual-service.yaml b/artifacts/gloo/virtual-service.yaml deleted file mode 100644 index 169e561a..00000000 --- a/artifacts/gloo/virtual-service.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: gateway.solo.io/v1 -kind: VirtualService -metadata: - name: podinfo - namespace: test -spec: - virtualHost: - domains: - - '*' - name: podinfo - routes: - - matcher: - prefix: / - routeAction: - upstreamGroup: - name: podinfo - namespace: test diff --git a/artifacts/helmtester/deployment.yaml b/artifacts/helmtester/deployment.yaml deleted file mode 100644 index cc50ff36..00000000 --- a/artifacts/helmtester/deployment.yaml +++ /dev/null @@ -1,58 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: flagger-helmtester - namespace: kube-system - labels: - app: flagger-helmtester -spec: - selector: - matchLabels: - app: flagger-helmtester - template: - metadata: - labels: - app: flagger-helmtester - annotations: - prometheus.io/scrape: "true" - spec: - serviceAccountName: tiller - containers: - - name: helmtester - image: weaveworks/flagger-loadtester:0.8.0 - imagePullPolicy: IfNotPresent - ports: - - name: http - containerPort: 8080 - command: - - ./loadtester - - -port=8080 - - -log-level=info - - -timeout=1h - livenessProbe: - exec: - command: - - wget - - --quiet - - --tries=1 - - --timeout=4 - - --spider - - http://localhost:8080/healthz - timeoutSeconds: 5 - readinessProbe: - exec: - command: - - wget - - --quiet - - --tries=1 - - --timeout=4 - - --spider - - http://localhost:8080/healthz - timeoutSeconds: 5 - resources: - limits: - memory: "512Mi" - cpu: "1000m" - requests: - memory: "32Mi" - cpu: "10m" diff --git a/artifacts/helmtester/service.yaml b/artifacts/helmtester/service.yaml deleted file mode 100644 index 61d8c228..00000000 --- a/artifacts/helmtester/service.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: flagger-helmtester - namespace: kube-system - labels: - app: flagger-helmtester -spec: - type: ClusterIP - selector: - app: flagger-helmtester - ports: - - name: http - port: 80 - protocol: TCP - targetPort: http \ No newline at end of file diff --git a/artifacts/loadtester/config.yaml b/artifacts/loadtester/config.yaml deleted file mode 100644 index b9d0f568..00000000 --- a/artifacts/loadtester/config.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: flagger-loadtester-bats -data: - tests: | - #!/usr/bin/env bats - - @test "check message" { - curl -sS http://${URL} | jq -r .message | { - run cut -d $' ' -f1 - [ $output = "greetings" ] - } - } - - @test "check headers" { - curl -sS http://${URL}/headers | grep X-Request-Id - } diff --git a/artifacts/loadtester/deployment.yaml b/artifacts/loadtester/deployment.yaml deleted file mode 100644 index 09862656..00000000 --- a/artifacts/loadtester/deployment.yaml +++ /dev/null @@ -1,67 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: flagger-loadtester - labels: - app: flagger-loadtester -spec: - selector: - matchLabels: - app: flagger-loadtester - template: - metadata: - labels: - app: flagger-loadtester - annotations: - prometheus.io/scrape: "true" - spec: - containers: - - name: loadtester - image: weaveworks/flagger-loadtester:0.13.0 - imagePullPolicy: IfNotPresent - ports: - - name: http - containerPort: 8080 - command: - - ./loadtester - - -port=8080 - - -log-level=info - - -timeout=1h - livenessProbe: - exec: - command: - - wget - - --quiet - - --tries=1 - - --timeout=4 - - --spider - - http://localhost:8080/healthz - timeoutSeconds: 5 - readinessProbe: - exec: - command: - - wget - - --quiet - - --tries=1 - - --timeout=4 - - --spider - - http://localhost:8080/healthz - timeoutSeconds: 5 - resources: - limits: - memory: "512Mi" - cpu: "1000m" - requests: - memory: "32Mi" - cpu: "10m" - securityContext: - readOnlyRootFilesystem: true - runAsUser: 10001 -# volumeMounts: -# - name: tests -# mountPath: /bats -# readOnly: true -# volumes: -# - name: tests -# configMap: -# name: flagger-loadtester-bats \ No newline at end of file diff --git a/artifacts/loadtester/service.yaml b/artifacts/loadtester/service.yaml deleted file mode 100644 index 772b20af..00000000 --- a/artifacts/loadtester/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: flagger-loadtester - labels: - app: flagger-loadtester -spec: - type: ClusterIP - selector: - app: flagger-loadtester - ports: - - name: http - port: 80 - protocol: TCP - targetPort: http \ No newline at end of file diff --git a/artifacts/namespaces/test.yaml b/artifacts/namespaces/test.yaml deleted file mode 100644 index cff2ab62..00000000 --- a/artifacts/namespaces/test.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: test - labels: - istio-injection: enabled - appmesh.k8s.aws/sidecarInjectorWebhook: enabled diff --git a/artifacts/nginx/canary.yaml b/artifacts/nginx/canary.yaml deleted file mode 100644 index acb9afbc..00000000 --- a/artifacts/nginx/canary.yaml +++ /dev/null @@ -1,70 +0,0 @@ -apiVersion: flagger.app/v1alpha3 -kind: Canary -metadata: - name: podinfo - namespace: test -spec: - # deployment reference - targetRef: - apiVersion: apps/v1 - kind: Deployment - name: podinfo - # ingress reference - ingressRef: - apiVersion: extensions/v1beta1 - kind: Ingress - name: podinfo - # HPA reference (optional) - autoscalerRef: - apiVersion: autoscaling/v2beta1 - kind: HorizontalPodAutoscaler - name: podinfo - # the maximum time in seconds for the canary deployment - # to make progress before it is rollback (default 600s) - progressDeadlineSeconds: 60 - service: - # ClusterIP port number - port: 80 - # container port number or name - targetPort: 9898 - canaryAnalysis: - # schedule interval (default 60s) - interval: 10s - # max number of failed metric checks before rollback - threshold: 10 - # max traffic percentage routed to canary - # percentage (0-100) - maxWeight: 50 - # canary increment step - # percentage (0-100) - stepWeight: 5 - # NGINX Prometheus checks - metrics: - - name: request-success-rate - # minimum req success rate (non 5xx responses) - # percentage (0-100) - threshold: 99 - interval: 1m - - name: "latency" - threshold: 0.5 - interval: 1m - query: | - histogram_quantile(0.99, - sum( - rate( - http_request_duration_seconds_bucket{ - kubernetes_namespace="test", - kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)" - }[1m] - ) - ) by (le) - ) - # external checks (optional) - webhooks: - - name: load-test - url: http://flagger-loadtester.test/ - timeout: 5s - metadata: - type: cmd - cmd: "hey -z 1m -q 10 -c 2 http://app.example.com/" - logCmdOutput: "true" diff --git a/artifacts/nginx/ingress.yaml b/artifacts/nginx/ingress.yaml deleted file mode 100644 index c5a6fa62..00000000 --- a/artifacts/nginx/ingress.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: podinfo - namespace: test - labels: - app: podinfo - annotations: - kubernetes.io/ingress.class: "nginx" -spec: - rules: - - host: app.example.com - http: - paths: - - backend: - serviceName: podinfo - servicePort: 9898