import tempfile
import yaml
import os
import json
from subprocess import check_output


def helm_template(config):
    with tempfile.NamedTemporaryFile() as temp:
        with open(temp.name, "w") as values:
            values.write(config)
        helm_cmd = "helm template -f {0} --namespace default ./".format(temp.name)
        result = yaml.load_all(check_output(helm_cmd.split()))

        results = {}
        for r in result:
            if r:
                kind = r["kind"].lower()
                if kind not in results:
                    results[kind] = {}
                results[kind][r["metadata"]["name"]] = r

        if os.environ.get("DEBUG"):
            print(json.dumps(results, indent=4, sort_keys=True))
        return results

helpers/helpers.py
import tempfile
import yaml
import os
import json
from subprocess import check_output


def helm_template(config):
    with tempfile.NamedTemporaryFile() as temp:
        with open(temp.name, "w") as values:
            values.write(config)
        helm_cmd = "helm template release-name -f {0} ./".format(temp.name)
        result = yaml.load_all(check_output(helm_cmd.split()))

        results = {}
        for r in result:
            if r:
                kind = r["kind"].lower()
                if kind not in results:
                    results[kind] = {}
                results[kind][r["metadata"]["name"]] = r

        if os.environ.get("DEBUG"):
            print(json.dumps(results, indent=4, sort_keys=True))
        return results

helpers/helpers.py
diff --git a/README.md b/README.md
index d1e245f91..d40991f46 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,6 @@
   - [Support Matrix](#support-matrix)
   - [Kubernetes Versions](#kubernetes-versions)
   - [Helm versions](#helm-versions)
-    - [Helm 3 beta](#helm-3-beta)
 - [ECK](#eck)
 
 <!-- END doctoc generated TOC please keep comment here to allow auto update -->
@@ -77,13 +76,8 @@ exact versions are defined under `KUBERNETES_VERSIONS` in
 ### Helm versions
 
 While we are checking backward compatibility, the charts are only tested with
-Helm version mentioned in [helm-tester Dockerfile][] (currently 2.17.0).
+Helm version mentioned in [helm-tester Dockerfile][] (currently 3.4.1).
 
-#### Helm 3 beta
-
-While we don't have automated tests for [Helm 3][] yet, we fixed the main
-blockers to use it. We now have enough feedbacks from internal and external
-users to add support in beta.
 
 ## ECK
 
@@ -97,7 +91,6 @@ Kubernetes.
 [elastic cloud on kubernetes]: https://github.com/elastic/cloud-on-k8s
 [elastic helm repo]: https://helm.elastic.co
 [github releases]: https://github.com/elastic/helm-charts/releases
-[helm 3]: https://v3.helm.sh
 [helm-tester Dockerfile]: https://github.com/elastic/helm-charts/blob/master/helpers/helm-tester/Dockerfile
 [helpers/matrix.yml]: https://github.com/elastic/helm-charts/blob/master/helpers/matrix.yml
 [operator pattern]: https://kubernetes.io/docs/concepts/extend-kubernetes/operator/
diff --git a/apm-server/README.md b/apm-server/README.md
index f95914a06..d513eb3f2 100644
--- a/apm-server/README.md
+++ b/apm-server/README.md
@@ -48,8 +48,8 @@ See [supported configurations][] for more details.
 `helm repo add elastic https://helm.elastic.co`
 
 * Install it:
-  - with Helm 2: `helm install --name apm-server elastic/apm-server`
-  - with [Helm 3 (beta)][]: `helm install apm-server elastic/apm-server`
+  - with Helm 3: `helm install apm-server elastic/apm-server`
+  - with Helm 2 (deprecated): `helm install --name apm-server elastic/apm-server`
 
 
 ### Install development version using master branch
@@ -57,8 +57,8 @@ See [supported configurations][] for more details.
 * Clone the git repo: `git clone git@github.com:elastic/helm-charts.git`
 
 * Install it:
-  - with Helm 2: `helm install --name apm-server ./helm-charts/apm-server  --set imageTag=8.0.0-SNAPSHOT`
-  - with [Helm 3 (beta)][]: `helm install apm-server ./helm-charts/apm-server  --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 3: `helm install apm-server ./helm-charts/apm-server --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 2 (deprecated): `helm install --name apm-server ./helm-charts/apm-server --set imageTag=8.0.0-SNAPSHOT`
 
 
 ## Upgrading
@@ -160,7 +160,6 @@ about our development and testing process.
 [examples/oss]: https://github.com/elastic/helm-charts/tree/master/apm-server/examples/oss
 [examples/security]: https://github.com/elastic/helm-charts/tree/master/apm-server/examples/security
 [helm]: https://helm.sh
-[helm 3 (beta)]: https://github.com/elastic/helm-charts/tree/master/README.md#helm-3-beta
 [horizontal pod autoscaler]: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
 [imagePullPolicy]: https://kubernetes.io/docs/concepts/containers/images/#updating-images
 [imagePullSecrets]: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-pod-that-uses-your-secret
diff --git a/apm-server/examples/default/Makefile b/apm-server/examples/default/Makefile
index d4638cb2e..57c4116d2 100644
--- a/apm-server/examples/default/Makefile
+++ b/apm-server/examples/default/Makefile
@@ -5,9 +5,9 @@ include ../../../helpers/examples.mk
 RELEASE := helm-apm-server-default
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/apm-server/examples/oss/Makefile b/apm-server/examples/oss/Makefile
index b82ea5a43..61ad62b28 100644
--- a/apm-server/examples/oss/Makefile
+++ b/apm-server/examples/oss/Makefile
@@ -5,9 +5,9 @@ include ../../../helpers/examples.mk
 RELEASE := helm-apm-server-oss
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) --values values.yaml ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) --values values.yaml ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/apm-server/examples/security/Makefile b/apm-server/examples/security/Makefile
index 3afb654d7..de704f595 100644
--- a/apm-server/examples/security/Makefile
+++ b/apm-server/examples/security/Makefile
@@ -5,9 +5,9 @@ include ../../../helpers/examples.mk
 RELEASE := helm-apm-server-security
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) --values values.yaml ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) --values values.yaml ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/apm-server/templates/_helpers.tpl b/apm-server/templates/_helpers.tpl
index abc1361ea..6f64c4b38 100755
--- a/apm-server/templates/_helpers.tpl
+++ b/apm-server/templates/_helpers.tpl
@@ -23,14 +23,14 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this
 Return the appropriate apiVersion for ingress.
 */}}
 {{- define "apm.ingress.apiVersion" -}}
-{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.Version -}}
 {{- print "extensions/v1beta1" -}}
 {{- else -}}
 {{- print "networking.k8s.io/v1beta1" -}}
 {{- end -}}
 {{- end -}}
 {{- define "apm.autoscaling.apiVersion" -}}
-{{- if semverCompare "<1.12-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- if semverCompare "<1.12-0" .Capabilities.KubeVersion.Version -}}
 {{- print "autoscaling/v2beta1" -}}
 {{- else -}}
 {{- print "autoscaling/v2beta2" -}}
diff --git a/elasticsearch/README.md b/elasticsearch/README.md
index b5d4f2a52..8ef7db063 100644
--- a/elasticsearch/README.md
+++ b/elasticsearch/README.md
@@ -59,8 +59,8 @@ See [supported configurations][] for more details.
 `helm repo add elastic https://helm.elastic.co`
 
 * Install it:
-  - with Helm 2: `helm install --name elasticsearch elastic/elasticsearch`
-  - with [Helm 3 (beta)][]: `helm install elasticsearch elastic/elasticsearch`
+  - with Helm 3: `helm install elasticsearch elastic/elasticsearch`
+  - with Helm 2 (deprecated): `helm install --name elasticsearch elastic/elasticsearch`
 
 
 ### Install development version using master branch
@@ -68,8 +68,8 @@ See [supported configurations][] for more details.
 * Clone the git repo: `git clone git@github.com:elastic/helm-charts.git`
 
 * Install it:
-  - with Helm 2: `helm install --name elasticsearch ./helm-charts/elasticsearch  --set imageTag=8.0.0-SNAPSHOT`
-  - with [Helm 3 (beta)][]: `helm install elasticsearch ./helm-charts/elasticsearch  --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 3: `helm install elasticsearch ./helm-charts/elasticsearch --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 2 (deprecated): `helm install --name elasticsearch ./helm-charts/elasticsearch --set imageTag=8.0.0-SNAPSHOT`
 
 
 ## Upgrading
@@ -413,7 +413,6 @@ about our development and testing process.
 [examples/security]: https://github.com/elastic/helm-charts/tree/master/elasticsearch/examples/security
 [gke]: https://cloud.google.com/kubernetes-engine
 [helm]: https://helm.sh
-[helm 3 (beta)]: https://github.com/elastic/helm-charts/tree/master/README.md#helm-3-beta
 [helm/charts stable]: https://github.com/helm/charts/tree/master/stable/elasticsearch/
 [how to install plugins guide]: https://github.com/elastic/helm-charts/tree/master/elasticsearch/README.md#how-to-install-plugins
 [how to use the keystore]: https://github.com/elastic/helm-charts/tree/master/elasticsearch/README.md#how-to-use-the-keystore
diff --git a/elasticsearch/examples/config/Makefile b/elasticsearch/examples/config/Makefile
index 502531378..9eee45df2 100644
--- a/elasticsearch/examples/config/Makefile
+++ b/elasticsearch/examples/config/Makefile
@@ -4,7 +4,7 @@ include ../../../helpers/examples.mk
 RELEASE := helm-es-config
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) --values ./values.yaml ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) --values ./values.yaml ../../
 
 secrets:
 	kubectl delete secret elastic-config-credentials elastic-config-secret elastic-config-slack elastic-config-custom-path || true
