From 896aceb2400aba8763b0be0e4f9908b6fa8be80a Mon Sep 17 00:00:00 2001 From: Stefan Prodan Date: Thu, 16 Aug 2018 15:24:04 +0300 Subject: [PATCH] Add Helm chart for Istio canary deployments and A/B testing --- Makefile | 2 +- .../.helmignore | 0 charts/podinfo-istio/Chart.yaml | 12 +++ charts/podinfo-istio/README.md | 81 ++++++++++++++++++ charts/podinfo-istio/templates/NOTES.txt | 1 + .../templates/_helpers.tpl | 17 ++-- .../templates/blue-deployment.yaml | 73 ++++++++++++++++ .../templates/destionation-rule.yaml | 18 ++++ charts/podinfo-istio/templates/gateway.yaml | 31 +++++++ .../templates/green-deployment.yaml | 73 ++++++++++++++++ charts/podinfo-istio/templates/service.yaml | 18 ++++ .../templates/virtual-service.yaml | 36 ++++++++ charts/podinfo-istio/values.yaml | 55 ++++++++++++ docs/index.yaml | 58 ++++--------- docs/podinfo-0.2.2.tgz | Bin 4422 -> 4440 bytes docs/podinfo-istio-0.1.0.tgz | Bin 0 -> 3967 bytes docs/weave-flux-0.1.0.tgz | Bin 5001 -> 0 bytes docs/weave-flux-0.2.0.tgz | Bin 5050 -> 0 bytes 18 files changed, 428 insertions(+), 47 deletions(-) rename charts/{weave-cloud => podinfo-istio}/.helmignore (100%) create mode 100644 charts/podinfo-istio/Chart.yaml create mode 100644 charts/podinfo-istio/README.md create mode 100644 charts/podinfo-istio/templates/NOTES.txt rename charts/{weave-cloud => podinfo-istio}/templates/_helpers.tpl (69%) create mode 100644 charts/podinfo-istio/templates/blue-deployment.yaml create mode 100644 charts/podinfo-istio/templates/destionation-rule.yaml create mode 100644 charts/podinfo-istio/templates/gateway.yaml create mode 100644 charts/podinfo-istio/templates/green-deployment.yaml create mode 100644 charts/podinfo-istio/templates/service.yaml create mode 100644 charts/podinfo-istio/templates/virtual-service.yaml create mode 100644 charts/podinfo-istio/values.yaml create mode 100644 docs/podinfo-istio-0.1.0.tgz delete mode 100644 docs/weave-flux-0.1.0.tgz delete mode 100644 docs/weave-flux-0.2.0.tgz diff --git a/Makefile b/Makefile index c59207a..ccd4801 100644 --- a/Makefile +++ b/Makefile @@ -105,9 +105,9 @@ dep: .PHONY: charts charts: cd charts/ && helm package podinfo/ + cd charts/ && helm package podinfo-istio/ cd charts/ && helm package ambassador/ cd charts/ && helm package grafana/ cd charts/ && helm package ngrok/ - cd charts/ && helm package weave-flux/ mv charts/*.tgz docs/ helm repo index docs --url https://stefanprodan.github.io/k8s-podinfo --merge ./docs/index.yaml diff --git a/charts/weave-cloud/.helmignore b/charts/podinfo-istio/.helmignore similarity index 100% rename from charts/weave-cloud/.helmignore rename to charts/podinfo-istio/.helmignore diff --git a/charts/podinfo-istio/Chart.yaml b/charts/podinfo-istio/Chart.yaml new file mode 100644 index 0000000..cb3aaf3 --- /dev/null +++ b/charts/podinfo-istio/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +appVersion: "0.6.0" +description: Podinfo Helm chart for Istio +name: podinfo-istio +version: 0.1.0 +home: https://github.com/stefanprodan/k8s-podinfo +sources: +- https://github.com/stefanprodan/k8s-podinfo +maintainers: + - name: stefanprodan + email: stefanprodan@users.noreply.github.com +engine: gotpl diff --git a/charts/podinfo-istio/README.md b/charts/podinfo-istio/README.md new file mode 100644 index 0000000..13cb345 --- /dev/null +++ b/charts/podinfo-istio/README.md @@ -0,0 +1,81 @@ +# Podinfo Istio + +Podinfo is a tiny web application made with Go +that showcases best practices of running microservices in Kubernetes. + +## Installing the Chart + +To install the chart with the release name `my-release`: + +```console +kubectl create namespace demo +kubectl label namespace demo istio-injection=enabled +``` + +```console +$ helm install podinfo-istio --name my-release -namespace demo +``` + +The command deploys podinfo-istio on the Kubernetes cluster in the default namespace. +The [configuration](#configuration) section lists the parameters that can be configured during installation. + +## Uninstalling the Chart + +To uninstall/delete the `my-release` deployment: + +```console +$ helm delete --purge my-release +``` + +The command removes all the Kubernetes components associated with the chart and deletes the release. + +## Configuration + +The following tables lists the configurable parameters of the podinfo-istio.chart and their default values. + +Parameter | Description | Default +--- | --- | --- +`affinity` | node/pod affinities | None +`hpa.enabled` | Enables HPA | `false` +`hpa.cpu` | Target CPU usage per pod | None +`hpa.memory` | Target memory usage per pod | None +`hpa.requests` | Target requests per second per pod | None +`hpa.maxReplicas` | Maximum pod replicas | `10` +`ingress.hosts` | Ingress accepted hostnames | None +`ingress.tls` | Ingress TLS configuration | None: +`image.pullPolicy` | Image pull policy | `IfNotPresent` +`image.repository` | Image repository | `stefanprodan/podinfo-istio. +`image.tag` | Image tag | `0.0.1` +`ingress.enabled` | Enables Ingress | `false` +`ingress.annotations` | Ingress annotations | None +`ingress.hosts` | Ingress accepted hostnames | None +`ingress.tls` | Ingress TLS configuration | None +`nodeSelector` | node labels for pod assignment | `{}` +`podAnnotations` | annotations to add to each pod | `{}` +`replicaCount` | desired number of pods | `1` +`resources.requests/cpu` | pod CPU request | `1m` +`resources.requests/memory` | pod memory request | `16Mi` +`resources.limits/cpu` | pod CPU limit | None +`resources.limits/memory` | pod memory limit | None +`service.externalPort` | external port for the service | `9898` +`service.internalPort` | internal port for the service | `9898` +`service.nodePort` | node port for the service | `31198` +`service.type` | type of service | `ClusterIP` +`tolerations` | List of node taints to tolerate | `[]` + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, + +```console +$ helm install stable/podinfo-istio.--name my-release \ + --set=image.tag=0.0.2,service.type=NodePort +``` + +Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. For example, + +```console +$ helm install podinfo-istio --name my-release -f values.yaml +``` + +> **Tip**: You can use the default [values.yaml](values.yaml) +``` + diff --git a/charts/podinfo-istio/templates/NOTES.txt b/charts/podinfo-istio/templates/NOTES.txt new file mode 100644 index 0000000..680a26e --- /dev/null +++ b/charts/podinfo-istio/templates/NOTES.txt @@ -0,0 +1 @@ + {{ template "podinfo-istio.fullname" . }} has been deployed successfully! diff --git a/charts/weave-cloud/templates/_helpers.tpl b/charts/podinfo-istio/templates/_helpers.tpl similarity index 69% rename from charts/weave-cloud/templates/_helpers.tpl rename to charts/podinfo-istio/templates/_helpers.tpl index 2de28c4..6639581 100644 --- a/charts/weave-cloud/templates/_helpers.tpl +++ b/charts/podinfo-istio/templates/_helpers.tpl @@ -2,7 +2,7 @@ {{/* Expand the name of the chart. */}} -{{- define "weave-cloud.name" -}} +{{- define "podinfo-istio.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} {{- end -}} @@ -11,22 +11,25 @@ Create a default fully qualified app name. We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). If release name contains chart name it will be used as a full name. */}} -{{- define "weave-cloud.fullname" -}} +{{- define "podinfo-istio.fullname" -}} {{- if .Values.fullnameOverride -}} {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} {{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} {{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} {{- end -}} {{- end -}} + +{{- define "podinfo-istio.blue" -}} +{{- printf "%s-%s" .Release.Name "blue" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "podinfo-istio.green" -}} +{{- printf "%s-%s" .Release.Name "green" | trunc 63 | trimSuffix "-" -}} {{- end -}} {{/* Create chart name and version as used by the chart label. */}} -{{- define "weave-cloud.chart" -}} +{{- define "podinfo-istio.chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} {{- end -}} diff --git a/charts/podinfo-istio/templates/blue-deployment.yaml b/charts/podinfo-istio/templates/blue-deployment.yaml new file mode 100644 index 0000000..d3a4403 --- /dev/null +++ b/charts/podinfo-istio/templates/blue-deployment.yaml @@ -0,0 +1,73 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "podinfo-istio.blue" . }} + labels: + app: {{ template "podinfo-istio.fullname" . }} + chart: {{ template "podinfo-istio.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} + color: blue + version: {{ .Values.blue.tag }} +spec: + replicas: {{ .Values.blue.replicas }} + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 1 + selector: + matchLabels: + app: {{ template "podinfo-istio.fullname" . }} + color: blue + version: {{ .Values.blue.tag }} + template: + metadata: + labels: + app: {{ template "podinfo-istio.fullname" . }} + color: blue + version: {{ .Values.blue.tag }} + annotations: + prometheus.io/scrape: 'true' + spec: + terminationGracePeriodSeconds: 30 + containers: + - name: podinfod + image: "{{ .Values.blue.repository }}:{{ .Values.blue.tag }}" + imagePullPolicy: {{ .Values.imagePullPolicy }} + command: + - ./podinfo + - -port={{ .Values.containerPort }} + - -logLevel={{ .Values.logLevel }} + env: + - name: color + value: blue + {{- if .Values.backend }} + - name: backendURL + value: {{ .Values.backend }} + {{- end }} + ports: + - name: http + containerPort: {{ .Values.containerPort }} + protocol: TCP + readinessProbe: + httpGet: + path: /readyz + port: 9898 + initialDelaySeconds: 1 + periodSeconds: 2 + failureThreshold: 1 + livenessProbe: + httpGet: + path: /healthz + port: 9898 + initialDelaySeconds: 1 + periodSeconds: 10 + failureThreshold: 2 + volumeMounts: + - name: data + mountPath: /data + resources: +{{ toYaml .Values.resources | indent 12 }} + volumes: + - name: data + emptyDir: {} diff --git a/charts/podinfo-istio/templates/destionation-rule.yaml b/charts/podinfo-istio/templates/destionation-rule.yaml new file mode 100644 index 0000000..9e1f183 --- /dev/null +++ b/charts/podinfo-istio/templates/destionation-rule.yaml @@ -0,0 +1,18 @@ +apiVersion: networking.istio.io/v1alpha3 +kind: DestinationRule +metadata: + name: {{ template "podinfo-istio.fullname" . }} + labels: + app: {{ template "podinfo-istio.fullname" . }} + chart: {{ template "podinfo-istio.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + host: {{ template "podinfo-istio.fullname" . }} + subsets: + - name: blue + labels: + color: blue + - name: green + labels: + color: green \ No newline at end of file diff --git a/charts/podinfo-istio/templates/gateway.yaml b/charts/podinfo-istio/templates/gateway.yaml new file mode 100644 index 0000000..e1b1977 --- /dev/null +++ b/charts/podinfo-istio/templates/gateway.yaml @@ -0,0 +1,31 @@ +{{- if .Values.gateway.create -}} +apiVersion: networking.istio.io/v1alpha3 +kind: Gateway +metadata: + name: {{ .Values.gateway.name }} + namespace: istio-system +spec: + selector: + istio: ingressgateway + servers: + - port: + number: 80 + name: http + protocol: HTTP + hosts: + - "*" + tls: + httpsRedirect: {{ .Values.gateway.httpsRedirect }} + {{- if .Values.gateway.tls }} + - 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 + {{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/podinfo-istio/templates/green-deployment.yaml b/charts/podinfo-istio/templates/green-deployment.yaml new file mode 100644 index 0000000..a9721e1 --- /dev/null +++ b/charts/podinfo-istio/templates/green-deployment.yaml @@ -0,0 +1,73 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "podinfo-istio.green" . }} + labels: + app: {{ template "podinfo-istio.fullname" . }} + chart: {{ template "podinfo-istio.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} + color: green + version: {{ .Values.green.tag }} +spec: + replicas: {{ .Values.green.replicas }} + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 1 + selector: + matchLabels: + app: {{ template "podinfo-istio.fullname" . }} + color: green + version: {{ .Values.green.tag }} + template: + metadata: + labels: + app: {{ template "podinfo-istio.fullname" . }} + color: green + version: {{ .Values.green.tag }} + annotations: + prometheus.io/scrape: 'true' + spec: + terminationGracePeriodSeconds: 30 + containers: + - name: podinfod + image: "{{ .Values.green.repository }}:{{ .Values.green.tag }}" + imagePullPolicy: {{ .Values.imagePullPolicy }} + command: + - ./podinfo + - -port={{ .Values.containerPort }} + - -logLevel={{ .Values.logLevel }} + env: + - name: color + value: green + {{- if .Values.backend }} + - name: backendURL + value: {{ .Values.backend }} + {{- end }} + ports: + - name: http + containerPort: {{ .Values.containerPort }} + protocol: TCP + readinessProbe: + httpGet: + path: /readyz + port: 9898 + initialDelaySeconds: 1 + periodSeconds: 2 + failureThreshold: 1 + livenessProbe: + httpGet: + path: /healthz + port: 9898 + initialDelaySeconds: 1 + periodSeconds: 10 + failureThreshold: 2 + volumeMounts: + - name: data + mountPath: /data + resources: +{{ toYaml .Values.resources | indent 12 }} + volumes: + - name: data + emptyDir: {} diff --git a/charts/podinfo-istio/templates/service.yaml b/charts/podinfo-istio/templates/service.yaml new file mode 100644 index 0000000..66e0594 --- /dev/null +++ b/charts/podinfo-istio/templates/service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ template "podinfo-istio.fullname" . }} + labels: + app: {{ template "podinfo-istio.fullname" . }} + chart: {{ template "podinfo-istio.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: ClusterIP + ports: + - port: {{ .Values.containerPort }} + targetPort: http + protocol: TCP + name: http + selector: + app: {{ template "podinfo-istio.fullname" . }} diff --git a/charts/podinfo-istio/templates/virtual-service.yaml b/charts/podinfo-istio/templates/virtual-service.yaml new file mode 100644 index 0000000..a87d694 --- /dev/null +++ b/charts/podinfo-istio/templates/virtual-service.yaml @@ -0,0 +1,36 @@ +{{- $host := .Release.Name -}} +{{- $timeout := .Values.timeout -}} +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: {{ template "podinfo-istio.fullname" . }} + labels: + app: {{ template "podinfo-istio.fullname" . }} + chart: {{ template "podinfo-istio.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + hosts: + - {{ .Values.host }} +{{- if .Values.exposeHost }} + gateways: + - {{ .Values.gateway.name }}.istio-system.svc.cluster.local +{{- end }} + http: + {{- if gt .Values.green.replicas 0.0 }} + {{- range .Values.green.routing }} + - match: +{{ toYaml .match | indent 6 }} + route: + - destination: + host: {{ $host }} + subset: green + timeout: {{ $timeout }} + {{- end }} + {{- end }} + # default route + - route: + - destination: + host: {{ template "podinfo-istio.fullname" . }} + subset: blue + timeout: {{ .Values.timeout }} \ No newline at end of file diff --git a/charts/podinfo-istio/values.yaml b/charts/podinfo-istio/values.yaml new file mode 100644 index 0000000..f845b54 --- /dev/null +++ b/charts/podinfo-istio/values.yaml @@ -0,0 +1,55 @@ +# Default values for podinfo-istio. + + +# host can be an extarnal domain or a local one as in podinfo.test.svc.cluster.local +host: canary.istio.weavedx.com +# if the host is an external domain must be exposed via the Gateway +exposeHost: true +timeout: 30s + +# no more than one Gateway can be created on a cluster +# if TLS is enabled the istio-ingressgateway-certs secret must exist in istio-system ns +# if you have a Gateway running you can set the name to your own gateway and turn off create +gateway: + name: public-gateway + # creates public-gateway.istio-system.svc.cluster.local + create: false + tls: true + httpsRedirect: true + +# stable release +# by default all traffic goes to blue +blue: + replicas: 2 + repository: quay.io/stefanprodan/podinfo + tag: 0.6.0 + backend: + +# canary release +# can be disabled by setting replicas to 0 +green: + replicas: 2 + repository: quay.io/stefanprodan/podinfo + tag: 0.6.1 + routing: + # target Safari + - match: + - headers: + user-agent: + regex: "^(?!.*Chrome).*Safari.*" + # target API clients by version + - match: + - headers: + x-api-version: + regex: "^(v{0,1})0\\.6\\.([1-9]).*" + backend: + +# blue/green common settings +logLevel: info +containerPort: 9898 +imagePullPolicy: IfNotPresent +resources: + limits: + requests: + cpu: 1m + memory: 16Mi \ No newline at end of file diff --git a/docs/index.yaml b/docs/index.yaml index e35e742..2bb52fb 100755 --- a/docs/index.yaml +++ b/docs/index.yaml @@ -3,7 +3,7 @@ entries: ambassador: - apiVersion: v1 appVersion: 0.29.0 - created: 2018-08-16T00:03:51.210499364+03:00 + created: 2018-08-16T15:14:32.45299943+03:00 description: A Helm chart for Datawire Ambassador digest: a30c8cb38e696b09fda8269ad8465ce6fec6100cfc108ca85ecbc85913ca5c7f engine: gotpl @@ -19,7 +19,7 @@ entries: grafana: - apiVersion: v1 appVersion: "1.0" - created: 2018-08-16T00:03:51.211170354+03:00 + created: 2018-08-16T15:14:32.45369699+03:00 description: A Helm chart for Kubernetes digest: abdcadc5cddcb7c015aa5bb64e59bfa246774ad9243b3eb3c2a814abb38f2776 name: grafana @@ -29,7 +29,7 @@ entries: ngrok: - apiVersion: v1 appVersion: "1.0" - created: 2018-08-16T00:03:51.211452823+03:00 + created: 2018-08-16T15:14:32.453994154+03:00 description: A Ngrok Helm chart for Kubernetes digest: 7bf5ed2ef63ccd5efb76bcd9a086b04816a162c51d6ab592bccf58c283acd2ea name: ngrok @@ -39,9 +39,9 @@ entries: podinfo: - apiVersion: v1 appVersion: 0.6.0 - created: 2018-08-16T00:03:51.214668506+03:00 + created: 2018-08-16T15:14:32.45935387+03:00 description: Podinfo Helm chart for Kubernetes - digest: 27ba84d7fe19f72e15a7f0b61492268c1a1f5ed8bc5467f87ed04b4409073173 + digest: dab20fb79c55badd3fb923c6a204a7a7915490cb37a9eadf7ee7d91c5977fec2 engine: gotpl home: https://github.com/stefanprodan/k8s-podinfo maintainers: @@ -55,7 +55,7 @@ entries: version: 0.2.2 - apiVersion: v1 appVersion: 0.5.1 - created: 2018-08-16T00:03:51.214206947+03:00 + created: 2018-08-16T15:14:32.458873487+03:00 description: Podinfo Helm chart for Kubernetes digest: 631ca3e2db5553541a50b625f538e6a1f2a103c13aa8148fdd38baf2519e5235 engine: gotpl @@ -71,7 +71,7 @@ entries: version: 0.2.1 - apiVersion: v1 appVersion: 0.5.0 - created: 2018-08-16T00:03:51.213413197+03:00 + created: 2018-08-16T15:14:32.457991323+03:00 description: Podinfo Helm chart for Kubernetes digest: dfe7cf44aef0d170549918b00966422a07e7611f9d0081fb34f5b5beb0641c00 engine: gotpl @@ -87,7 +87,7 @@ entries: version: 0.2.0 - apiVersion: v1 appVersion: 0.3.0 - created: 2018-08-16T00:03:51.212459375+03:00 + created: 2018-08-16T15:14:32.456942217+03:00 description: Podinfo Helm chart for Kubernetes digest: 4865a2d8b269cf453935cda9661c2efb82c16411471f8c11221a6d03d9bb58b1 engine: gotpl @@ -101,41 +101,21 @@ entries: urls: - https://stefanprodan.github.io/k8s-podinfo/podinfo-0.1.0.tgz version: 0.1.0 - weave-flux: + podinfo-istio: - apiVersion: v1 - appVersion: 1.3.0 - created: 2018-08-16T00:03:51.216272023+03:00 - description: Flux is a tool that automatically ensures that the state of a cluster - matches what is specified in version control - digest: 1f52e427bb1d728641405f5ad9c514e8861905c110c14db95516629d24443b7d + appVersion: 0.6.0 + created: 2018-08-16T15:14:32.459743584+03:00 + description: Podinfo Helm chart for Istio + digest: fca748e8655beee0e67a32c496bec5ae4bae2f2d8c6eb3f5132c03aa530b3221 engine: gotpl - home: https://weave.works - icon: https://landscape.cncf.io/logos/weave-flux.svg + home: https://github.com/stefanprodan/k8s-podinfo maintainers: - - email: stefan@weave.works + - email: stefanprodan@users.noreply.github.com name: stefanprodan - name: weave-flux + name: podinfo-istio sources: - - https://github.com/weaveworks/flux + - https://github.com/stefanprodan/k8s-podinfo urls: - - https://stefanprodan.github.io/k8s-podinfo/weave-flux-0.2.0.tgz - version: 0.2.0 - - apiVersion: v1 - appVersion: 1.2.5 - created: 2018-08-16T00:03:51.215743562+03:00 - description: Flux is a tool that automatically ensures that the state of a cluster - matches what is specified in version control - digest: 9e18fb8d175f4fac3b054905c7110d18b6d18f884011df9e9d010c66337da7ec - engine: gotpl - home: https://weave.works - icon: https://www.weave.works/assets/images/bltd108e8f850ae9e7c/weave-logo-512.png - maintainers: - - email: stefan@weave.works - name: Stefan Prodan - name: weave-flux - sources: - - https://github.com/weaveworks/flux - urls: - - https://stefanprodan.github.io/k8s-podinfo/weave-flux-0.1.0.tgz + - https://stefanprodan.github.io/k8s-podinfo/podinfo-istio-0.1.0.tgz version: 0.1.0 -generated: 2018-08-16T00:03:51.209830596+03:00 +generated: 2018-08-16T15:14:32.452369998+03:00 diff --git a/docs/podinfo-0.2.2.tgz b/docs/podinfo-0.2.2.tgz index 2383ed77d8ddf359c7fd97f5d367eee98995e1e2..c31b76a6d33ed3848ee006d3f10bf53a317e54a9 100644 GIT binary patch delta 4375 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 Re*pjh|Nm)OOmF~P007@l&UXL+ delta 4357 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 diff --git a/docs/podinfo-istio-0.1.0.tgz b/docs/podinfo-istio-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8520aa5bebac0a7b91cba7e131edf69ce2c90d0f GIT binary patch literal 3967 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 Z>$Fbmv`#lk{}%uN|Nr~sdSL)s004Ye#diPz literal 0 HcmV?d00001 diff --git a/docs/weave-flux-0.1.0.tgz b/docs/weave-flux-0.1.0.tgz deleted file mode 100644 index 6be912843600204303fda0f1b316633ef54e3eac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5001 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 Q0RRC1|3u!FrvPvO0C3y(ssI20