@@ -16,4 +16,4 @@ secrets:
 test: secrets install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/elasticsearch/examples/default/Makefile b/elasticsearch/examples/default/Makefile
index 15558c19a..beb90461d 100644
--- a/elasticsearch/examples/default/Makefile
+++ b/elasticsearch/examples/default/Makefile
@@ -5,12 +5,12 @@ include ../../../helpers/examples.mk
 RELEASE := helm-es-default
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) ../../
 
 restart:
-	helm upgrade --set terminationGracePeriod=121 --wait --timeout=900 --install $(RELEASE) ../../
+	helm upgrade --set terminationGracePeriod=121 --wait --timeout=900s --install $(RELEASE) ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/elasticsearch/examples/docker-for-mac/Makefile b/elasticsearch/examples/docker-for-mac/Makefile
index 99894063d..705b08f0b 100644
--- a/elasticsearch/examples/docker-for-mac/Makefile
+++ b/elasticsearch/examples/docker-for-mac/Makefile
@@ -3,10 +3,10 @@ default: test
 RELEASE := helm-es-docker-for-mac
 
 install:
-	helm upgrade --wait --timeout=1200 --install --values values.yaml $(RELEASE) ../../
+	helm upgrade --wait --timeout=1200s --install --values values.yaml $(RELEASE) ../../
 
 test: install
 	helm test $(RELEASE)
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/elasticsearch/examples/kubernetes-kind/Makefile b/elasticsearch/examples/kubernetes-kind/Makefile
index f18f98668..3f6bdead9 100644
--- a/elasticsearch/examples/kubernetes-kind/Makefile
+++ b/elasticsearch/examples/kubernetes-kind/Makefile
@@ -3,14 +3,14 @@ default: test
 RELEASE := helm-es-kind
 
 install:
-	helm upgrade --wait --timeout=1200 --install --values values.yaml $(RELEASE) ../../
+	helm upgrade --wait --timeout=1200s --install --values values.yaml $(RELEASE) ../../
 
 install-local-path:
 	kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
-	helm upgrade --wait --timeout=1200 --install --values values-local-path.yaml $(RELEASE) ../../
+	helm upgrade --wait --timeout=1200s --install --values values-local-path.yaml $(RELEASE) ../../
 
 test: install
 	helm test $(RELEASE)
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/elasticsearch/examples/microk8s/Makefile b/elasticsearch/examples/microk8s/Makefile
index 834b929e4..3ce3ebdef 100644
--- a/elasticsearch/examples/microk8s/Makefile
+++ b/elasticsearch/examples/microk8s/Makefile
@@ -3,10 +3,10 @@ default: test
 RELEASE := helm-es-microk8s
 
 install:
-	helm upgrade --wait --timeout=1200 --install --values values.yaml $(RELEASE) ../../
+	helm upgrade --wait --timeout=1200s --install --values values.yaml $(RELEASE) ../../
 
 test: install
 	helm test $(RELEASE)
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/elasticsearch/examples/migration/Makefile b/elasticsearch/examples/migration/Makefile
index bcef97e6d..efd4abfc5 100644
--- a/elasticsearch/examples/migration/Makefile
+++ b/elasticsearch/examples/migration/Makefile
@@ -1,10 +1,10 @@
 PREFIX := helm-es-migration
 
 data:
-	helm upgrade --wait --timeout=900 --install --values ./data.yml $(PREFIX)-data ../../
+	helm upgrade --wait --timeout=900s --install --values ./data.yml $(PREFIX)-data ../../
 
 master:
-	helm upgrade --wait --timeout=900 --install --values ./master.yml $(PREFIX)-master ../../
+	helm upgrade --wait --timeout=900s --install --values ./master.yml $(PREFIX)-master ../../
 
 client:
-	helm upgrade --wait --timeout=900 --install --values ./client.yml $(PREFIX)-client ../../
+	helm upgrade --wait --timeout=900s --install --values ./client.yml $(PREFIX)-client ../../
diff --git a/elasticsearch/examples/minikube/Makefile b/elasticsearch/examples/minikube/Makefile
index f8b7e7b6a..09b61f81d 100644
--- a/elasticsearch/examples/minikube/Makefile
+++ b/elasticsearch/examples/minikube/Makefile
@@ -3,10 +3,10 @@ default: test
 RELEASE := helm-es-minikube
 
 install:
-	helm upgrade --wait --timeout=1200 --install --values values.yaml $(RELEASE) ../../
+	helm upgrade --wait --timeout=1200s --install --values values.yaml $(RELEASE) ../../
 
 test: install
 	helm test $(RELEASE)
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/elasticsearch/examples/multi/Makefile b/elasticsearch/examples/multi/Makefile
index 4e4835a03..bb3da7267 100644
--- a/elasticsearch/examples/multi/Makefile
+++ b/elasticsearch/examples/multi/Makefile
@@ -6,13 +6,13 @@ PREFIX := helm-es-multi
 RELEASE := helm-es-multi-master
 
 install:
-	helm upgrade --wait --timeout=900 --install --values ./master.yml $(PREFIX)-master ../../
-	helm upgrade --wait --timeout=900 --install --values ./data.yml $(PREFIX)-data ../../
-	helm upgrade --wait --timeout=900 --install --values ./client.yml $(PREFIX)-client ../../
+	helm upgrade --wait --timeout=900s --install --values ./master.yml $(PREFIX)-master ../../
+	helm upgrade --wait --timeout=900s --install --values ./data.yml $(PREFIX)-data ../../
+	helm upgrade --wait --timeout=900s --install --values ./client.yml $(PREFIX)-client ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(PREFIX)-master
-	helm del --purge $(PREFIX)-data
-	helm del --purge $(PREFIX)-client
+	helm del $(PREFIX)-master
+	helm del $(PREFIX)-data
+	helm del $(PREFIX)-client
diff --git a/elasticsearch/examples/openshift/Makefile b/elasticsearch/examples/openshift/Makefile
index 8d08d8959..653288854 100644
--- a/elasticsearch/examples/openshift/Makefile
+++ b/elasticsearch/examples/openshift/Makefile
@@ -7,9 +7,9 @@ template:
 	helm template --values ./values.yaml ../../
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) --values ./values.yaml ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) --values ./values.yaml ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/elasticsearch/examples/oss/Makefile b/elasticsearch/examples/oss/Makefile
index fa69ddc2d..e57284176 100644
--- a/elasticsearch/examples/oss/Makefile
+++ b/elasticsearch/examples/oss/Makefile
@@ -4,9 +4,9 @@ include ../../../helpers/examples.mk
 RELEASE := helm-es-oss
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) --values ./values.yaml ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) --values ./values.yaml ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/elasticsearch/examples/security/Makefile b/elasticsearch/examples/security/Makefile
index ef32cae8e..988d98e61 100644
--- a/elasticsearch/examples/security/Makefile
+++ b/elasticsearch/examples/security/Makefile
@@ -6,11 +6,11 @@ RELEASE := helm-es-security
 ELASTICSEARCH_IMAGE := docker.elastic.co/elasticsearch/elasticsearch:$(STACK_VERSION)
 
 install:
-	helm upgrade --wait --timeout=900 --install --values ./security.yml $(RELEASE) ../../
+	helm upgrade --wait --timeout=900s --install --values ./security.yml $(RELEASE) ../../
 
 purge:
 	kubectl delete secrets elastic-credentials elastic-certificates elastic-certificate-pem elastic-certificate-crt|| true
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
 
 test: secrets install goss
 
diff --git a/elasticsearch/templates/NOTES.txt b/elasticsearch/templates/NOTES.txt
index 3841adafc..73edf425a 100755
--- a/elasticsearch/templates/NOTES.txt
+++ b/elasticsearch/templates/NOTES.txt
@@ -1,4 +1,4 @@
 1. Watch all cluster members come up.
   $ kubectl get pods --namespace={{ .Release.Namespace }} -l app={{ template "elasticsearch.uname" . }} -w
 2. Test cluster health using Helm test.
-  $ helm test {{ .Release.Name }} --cleanup
+  $ helm test {{ .Release.Name }}
diff --git a/elasticsearch/templates/_helpers.tpl b/elasticsearch/templates/_helpers.tpl
index 0b0fe9ae1..2a5d39497 100755
--- a/elasticsearch/templates/_helpers.tpl
+++ b/elasticsearch/templates/_helpers.tpl
@@ -68,7 +68,7 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this
 Return the appropriate apiVersion for statefulset.
 */}}
 {{- define "elasticsearch.statefulset.apiVersion" -}}
-{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.Version -}}
 {{- print "apps/v1beta2" -}}
 {{- else -}}
 {{- print "apps/v1" -}}
@@ -79,7 +79,7 @@ Return the appropriate apiVersion for statefulset.
 Return the appropriate apiVersion for ingress.
 */}}
 {{- define "elasticsearch.ingress.apiVersion" -}}
-{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.Version -}}
 {{- print "extensions/v1beta1" -}}
 {{- else -}}
 {{- print "networking.k8s.io/v1beta1" -}}
diff --git a/elasticsearch/templates/statefulset.yaml b/elasticsearch/templates/statefulset.yaml
index 0450a0cbc..892538638 100644
--- a/elasticsearch/templates/statefulset.yaml
+++ b/elasticsearch/templates/statefulset.yaml
@@ -28,7 +28,6 @@ spec:
       name: {{ template "elasticsearch.uname" . }}
     {{- if .Values.persistence.labels.enabled }}
       labels:
-        heritage: {{ .Release.Service | quote }}
         release: {{ .Release.Name | quote }}
         chart: "{{ .Chart.Name }}"
         app: "{{ template "elasticsearch.uname" . }}"
@@ -47,7 +46,6 @@ spec:
     metadata:
       name: "{{ template "elasticsearch.uname" . }}"
       labels:
-        heritage: {{ .Release.Service | quote }}
         release: {{ .Release.Name | quote }}
         chart: "{{ .Chart.Name }}"
         app: "{{ template "elasticsearch.uname" . }}"
@@ -154,7 +152,7 @@ spec:
       imagePullSecrets:
 {{ toYaml .Values.imagePullSecrets | indent 8 }}
       {{- end }}
-      {{- if semverCompare ">1.13-0" .Capabilities.KubeVersion.GitVersion }}
+      {{- if semverCompare ">1.13-0" .Capabilities.KubeVersion.Version }}
       enableServiceLinks: {{ .Values.enableServiceLinks }}
       {{- end }}
       initContainers:
diff --git a/elasticsearch/tests/elasticsearch_test.py b/elasticsearch/tests/elasticsearch_test.py
index 293453dd7..6ceec27db 100755
--- a/elasticsearch/tests/elasticsearch_test.py
+++ b/elasticsearch/tests/elasticsearch_test.py
@@ -445,7 +445,10 @@ def test_enabling_persistence_label_in_volumeclaimtemplate():
         "volumeClaimTemplates"
     ][0]["metadata"]["labels"]
     statefulset_labels = r["statefulset"][uname]["metadata"]["labels"]
-    assert volume_claim_template_labels == statefulset_labels
+    expected_labels = statefulset_labels
+    # heritage label shouldn't be present in volumeClaimTemplates labels
+    expected_labels.pop("heritage")
+    assert volume_claim_template_labels == expected_labels
 
 
 def test_adding_a_secret_mount():
diff --git a/filebeat/README.md b/filebeat/README.md
index bd137de32..fa82ce265 100644
--- a/filebeat/README.md
+++ b/filebeat/README.md
@@ -45,8 +45,8 @@ See [supported configurations][] for more details.
 `helm repo add elastic https://helm.elastic.co`
 
 * Install it:
-  - with Helm 2: `helm install --name filebeat elastic/filebeat`
-  - with [Helm 3 (beta)][]: `helm install filebeat elastic/filebeat`
+  - with Helm 3: `helm install filebeat elastic/filebeat`
+  - with Helm 2 (deprecated): `helm install --name filebeat elastic/filebeat`
 
 
 ### Install development version using master branch
@@ -54,8 +54,8 @@ See [supported configurations][] for more details.
 * Clone the git repo: `git clone git@github.com:elastic/helm-charts.git`
 
 * Install it:
-  - with Helm 2: `helm install --name filebeat ./helm-charts/filebeat  --set imageTag=8.0.0-SNAPSHOT`
-  - with [Helm 3 (beta)][]: `helm install filebeat ./helm-charts/filebeat  --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 3: `helm install filebeat ./helm-charts/filebeat --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 2 (deprecated): `helm install --name filebeat ./helm-charts/filebeat --set imageTag=8.0.0-SNAPSHOT`
 
 
 ## Upgrading
@@ -200,7 +200,6 @@ about our development and testing process.
 [filebeat oss docker image]: https://www.docker.elastic.co/r/beats/filebeat-oss
 [filebeat outputs]: https://www.elastic.co/guide/en/beats/filebeat/current/configuring-output.html
 [helm]: https://helm.sh
-[helm 3 (beta)]: https://github.com/elastic/helm-charts/tree/master/README.md#helm-3-beta
 [hostNetwork]: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#host-namespaces
 [dnsConfig]: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
 [hostPath]: https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
diff --git a/filebeat/examples/default/Makefile b/filebeat/examples/default/Makefile
index 937cea681..e27affffc 100644
--- a/filebeat/examples/default/Makefile
+++ b/filebeat/examples/default/Makefile
@@ -5,9 +5,9 @@ include ../../../helpers/examples.mk
 RELEASE := helm-filebeat-default
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/filebeat/examples/oss/Makefile b/filebeat/examples/oss/Makefile
index fa3d507af..455c2e63a 100644
--- a/filebeat/examples/oss/Makefile
+++ b/filebeat/examples/oss/Makefile
@@ -5,9 +5,9 @@ include ../../../helpers/examples.mk
 RELEASE := helm-filebeat-oss
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) --values values.yaml ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) --values values.yaml ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/filebeat/examples/security/Makefile b/filebeat/examples/security/Makefile
index 602dc4ae2..50c0b5bed 100644
--- a/filebeat/examples/security/Makefile
+++ b/filebeat/examples/security/Makefile
@@ -5,9 +5,9 @@ include ../../../helpers/examples.mk
 RELEASE := helm-filebeat-security
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) --values values.yaml ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) --values values.yaml ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/helpers/common.mk b/helpers/common.mk
index d98b0c61f..f7debead3 100644
--- a/helpers/common.mk
+++ b/helpers/common.mk
@@ -13,18 +13,10 @@ build: ## Build helm-tester docker image
 
 .PHONY: deps
 deps: ## Update helm charts dependencies
-	sed --in-place '/charts\//d' ./.helmignore
 	helm dependency update
 
-.PHONY: helm
-helm: ## Deploy helm on k8s cluster
-	kubectl get cs
-	kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default || true
-	helm init --wait --upgrade
-
 .PHONY: lint
 lint: ## Lint helm templates
-	grep 'charts/' ./.helmignore || echo 'charts/' >> ./.helmignore
 	helm lint --strict ./
 
 .PHONY: lint-python
@@ -44,4 +36,4 @@ test: build ## Run all tests in a docker container
 	docker run --rm -i --user "$$(id -u):$$(id -g)" -v $$(pwd)/../:/app -w /app/$$(basename $$(pwd)) helm-tester make test-all
 
 .PHONY: test-all ## Run all tests
-test-all: lint deps template pytest
+test-all: deps lint template pytest
diff --git a/helpers/helm-tester/Dockerfile b/helpers/helm-tester/Dockerfile
index b0cefa7b1..96ad4c483 100644
--- a/helpers/helm-tester/Dockerfile
+++ b/helpers/helm-tester/Dockerfile
@@ -1,13 +1,13 @@
 FROM python:3.7
 
-ENV HELM_VERSION=2.17.0
+ENV HELM_VERSION=3.4.1
 
-RUN wget --no-verbose https://storage.googleapis.com/kubernetes-helm/helm-v${HELM_VERSION}-linux-amd64.tar.gz && \
+RUN wget --no-verbose https://get.helm.sh/helm-v${HELM_VERSION}-linux-amd64.tar.gz && \
     tar xfv helm-v${HELM_VERSION}-linux-amd64.tar.gz && \
     mv linux-amd64/helm /usr/local/bin/ && \
-    rm -rf linux-amd64 && \
-    HOME=/ helm init --client-only && \
-    chmod 777 -R /.helm
+    mkdir --parents --mode=777 /.config/helm && \
+    HOME=/ helm repo add stable https://charts.helm.sh/stable && \
+    rm -rf helm-v${HELM_VERSION}-linux-amd64.tar.gz linux-amd64
 
 COPY requirements.txt /usr/src/app/
 RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt
diff --git a/helpers/helpers.py b/helpers/helpers.py
index 9af447a94..4cc96756e 100644
--- a/helpers/helpers.py
+++ b/helpers/helpers.py
@@ -9,7 +9,7 @@ def helm_template(config):
     with tempfile.NamedTemporaryFile() as temp:
         with open(temp.name, "w") as values:
             values.write(config)
-        helm_cmd = "helm template -f {0} --namespace default ./".format(temp.name)
+        helm_cmd = "helm template release-name -f {0} ./".format(temp.name)
         result = yaml.load_all(check_output(helm_cmd.split()))
 
         results = {}
diff --git a/helpers/terraform/Dockerfile b/helpers/terraform/Dockerfile
index 5f49abccd..3540dfb60 100644
--- a/helpers/terraform/Dockerfile
+++ b/helpers/terraform/Dockerfile
@@ -3,7 +3,7 @@ FROM centos:7
 ENV VAULT_VERSION 0.9.3
 ENV TERRAFORM_VERSION=0.11.7
 ENV KUBECTL_VERSION=1.16.10
-ENV HELM_VERSION=2.17.0
+ENV HELM_VERSION=3.4.1
 ENV DOCKER_VERSION=18.09.7
 ENV JQ_VERSION=1.6
 
@@ -22,6 +22,7 @@ RUN yum -y install \
 RUN curl -O https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip && \
     unzip vault_${VAULT_VERSION}_linux_amd64.zip -d /usr/local/bin/ && \
     chmod +x /usr/local/bin/vault && \
+    rm -f vault_${VAULT_VERSION}_linux_amd64.zip && \
     vault version
 
 RUN curl -O https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip && \
@@ -34,17 +35,17 @@ RUN curl -O https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL
     chmod a+x /usr/local/bin/kubectl && \
     kubectl version --client
 
-RUN curl -O https://storage.googleapis.com/kubernetes-helm/helm-v${HELM_VERSION}-linux-amd64.tar.gz && \
+RUN curl -O https://get.helm.sh/helm-v${HELM_VERSION}-linux-amd64.tar.gz && \
     tar xfv helm-v${HELM_VERSION}-linux-amd64.tar.gz && \
     mv linux-amd64/helm /usr/local/bin/ && \
-    rm -rf linux-amd64 && \
+    rm -rf helm-v${HELM_VERSION}-linux-amd64.tar.gz linux-amd64 && \
     helm version --client
 
 RUN curl -O https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz && \
     tar xfv docker* && \
     mv docker/docker /usr/local/bin && \
-    rm -rf docker/ && \
-    docker
+    rm -rf docker-${DOCKER_VERSION}.tgz docker/ && \
+    docker -v
 
 RUN curl -O -L https://github.com/stedolan/jq/releases/download/jq-${JQ_VERSION}/jq-linux64 && \
     mv jq-linux64 /usr/local/bin/jq && \
diff --git a/helpers/terraform/Makefile b/helpers/terraform/Makefile
index a6dcff24b..8d448c3e3 100644
--- a/helpers/terraform/Makefile
+++ b/helpers/terraform/Makefile
@@ -65,8 +65,8 @@ creds: credentials.json ## Get gke credentials
 	kubectl create namespace $(NAMESPACE) || true
 	kubectl config set-context $$(kubectl config current-context) --namespace=$(NAMESPACE)
 
-.PHONY: k8s
-k8s: apply creds ## Configure gke cluster
+.PHONY: up
+up: apply creds ## Configure gke cluster
 	kubectl get cs
 
 .PHONY: k8s-staging-registry
@@ -77,15 +77,10 @@ k8s-staging-registry: creds ## Create the staging registry auth secret in k8s
 		--docker-username="devops-ci" \
 		--docker-password="$$DOCKER_PASSWORD"
 
-.PHONY: up
-up: k8s ## Install helm on gke cluster
-	kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default || true
-	for i in 1 2 3 4 5; do helm init --wait --upgrade && break || sleep 5; done
-
 .PHONY: integration
 integration: creds ## Deploy helm chart and run integration tests
 	cd ../../$(CHART)/ && \
-	helm init --client-only && \
+	helm repo add stable https://charts.helm.sh/stable && \
 	helm dependency update && \
 	cd ./examples/$(SUITE) && \
 	make
@@ -98,4 +93,3 @@ build: ## Build helm-charts docker image
 pull-private-images: ## Pull private images used in testing
 	cd ../../elasticsearch/examples/security/ && \
 		make pull-elasticsearch-image
-
diff --git a/kibana/README.md b/kibana/README.md
index ea2cc9d3a..283aa7b07 100644
--- a/kibana/README.md
+++ b/kibana/README.md
@@ -47,8 +47,8 @@ See [supported configurations][] for more details.
 `helm repo add elastic https://helm.elastic.co`
 
 * Install it:
-  - with Helm 2: `helm install --name kibana elastic/kibana`
-  - with [Helm 3 (beta)][]: `helm install kibana elastic/kibana`
+  - with Helm 3: `helm install kibana elastic/kibana`
+  - with Helm 2 (deprecated): `helm install --name kibana elastic/kibana`
 
 
 ### Install development version using master branch
@@ -56,8 +56,8 @@ See [supported configurations][] for more details.
 * Clone the git repo: `git clone git@github.com:elastic/helm-charts.git`
 
 * Install it:
-  - with Helm 2: `helm install --name kibana ./helm-charts/kibana  --set imageTag=8.0.0-SNAPSHOT`
-  - with [Helm 3 (beta)][]: `helm install kibana ./helm-charts/kibana  --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 3: `helm install kibana ./helm-charts/kibana --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 2 (deprecated): `helm install --name kibana ./helm-charts/kibana --set imageTag=8.0.0-SNAPSHOT`
 
 
 ## Upgrading
@@ -216,7 +216,6 @@ about our development and testing process.
 [examples/security]: https://github.com/elastic/helm-charts/tree/master/kibana/examples/security
 [gke]: https://cloud.google.com/kubernetes-engine
 [helm]: https://helm.sh
-[helm 3 (beta)]: https://github.com/elastic/helm-charts/tree/master/README.md#helm-3-beta
 [imagePullPolicy]: https://kubernetes.io/docs/concepts/containers/images/#updating-images
 [imagePullSecrets]: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-pod-that-uses-your-secret
 [ingress]: https://kubernetes.io/docs/concepts/services-networking/ingress/
diff --git a/kibana/examples/default/Makefile b/kibana/examples/default/Makefile
index ea15adfd0..4c6a6e6d8 100644
--- a/kibana/examples/default/Makefile
+++ b/kibana/examples/default/Makefile
@@ -5,9 +5,9 @@ RELEASE := helm-kibana-default
 
 install:
 	echo "Goss container: $(GOSS_CONTAINER)"
-	helm upgrade --wait --timeout=900 --install $(RELEASE) ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/kibana/examples/openshift/Makefile b/kibana/examples/openshift/Makefile
index e1aadf2a0..8435ba2fe 100644
--- a/kibana/examples/openshift/Makefile
+++ b/kibana/examples/openshift/Makefile
@@ -7,9 +7,9 @@ template:
 	helm template --values ./values.yml ../../
 
 install:
-	helm upgrade --wait --timeout=900 --install --values ./values.yml $(RELEASE) ../../
+	helm upgrade --wait --timeout=900s --install --values ./values.yml $(RELEASE) ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/kibana/examples/oss/Makefile b/kibana/examples/oss/Makefile
index 16e974fcd..cbda8764d 100644
--- a/kibana/examples/oss/Makefile
+++ b/kibana/examples/oss/Makefile
@@ -4,9 +4,9 @@ include ../../../helpers/examples.mk
 RELEASE := helm-kibana-oss
 
 install:
-	helm upgrade --wait --timeout=900 --install --values ./values.yml $(RELEASE) ../../
+	helm upgrade --wait --timeout=900s --install --values ./values.yml $(RELEASE) ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/kibana/examples/security/Makefile b/kibana/examples/security/Makefile
index 107d8b74b..2fa8607e6 100644
--- a/kibana/examples/security/Makefile
+++ b/kibana/examples/security/Makefile
@@ -4,13 +4,13 @@ include ../../../helpers/examples.mk
 RELEASE := helm-kibana-security
 
 install:
-	helm upgrade --wait --timeout=900 --install --values ./security.yml $(RELEASE) ../../
+	helm upgrade --wait --timeout=900s --install --values ./security.yml $(RELEASE) ../../
 
 test: secrets install goss
 
 purge:
 	kubectl delete secret kibana || true
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
 
 secrets:
 	encryptionkey=$$(docker run --rm busybox:1.31.1 /bin/sh -c "< /dev/urandom tr -dc _A-Za-z0-9 | head -c50") && \
diff --git a/kibana/templates/_helpers.tpl b/kibana/templates/_helpers.tpl
index d2ab927b6..d03cc29cf 100755
--- a/kibana/templates/_helpers.tpl
+++ b/kibana/templates/_helpers.tpl
@@ -23,7 +23,7 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this
 Return the appropriate apiVersion for ingress.
 */}}
 {{- define "kibana.ingress.apiVersion" -}}
-{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.Version -}}
 {{- print "extensions/v1beta1" -}}
 {{- else -}}
 {{- print "networking.k8s.io/v1beta1" -}}
diff --git a/logstash/README.md b/logstash/README.md
index 6365e9429..677b3ef86 100644
--- a/logstash/README.md
+++ b/logstash/README.md
@@ -47,8 +47,8 @@ See [supported configurations][] for more details.
 `helm repo add elastic https://helm.elastic.co`
 
 * Install it:
-  - with Helm 2: `helm install --name logstash elastic/logstash`
-  - with [Helm 3 (beta)][]: `helm install logstash elastic/logstash`
+  - with Helm 3: `helm install logstash elastic/logstash`
+  - with Helm 2 (deprecated): `helm install --name logstash elastic/logstash`
 
 
 ### Install development version using master branch
@@ -56,8 +56,8 @@ See [supported configurations][] for more details.
 * Clone the git repo: `git clone git@github.com:elastic/helm-charts.git`
 
 * Install it:
-  - with Helm 2: `helm install --name logstash ./helm-charts/logstash  --set imageTag=8.0.0-SNAPSHOT`
-  - with [Helm 3 (beta)][]: `helm install logstash ./helm-charts/logstash  --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 3: `helm install logstash ./helm-charts/logstash --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 2 (deprecated): `helm install --name logstash ./helm-charts/logstash --set imageTag=8.0.0-SNAPSHOT`
 
 
 ## Upgrading
@@ -202,7 +202,6 @@ about our development and testing process.
 [examples]: https://github.com/elastic/helm-charts/tree/master/logstash/examples
 [examples/oss]: https://github.com/elastic/helm-charts/tree/master/logstash/examples/oss
 [helm]: https://helm.sh
-[helm 3 (beta)]: https://github.com/elastic/helm-charts/tree/master/README.md#helm-3-beta
 [http input plugin]: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-http.html
 [imagePullPolicy]: https://kubernetes.io/docs/concepts/containers/images/#updating-images
 [imagePullSecrets]: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-pod-that-uses-your-secret
diff --git a/logstash/examples/default/Makefile b/logstash/examples/default/Makefile
index 0e295d765..4c5920df5 100644
--- a/logstash/examples/default/Makefile
+++ b/logstash/examples/default/Makefile
@@ -5,12 +5,12 @@ include ../../../helpers/examples.mk
 RELEASE := helm-logstash-default
 
 install:
-	helm upgrade --wait --timeout=1200 --install $(RELEASE) ../../
+	helm upgrade --wait --timeout=1200s --install $(RELEASE) ../../
 
 restart:
-	helm upgrade --set terminationGracePeriod=121 --wait --timeout=1200 --install $(RELEASE) ../../
+	helm upgrade --set terminationGracePeriod=121 --wait --timeout=1200s --install $(RELEASE) ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/logstash/examples/elasticsearch/Makefile b/logstash/examples/elasticsearch/Makefile
index 0323fcea5..b11f714e3 100644
--- a/logstash/examples/elasticsearch/Makefile
+++ b/logstash/examples/elasticsearch/Makefile
@@ -5,13 +5,13 @@ include ../../../helpers/examples.mk
 RELEASE := helm-logstash-elasticsearch
 
 install:
-	helm upgrade --wait --timeout=1200 --install $(RELEASE) --values ./values.yaml ../../
+	helm upgrade --wait --timeout=1200s --install $(RELEASE) --values ./values.yaml ../../
 
 restart:
-	helm upgrade --set terminationGracePeriod=121 --wait --timeout=1200 --install $(RELEASE) ../../
+	helm upgrade --set terminationGracePeriod=121 --wait --timeout=1200s --install $(RELEASE) ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
 	kubectl delete $$(kubectl get pvc -l release=$(RELEASE) -o name)
diff --git a/logstash/examples/oss/Makefile b/logstash/examples/oss/Makefile
index 541d0182f..81c83f702 100644
--- a/logstash/examples/oss/Makefile
+++ b/logstash/examples/oss/Makefile
@@ -5,12 +5,12 @@ include ../../../helpers/examples.mk
 RELEASE := helm-logstash-oss
 
 install:
-	helm upgrade --wait --timeout=1200 --install $(RELEASE)  --values ./values.yaml ../../
+	helm upgrade --wait --timeout=1200s --install $(RELEASE)  --values ./values.yaml ../../
 
 restart:
-	helm upgrade --set terminationGracePeriod=121 --wait --timeout=1200 --install $(RELEASE) ../../
+	helm upgrade --set terminationGracePeriod=121 --wait --timeout=1200s --install $(RELEASE) ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/logstash/examples/security/Makefile b/logstash/examples/security/Makefile
index 8bad0bc1c..ef8ebf13e 100644
--- a/logstash/examples/security/Makefile
+++ b/logstash/examples/security/Makefile
@@ -5,10 +5,10 @@ include ../../../helpers/examples.mk
 RELEASE := helm-logstash-security
 
 install:
-	helm upgrade --wait --timeout=1200 --install $(RELEASE) --values values.yaml ../../
+	helm upgrade --wait --timeout=1200s --install $(RELEASE) --values values.yaml ../../
 
 test: install goss
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
 	kubectl delete $$(kubectl get pvc -l release=$(RELEASE) -o name)
diff --git a/logstash/templates/_helpers.tpl b/logstash/templates/_helpers.tpl
index d240a026e..13c76fde6 100755
--- a/logstash/templates/_helpers.tpl
+++ b/logstash/templates/_helpers.tpl
@@ -23,7 +23,7 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this
 Return the appropriate apiVersion for statefulset.
 */}}
 {{- define "logstash.statefulset.apiVersion" -}}
-{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.Version -}}
 {{- print "apps/v1beta2" -}}
 {{- else -}}
 {{- print "apps/v1" -}}
@@ -34,7 +34,7 @@ Return the appropriate apiVersion for statefulset.
 Return the appropriate apiVersion for ingress.
 */}}
 {{- define "logstash.ingress.apiVersion" -}}
-{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.Version -}}
 {{- print "extensions/v1beta1" -}}
 {{- else -}}
 {{- print "networking.k8s.io/v1beta1" -}}
diff --git a/logstash/templates/service.yaml b/logstash/templates/service.yaml
index 6cbca1ee4..6540c8c61 100644
--- a/logstash/templates/service.yaml
+++ b/logstash/templates/service.yaml
@@ -16,7 +16,6 @@ spec:
   selector:
     app: "{{ template "logstash.fullname" . }}"
     chart: "{{ .Chart.Name }}"
-    heritage: {{ .Release.Service | quote }}
     release: {{ .Release.Name | quote }}
   ports:
 {{ toYaml .Values.service.ports | indent 4 }}
diff --git a/metricbeat/README.md b/metricbeat/README.md
index 061d8fe68..e68ff9c8c 100644
--- a/metricbeat/README.md
+++ b/metricbeat/README.md
@@ -46,8 +46,8 @@ See [supported configurations][] for more details.
 `helm repo add elastic https://helm.elastic.co`
 
 * Install it:
-  - with Helm 2: `helm install --name metricbeat elastic/metricbeat`
-  - with [Helm 3 (beta)][]: `helm install metricbeat elastic/metricbeat`
+  - with Helm 3: `helm install metricbeat elastic/metricbeat`
+  - with Helm 2 (deprecated): `helm install --name metricbeat elastic/metricbeat`
 
 
 ### Install development version using master branch
@@ -55,8 +55,8 @@ See [supported configurations][] for more details.
 * Clone the git repo: `git clone git@github.com:elastic/helm-charts.git`
 
 * Install it:
-  - with Helm 2: `helm install --name metricbeat ./helm-charts/metricbeat  --set imageTag=8.0.0-SNAPSHOT`
-  - with [Helm 3 (beta)][]: `helm install metricbeat ./helm-charts/metricbeat  --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 3: `helm install metricbeat ./helm-charts/metricbeat --set imageTag=8.0.0-SNAPSHOT`
+  - with Helm 2 (deprecated): `helm install --name metricbeat ./helm-charts/metricbeat --set imageTag=8.0.0-SNAPSHOT`
 
 
 ## Upgrading
@@ -224,7 +224,6 @@ about our development and testing process.
 [examples/oss]: https://github.com/elastic/helm-charts/tree/master/metricbeat/examples/oss
 [examples/security]: https://github.com/elastic/helm-charts/tree/master/metricbeat/examples/security
 [helm]: https://helm.sh
-[helm 3 (beta)]: https://github.com/elastic/helm-charts/tree/master/README.md#helm-3-beta
 [hostPath]: https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
 [hostNetwork]: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#host-namespaces
 [imagePullPolicy]: https://kubernetes.io/docs/concepts/containers/images/#updating-images
diff --git a/metricbeat/examples/default/Makefile b/metricbeat/examples/default/Makefile
index 76da6b209..6ff5a30e7 100644
--- a/metricbeat/examples/default/Makefile
+++ b/metricbeat/examples/default/Makefile
@@ -6,7 +6,7 @@ RELEASE = helm-metricbeat-default
 GOSS_SELECTOR = release=$(RELEASE),app=helm-metricbeat-default-metricbeat
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) ../../
 
 test-metrics:
 	 GOSS_FILE=goss-metrics.yaml make goss GOSS_SELECTOR=release=$(RELEASE),app=helm-metricbeat-default-metricbeat-metrics
@@ -14,4 +14,4 @@ test-metrics:
 test: install goss test-metrics
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
diff --git a/metricbeat/examples/oss/Makefile b/metricbeat/examples/oss/Makefile
index afe3c1f2c..acb1124bc 100644
--- a/metricbeat/examples/oss/Makefile
+++ b/metricbeat/examples/oss/Makefile
@@ -6,10 +6,10 @@ RELEASE := helm-metricbeat-oss
 GOSS_SELECTOR = release=$(RELEASE),app=helm-metricbeat-oss-metricbeat
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) --values values.yaml ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) --values values.yaml ../../
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
 
 test-metrics:
 	 GOSS_FILE=goss-metrics.yaml make goss GOSS_SELECTOR=release=$(RELEASE),app=helm-metricbeat-oss-metricbeat-metrics
diff --git a/metricbeat/examples/security/Makefile b/metricbeat/examples/security/Makefile
index acabeb20a..d57cb05be 100644
--- a/metricbeat/examples/security/Makefile
+++ b/metricbeat/examples/security/Makefile
@@ -6,10 +6,10 @@ RELEASE := helm-metricbeat-security
 GOSS_SELECTOR = release=$(RELEASE),app=helm-metricbeat-security-metricbeat
 
 install:
-	helm upgrade --wait --timeout=900 --install $(RELEASE) --values values.yaml ../../
+	helm upgrade --wait --timeout=900s --install $(RELEASE) --values values.yaml ../../
 
 purge:
-	helm del --purge $(RELEASE)
+	helm del $(RELEASE)
 
 test-metrics:
 	 GOSS_FILE=goss-metrics.yaml make goss GOSS_SELECTOR=release=$(RELEASE),app=helm-metricbeat-security-metricbeat-metrics
diff --git a/metricbeat/templates/deployment.yaml b/metricbeat/templates/deployment.yaml
index e9d682b2e..cc97f20e5 100644
--- a/metricbeat/templates/deployment.yaml
+++ b/metricbeat/templates/deployment.yaml
@@ -30,7 +30,6 @@ spec:
   selector:
     matchLabels:
       app: '{{ template "metricbeat.fullname" . }}-metrics'
-      heritage: '{{ .Release.Service }}'
       release: '{{ .Release.Name }}'
   template:
     metadata:
@@ -45,7 +44,6 @@ spec:
       labels:
         app: '{{ template "metricbeat.fullname" . }}-metrics'
         chart: '{{ .Chart.Name }}-{{ .Chart.Version }}'
-        heritage: '{{ .Release.Service }}'
         release: '{{ .Release.Name }}'
         {{- if .Values.deployment.labels }}
         {{- range $key, $value := .Values.deployment.labels }}

helm upgrade fails due to 'cannot patch "elasticsearch-master" with kind StatefulSet'
**Chart version:**
7.6.0

**Kubernetes version:**
v1.14.9-eks-c0eccc

**Kubernetes provider:** E.g. GKE (Google Kubernetes Engine)
EKS

**Helm Version:**
v3.0.2

**`helm get release` output**
<details>
<summary>Output of helm get release</summary>

```
NAME: elasticsearch
LAST DEPLOYED: Fri Feb 21 16:30:05 2020
NAMESPACE: elasticsearch
STATUS: failed
REVISION: 29
USER-SUPPLIED VALUES:
antiAffinity: hard
antiAffinityTopologyKey: kubernetes.io/hostname
clusterHealthCheckParams: wait_for_status=green&timeout=1s
clusterName: elasticsearch
esConfig:
  elasticsearch.yml: |
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.http.ssl.enabled: true
    xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    network.host: 0.0.0.0
esJavaOpts: -Xmx1g -Xms1g
esMajorVersion: ""
extraEnvs:
- name: ELASTIC_PASSWORD
  valueFrom:
    secretKeyRef:
      key: password
      name: elastic-credentials
- name: ELASTIC_USERNAME
  valueFrom:
    secretKeyRef:
      key: username
      name: elastic-credentials
extraInitContainers: ""
extraVolumeMounts: ""
extraVolumes: ""
fsGroup: ""
fullnameOverride: ""
httpPort: 9200
image: docker.elastic.co/elasticsearch/elasticsearch
imagePullPolicy: IfNotPresent
imagePullSecrets: []
imageTag: 7.6.0
ingress:
  annotations: {}
  enabled: false
  hosts:
  - elasticsearch.local
  path: /
  tls: []
initResources: {}
keystore: []
labels: {}
lifecycle: {}
masterService: ""
masterTerminationFix: false
maxUnavailable: 1
minimumMasterNodes: 2
nameOverride: ""
networkHost: 0.0.0.0
nodeAffinity: {}
nodeGroup: master
nodeSelector: {}
persistence:
  annotations: {}
  enabled: true
podAnnotations: {}
podManagementPolicy: Parallel
podSecurityContext:
  fsGroup: 1000
  runAsUser: 1000
podSecurityPolicy:
  create: false
  name: ""
  spec:
    fsGroup:
      rule: RunAsAny
    privileged: true
    runAsUser:
      rule: RunAsAny
    seLinux:
      rule: RunAsAny
    supplementalGroups:
      rule: RunAsAny
    volumes:
    - secret
    - configMap
    - persistentVolumeClaim
priorityClassName: ""
protocol: https
rbac:
  create: false
  serviceAccountName: ""
readinessProbe:
  failureThreshold: 3
  initialDelaySeconds: 10
  periodSeconds: 10
  successThreshold: 3
  timeoutSeconds: 5
replicas: 3
resources:
  limits:
    cpu: 1000m
    memory: 2Gi
  requests:
    cpu: 200m
    memory: 2Gi
roles:
  data: "true"
  ingest: "true"
  master: "true"
schedulerName: ""
secretMounts:
- name: elastic-certificates
  path: /usr/share/elasticsearch/config/certs
  secretName: elastic-certificates
securityContext:
  capabilities:
    drop:
    - ALL
  runAsNonRoot: true
  runAsUser: 1000
service:
  annotations: {}
  httpPortName: http
  labels: {}
  labelsHeadless: {}
  nodePort: ""
  transportPortName: transport
  type: ClusterIP
sidecarResources: {}
sysctlInitContainer:
  enabled: true
sysctlVmMaxMapCount: 262144
terminationGracePeriod: 120
tolerations: []
transportPort: 9300
updateStrategy: RollingUpdate
volumeClaimTemplate:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

COMPUTED VALUES:
antiAffinity: hard
antiAffinityTopologyKey: kubernetes.io/hostname
clusterHealthCheckParams: wait_for_status=green&timeout=1s
clusterName: elasticsearch
esConfig:
  elasticsearch.yml: |
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.http.ssl.enabled: true
    xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    network.host: 0.0.0.0
esJavaOpts: -Xmx1g -Xms1g
esMajorVersion: ""
extraContainers: ""
extraEnvs:
- name: ELASTIC_PASSWORD
  valueFrom:
    secretKeyRef:
      key: password
      name: elastic-credentials
- name: ELASTIC_USERNAME
  valueFrom:
    secretKeyRef:
      key: username
      name: elastic-credentials
extraInitContainers: ""
extraVolumeMounts: ""
extraVolumes: ""
fsGroup: ""
fullnameOverride: ""
httpPort: 9200
image: docker.elastic.co/elasticsearch/elasticsearch
imagePullPolicy: IfNotPresent
imagePullSecrets: []
imageTag: 7.6.0
ingress:
  annotations: {}
  enabled: false
  hosts:
  - elasticsearch.local
  path: /
  tls: []
initResources: {}
keystore: []
labels: {}
lifecycle: {}
masterService: ""
masterTerminationFix: false
maxUnavailable: 1
minimumMasterNodes: 2
nameOverride: ""
networkHost: 0.0.0.0
nodeAffinity: {}
nodeGroup: master
nodeSelector: {}
persistence:
  annotations: {}
  enabled: true
podAnnotations: {}
podManagementPolicy: Parallel
podSecurityContext:
  fsGroup: 1000
  runAsUser: 1000
podSecurityPolicy:
  create: false
  name: ""
  spec:
    fsGroup:
      rule: RunAsAny
    privileged: true
    runAsUser:
      rule: RunAsAny
    seLinux:
      rule: RunAsAny
    supplementalGroups:
      rule: RunAsAny
    volumes:
    - secret
    - configMap
    - persistentVolumeClaim
priorityClassName: ""
protocol: https
rbac:
  create: false
  serviceAccountName: ""
readinessProbe:
  failureThreshold: 3
  initialDelaySeconds: 10
  periodSeconds: 10
  successThreshold: 3
  timeoutSeconds: 5
replicas: 3
resources:
  limits:
    cpu: 1000m
    memory: 2Gi
  requests:
    cpu: 200m
    memory: 2Gi
roles:
  data: "true"
  ingest: "true"
  master: "true"
schedulerName: ""
secretMounts:
- name: elastic-certificates
  path: /usr/share/elasticsearch/config/certs
  secretName: elastic-certificates
securityContext:
  capabilities:
    drop:
    - ALL
  runAsNonRoot: true
  runAsUser: 1000
service:
  annotations: {}
  httpPortName: http
  labels: {}
  labelsHeadless: {}
  nodePort: ""
  transportPortName: transport
  type: ClusterIP
sidecarResources: {}
sysctlInitContainer:
  enabled: true
sysctlVmMaxMapCount: 262144
terminationGracePeriod: 120
tolerations: []
transportPort: 9300
updateStrategy: RollingUpdate
volumeClaimTemplate:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

HOOKS:
---
# Source: elasticsearch/templates/test/test-elasticsearch-health.yaml
apiVersion: v1
kind: Pod
metadata:
  name: "elasticsearch-sbxrc-test"
  annotations:
    "helm.sh/hook": test-success
spec:
  containers:
  - name: "elasticsearch-ualfr-test"
    image: "docker.elastic.co/elasticsearch/elasticsearch:7.6.0"
    command:
      - "sh"
      - "-c"
      - |
        #!/usr/bin/env bash -e
        curl -XGET --fail 'elasticsearch-master:9200/_cluster/health?wait_for_status=green&timeout=1s'
  restartPolicy: Never
MANIFEST:
---
# Source: elasticsearch/templates/poddisruptionbudget.yaml
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: "elasticsearch-master-pdb"
spec:
  maxUnavailable: 1
  selector:
    matchLabels:
      app: "elasticsearch-master"
---
# Source: elasticsearch/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: elasticsearch-master-config
  labels:
    heritage: "Helm"
    release: "elasticsearch"
    chart: "elasticsearch"
    app: "elasticsearch-master"
data:
  elasticsearch.yml: |
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.http.ssl.enabled: true
    xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    network.host: 0.0.0.0
---
# Source: elasticsearch/templates/service.yaml
kind: Service
apiVersion: v1
metadata:
  name: elasticsearch-master-headless
  labels:
    heritage: "Helm"
    release: "elasticsearch"
    chart: "elasticsearch"
    app: "elasticsearch-master"
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
  clusterIP: None # This is needed for statefulset hostnames like elasticsearch-0 to resolve
  # Create endpoints also if the related pod isn't ready
  publishNotReadyAddresses: true
  selector:
    app: "elasticsearch-master"
  ports:
  - name: http
    port: 9200
  - name: transport
    port: 9300
---
# Source: elasticsearch/templates/service.yaml
kind: Service
apiVersion: v1
metadata:
  name: elasticsearch-master
  labels:
    heritage: "Helm"
    release: "elasticsearch"
    chart: "elasticsearch"
    app: "elasticsearch-master"
  annotations:
    {}
spec:
  type: ClusterIP
  selector:
    heritage: "Helm"
    release: "elasticsearch"
    chart: "elasticsearch"
    app: "elasticsearch-master"
  ports:
  - name: http
    protocol: TCP
    port: 9200
  - name: transport
    protocol: TCP
    port: 9300
---
# Source: elasticsearch/templates/statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch-master
  labels:
    heritage: "Helm"
    release: "elasticsearch"
    chart: "elasticsearch"
    app: "elasticsearch-master"
  annotations:
    esMajorVersion: "7"
spec:
  serviceName: elasticsearch-master-headless
  selector:
    matchLabels:
      app: "elasticsearch-master"
  replicas: 3
  podManagementPolicy: Parallel
  updateStrategy:
    type: RollingUpdate
  volumeClaimTemplates:
  - metadata:
      name: elasticsearch-master
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
  template:
    metadata:
      name: "elasticsearch-master"
      labels:
        heritage: "Helm"
        release: "elasticsearch"
        chart: "elasticsearch"
        app: "elasticsearch-master"
      annotations:
        
        configchecksum: a925349ed01ac0903a539d33164dabb0c174b9b602c943057c90033eee58253
    spec:
      securityContext:
        fsGroup: 1000
        runAsUser: 1000
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - "elasticsearch-master"
            topologyKey: kubernetes.io/hostname
      terminationGracePeriodSeconds: 120
      volumes:
        - name: elastic-certificates
          secret:
            secretName: elastic-certificates
        - name: esconfig
          configMap:
            name: elasticsearch-master-config
      initContainers:
      - name: configure-sysctl
        securityContext:
          runAsUser: 0
          privileged: true
        image: "docker.elastic.co/elasticsearch/elasticsearch:7.6.0"
        imagePullPolicy: "IfNotPresent"
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        resources:
          {}

      containers:
      - name: "elasticsearch"
        securityContext:
          capabilities:
            drop:
            - ALL
          runAsNonRoot: true
          runAsUser: 1000
        image: "docker.elastic.co/elasticsearch/elasticsearch:7.6.0"
        imagePullPolicy: "IfNotPresent"
        readinessProbe:
          failureThreshold: 3
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 3
          timeoutSeconds: 5
          exec:
            command:
              - sh
              - -c
              - |
                #!/usr/bin/env bash -e
                # If the node is starting up wait for the cluster to be ready (request params: 'wait_for_status=green&timeout=1s' )
                # Once it has started only check that the node itself is responding
                START_FILE=/tmp/.es_start_file

                http () {
                    local path="${1}"
                    if [ -n "${ELASTIC_USERNAME}" ] && [ -n "${ELASTIC_PASSWORD}" ]; then
                      BASIC_AUTH="-u ${ELASTIC_USERNAME}:${ELASTIC_PASSWORD}"
                    else
                      BASIC_AUTH=''
                    fi
                    curl -XGET -s -k --fail ${BASIC_AUTH} https://127.0.0.1:9200${path}
                }

                if [ -f "${START_FILE}" ]; then
                    echo 'Elasticsearch is already running, lets check the node is healthy and there are master nodes available'
                    http "/_cluster/health?timeout=0s"
                else
                    echo 'Waiting for elasticsearch cluster to become ready (request params: "wait_for_status=green&timeout=1s" )'
                    if http "/_cluster/health?wait_for_status=green&timeout=1s" ; then
                        touch ${START_FILE}
                        exit 0
                    else
                        echo 'Cluster is not yet ready (request params: "wait_for_status=green&timeout=1s" )'
                        exit 1
                    fi
                fi
        ports:
        - name: http
          containerPort: 9200
        - name: transport
          containerPort: 9300
        resources:
          limits:
            cpu: 1000m
            memory: 2Gi
          requests:
            cpu: 200m
            memory: 2Gi
        env:
          - name: node.name
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: cluster.initial_master_nodes
            value: "elasticsearch-master-0,elasticsearch-master-1,elasticsearch-master-2,"
          - name: discovery.seed_hosts
            value: "elasticsearch-master-headless"
          - name: cluster.name
            value: "elasticsearch"
          - name: network.host
            value: "0.0.0.0"
          - name: ES_JAVA_OPTS
            value: "-Xmx1g -Xms1g"
          - name: node.data
            value: "true"
          - name: node.ingest
            value: "true"
          - name: node.master
            value: "true"
          - name: ELASTIC_PASSWORD
            valueFrom:
              secretKeyRef:
                key: password
                name: elastic-credentials
          - name: ELASTIC_USERNAME
            valueFrom:
              secretKeyRef:
                key: username
                name: elastic-credentials
        volumeMounts:
          - name: "elasticsearch-master"
            mountPath: /usr/share/elasticsearch/data

          - name: elastic-certificates
            mountPath: /usr/share/elasticsearch/config/certs
          - name: esconfig
            mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
            subPath: elasticsearch.yml

NOTES:
1. Watch all cluster members come up.
  $ kubectl get pods --namespace=elasticsearch -l app=elasticsearch-master -w
2. Test cluster health using Helm test.
  $ helm test elasticsearch

```
NOTE: the images above show 7.6.0 as I have manually updated the statefulset as a workaround. 
</details>

**Describe the bug:**
Performing 'helm upgrade' returns the following error;

Error: UPGRADE FAILED: cannot patch "elasticsearch-master" with kind StatefulSet: StatefulSet.apps "elasticsearch-master" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden


**Steps to reproduce:**

1. helm install elasticsearch elastic/elasticsearch -n elasticsearch -f values.yaml
2. helm upgrade elasticsearch elastic/elasticsearch -n elasticsearch -f values.yaml

**Expected behavior:**
Successful upgrade to newer image

**Provide logs and/or server output (if relevant):**

```
 cat values.yaml
---
clusterName: "elasticsearch"
nodeGroup: "master"

# The service that non master groups will try to connect to when joining the cluster
# This should be set to clusterName + "-" + nodeGroup for your master group
masterService: ""

# Elasticsearch roles that will be applied to this nodeGroup
# These will be set as environment variables. E.g. node.master=true
roles:
  master: "true"
  ingest: "true"
  data: "true"

replicas: 3
minimumMasterNodes: 2

esMajorVersion: ""

# Allows you to add any config files in /usr/share/elasticsearch/config/
# such as elasticsearch.yml and log4j2.properties
esConfig:  
  elasticsearch.yml: |
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.http.ssl.enabled: true
    xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    network.host: 0.0.0.0
#  log4j2.properties: |
#    key = value

# Extra environment variables to append to this nodeGroup
# This will be appended to the current 'env:' key. You can use any of the kubernetes env
# syntax here
extraEnvs:
  - name: ELASTIC_PASSWORD
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: password
  - name: ELASTIC_USERNAME
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: username

# A list of secrets and their paths to mount inside the pod
# This is useful for mounting certificates for security and for mounting
# the X-Pack license
secretMounts:
  - name: elastic-certificates
    secretName: elastic-certificates
    path: /usr/share/elasticsearch/config/certs    


image: "docker.elastic.co/elasticsearch/elasticsearch"
imageTag: "7.6.0"
imagePullPolicy: "IfNotPresent"

podAnnotations: {}
  # iam.amazonaws.com/role: es-cluster

# additionals labels
labels: {}

esJavaOpts: "-Xmx1g -Xms1g"

resources:
  requests:
    cpu: "200m"
    memory: "2Gi"
  limits:
    cpu: "1000m"
    memory: "2Gi"

initResources: {}
  # limits:
  #   cpu: "25m"
  #   # memory: "128Mi"
  # requests:
  #   cpu: "25m"
  #   memory: "128Mi"

sidecarResources: {}
  # limits:
  #   cpu: "25m"
  #   # memory: "128Mi"
  # requests:
  #   cpu: "25m"
  #   memory: "128Mi"

networkHost: "0.0.0.0"

volumeClaimTemplate:
  accessModes: [ "ReadWriteOnce" ]
  resources:
    requests:
      storage: 50Gi

rbac:
  create: false
  serviceAccountName: ""

podSecurityPolicy:
  create: false
  name: ""
  spec:
    privileged: true
    fsGroup:
      rule: RunAsAny
    runAsUser:
      rule: RunAsAny
    seLinux:
      rule: RunAsAny
    supplementalGroups:
      rule: RunAsAny
    volumes:
      - secret
      - configMap
      - persistentVolumeClaim

persistence:
  enabled: true
  annotations: {}

extraVolumes: ""
  # - name: extras
  #   emptyDir: {}

extraVolumeMounts: ""
  # - name: extras
  #   mountPath: /usr/share/extras
  #   readOnly: true

extraInitContainers: ""
  # - name: do-something
  #   image: busybox
  #   command: ['do', 'something']

# This is the PriorityClass settings as defined in
# https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""

# By default this will make sure two pods don't end up on the same node
# Changing this to a region would allow you to spread pods across regions
antiAffinityTopologyKey: "kubernetes.io/hostname"

# Hard means that by default pods will only be scheduled if there are enough nodes for them
# and that they will never end up on the same node. Setting this to soft will do this "best effort"
antiAffinity: "hard"

# This is the node affinity settings as defined in
# https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity-beta-feature
nodeAffinity: {}

# The default is to deploy all pods serially. By setting this to parallel all pods are started at
# the same time when bootstrapping the cluster
podManagementPolicy: "Parallel"

protocol: https
httpPort: 9200
transportPort: 9300

service:
  labels: {}
  labelsHeadless: {}
  type: ClusterIP
  nodePort: ""
  annotations: {}
  httpPortName: http
  transportPortName: transport

updateStrategy: RollingUpdate

# This is the max unavailable setting for the pod disruption budget
# The default value of 1 will make sure that kubernetes won't allow more than 1
# of your pods to be unavailable during maintenance
maxUnavailable: 1

podSecurityContext:
  fsGroup: 1000
  runAsUser: 1000

# The following value is deprecated,
# please use the above podSecurityContext.fsGroup instead
fsGroup: ""

securityContext:
  capabilities:
    drop:
    - ALL
  # readOnlyRootFilesystem: true
  runAsNonRoot: true
  runAsUser: 1000

# How long to wait for elasticsearch to stop gracefully
terminationGracePeriod: 120

sysctlVmMaxMapCount: 262144

readinessProbe:
  failureThreshold: 3
  initialDelaySeconds: 10
  periodSeconds: 10
  successThreshold: 3
  timeoutSeconds: 5

# https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html#request-params wait_for_status
clusterHealthCheckParams: "wait_for_status=green&timeout=1s"

## Use an alternate scheduler.
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
##
schedulerName: ""

imagePullSecrets: []
nodeSelector: {}
tolerations: []

# Enabling this will publically expose your Elasticsearch instance.
# Only enable this if you have security enabled on your cluster
ingress:
  enabled: false
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - elasticsearch.local
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

nameOverride: ""
fullnameOverride: ""

# https://github.com/elastic/helm-charts/issues/63
masterTerminationFix: false

lifecycle: {}
  # preStop:
  #   exec:
  #     command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
  # postStart:
  #   exec:
  #     command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]

sysctlInitContainer:
  enabled: true

keystore: []

```

**Any additional context:**
I manually updated the statefulset to get around the problem, hoping helm would then recognise the new image version was in place, however that has gained me nothing. The upgrade still fails
