Repository: linkerd/linkerd2
Pull request #4841 (2020-08-05 18:44:54)

Release ARM CLI artifacts
@cpretzer @alpeb @kleimkuhler 

# Changes
- Only push single docker image arch `amd64` for `cli-bin`. Inside that image, it will consist of multiple architecture binary files. It used the multi-stage build pattern to produce those binaries. [Ref](https://medium.com/@tonistiigi/advanced-multi-stage-build-patterns-6f741b852fae)
- Add the arch name on the binary filename.

# TODO
- [x] Adjust the installer script in https://github.com/linkerd/website

# Note
- Installer script for brew formula does not need a change, because it builds the binary directly instead of download the existing binary. [Brew Formula](https://github.com/Homebrew/homebrew-core/blob/master/Formula/linkerd.rb)

Manual tested in a local fork. https://github.com/aliariff/linkerd2/releases/tag/stable-test

alpeb: Sorry @aliariff , my last comment was utter nonsense! I had seemingly previously built a single arch image and that's what the script used. After clearing my local cache it's working fine. I'll test now the release in my fork and report back.

Patch:
diff --git a/.github/workflows/cloud_integration.yml b/.github/workflows/cloud_integration.yml
index 7491d10a2..7dc835aef 100644
--- a/.github/workflows/cloud_integration.yml
+++ b/.github/workflows/cloud_integration.yml
@@ -80,7 +80,7 @@ jobs:
       id: install_cli
       run: |
         TAG="$(CI_FORCE_CLEAN=1 bin/root-tag)"
-        CMD="$PWD/target/release/linkerd2-cli-$TAG-linux"
+        CMD="$PWD/target/release/linkerd2-cli-$TAG-linux-amd64"
         bin/docker-pull-binaries $TAG
         $CMD version --client
         # validate CLI version matches the repo
diff --git a/.github/workflows/kind_integration.yml b/.github/workflows/kind_integration.yml
index fc82501b5..7acd22460 100644
--- a/.github/workflows/kind_integration.yml
+++ b/.github/workflows/kind_integration.yml
@@ -137,7 +137,7 @@ jobs:
       run: |
         # Copy the CLI out of the local cli-bin container.
         container_id=$(docker create "$DOCKER_REGISTRY/cli-bin:$TAG")
-        docker cp $container_id:/out/linkerd-linux "$HOME/.linkerd"
+        docker cp $container_id:/out/linkerd-linux-amd64 "$HOME/.linkerd"
 
         # Validate the CLI version matches the current build tag.
         [[ "$TAG" == "$($HOME/.linkerd version --short --client)" ]]
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 8630bd62a..c8e191012 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -133,7 +133,7 @@ jobs:
     - name: Set environment variables from scripts
       run: |
         TAG="$(CI_FORCE_CLEAN=1 bin/root-tag)"
-        CMD="$PWD/target/release/linkerd2-cli-$TAG-linux"
+        CMD="$PWD/target/release/linkerd2-cli-$TAG-linux-amd64"
         echo "::set-env name=CMD::$CMD"
         echo "::set-env name=TAG::$TAG"
     - name: Run integration tests
@@ -163,7 +163,7 @@ jobs:
       id: install_cli
       run: |
         TAG="$(CI_FORCE_CLEAN=1 bin/root-tag)"
-        CMD="$PWD/target/release/linkerd2-cli-$TAG-linux"
+        CMD="$PWD/target/release/linkerd2-cli-$TAG-linux-amd64"
         bin/docker-pull-binaries $TAG
         $CMD version --client
         # validate CLI version matches the repo
@@ -243,6 +243,8 @@ jobs:
       with:
         name: choco
     - name: Pull CLI binaries
+      env:
+        DOCKER_MULTIARCH: 1
       run : |
         bin/docker-pull-binaries $TAG
         VERSION=${TAG#"stable-"}
@@ -260,8 +262,8 @@ jobs:
         files: |
           ./target/release/linkerd2-cli-*-darwin
           ./target/release/linkerd2-cli-*-darwin.sha256
-          ./target/release/linkerd2-cli-*-linux
-          ./target/release/linkerd2-cli-*-linux.sha256
+          ./target/release/linkerd2-cli-*-linux-*
+          ./target/release/linkerd2-cli-*-linux-*.sha256
           ./target/release/linkerd2-cli-*-windows.exe
           ./target/release/linkerd2-cli-*-windows.exe.sha256
           ./target/release/linkerd2-cli-*.nupkg
diff --git a/.proxy-version b/.proxy-version
index 8012337e4..8c95cd04f 100644
--- a/.proxy-version
+++ b/.proxy-version
@@ -1,1 +1,1 @@
-v2.105.0
+v2.106.0
diff --git a/ADOPTERS.md b/ADOPTERS.md
index d8d3f3d89..2ade97b23 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -19,12 +19,14 @@
 - [Kurio](https://kurio.id)
 - [LeadIQ](https://leadiq.com)
 - [MattePaint](https://www.mattepaint.com/)
+- [MercedesBenz.io](https://www.mercedes-benz.io/)
 - [Mulligan Funding](https://www.mulliganfunding.com/)
 - [National Information Solutions Cooperative (NISC)](https://nisc.coop/)
 - [Nordstrom](https://nordstrom.com/)
 - [Paybase](https://paybase.io/)
 - [PlayStudios Asia](https://www.playstudios.asia)
 - [Projector](https://projector.com)
+- [Purdue University Global](https://www.purdueglobal.edu/)
 - [Studyo](https://studyo.co)
 - [Sue](https://sue.nl)
 - [Transit](https://transit.app)
diff --git a/bin/_docker.sh b/bin/_docker.sh
index cfd163d1b..f9e8a82fd 100644
--- a/bin/_docker.sh
+++ b/bin/_docker.sh
@@ -27,7 +27,7 @@ export DOCKER_MULTIARCH=${DOCKER_MULTIARCH:-}
 export DOCKER_PUSH=${DOCKER_PUSH:-}
 
 # Default supported docker image architectures
-export SUPPORTED_ARCHS=linux/amd64,linux/arm64,linux/arm/v7
+export SUPPORTED_ARCHS=${SUPPORTED_ARCHS:-linux/amd64,linux/arm64,linux/arm/v7}
 
 docker_repo() {
     repo=$1
diff --git a/bin/docker-build-cli-bin b/bin/docker-build-cli-bin
index 01377e314..2a754e216 100755
--- a/bin/docker-build-cli-bin
+++ b/bin/docker-build-cli-bin
@@ -15,14 +15,29 @@ rootdir=$( cd "$bindir"/.. && pwd )
 # shellcheck source=_tag.sh
 . "$bindir"/_tag.sh
 
+get_multiarch_argument() {
+    if [ -n "$DOCKER_MULTIARCH" ]; then
+        echo "--build-arg BUILD_STAGE=multi-arch"
+    fi
+}
+
 dockerfile=$rootdir/cli/Dockerfile-bin
 tag=$(head_root_tag)
-docker_build cli-bin "$tag" "$dockerfile" --build-arg LINKERD_VERSION="$tag"
+
+# shellcheck disable=SC2046
+SUPPORTED_ARCHS=linux/amd64 docker_build cli-bin "$tag" "$dockerfile" \
+    --build-arg LINKERD_VERSION="$tag" \
+    $(get_multiarch_argument)
+
 IMG=$(docker_repo cli-bin):$tag
 ID=$(docker create "$IMG")
+OS="darwin windows linux-amd64"
+if [ -n "$DOCKER_MULTIARCH" ]; then
+    OS+=" linux-arm64 linux-arm"
+fi
 
 # copy the newly built linkerd cli binaries to the local system
-for OS in darwin linux windows ; do
+for OS in $OS; do
     DIR=$rootdir/target/cli/$OS
     mkdir -p "$DIR"
 
diff --git a/bin/docker-pull-binaries b/bin/docker-pull-binaries
index a95b47a97..f4f34f8ab 100755
--- a/bin/docker-pull-binaries
+++ b/bin/docker-pull-binaries
@@ -23,8 +23,12 @@ shorttag=${tag#v}
 
 # create the cli-bin container in order to extract the binaries
 id=$(docker create "$(docker_repo cli-bin):$tag")
+OS="darwin windows linux-amd64"
+if [ -n "$DOCKER_MULTIARCH" ]; then
+    OS+=" linux-arm64 linux-arm"
+fi
 
-for os in darwin linux windows ; do
+for os in $OS; do
   ext=$os
   if [ "$os" = windows ]; then
     ext=windows.exe
diff --git a/charts/add-ons/grafana/templates/grafana-rbac.yaml b/charts/add-ons/grafana/templates/grafana-rbac.yaml
index 341dd8450..bb1e38526 100644
--- a/charts/add-ons/grafana/templates/grafana-rbac.yaml
+++ b/charts/add-ons/grafana/templates/grafana-rbac.yaml
@@ -6,7 +6,7 @@
 kind: ServiceAccount
 apiVersion: v1
 metadata:
-  name: {{.Values.name}}
+  name: linkerd-grafana
   namespace: {{.Values.global.namespace}}
   labels:
     {{.Values.global.controllerComponentLabel}}: grafana
diff --git a/charts/add-ons/grafana/templates/grafana.yaml b/charts/add-ons/grafana/templates/grafana.yaml
index 394a8b4cb..fa0a365fa 100644
--- a/charts/add-ons/grafana/templates/grafana.yaml
+++ b/charts/add-ons/grafana/templates/grafana.yaml
@@ -6,7 +6,7 @@
 kind: ConfigMap
 apiVersion: v1
 metadata:
-  name: {{.Values.name}}-config
+  name: linkerd-grafana-config
   namespace: {{.Values.global.namespace}}
   labels:
     {{.Values.global.controllerComponentLabel}}: grafana
@@ -15,7 +15,7 @@ metadata:
     {{.Values.global.createdByAnnotation}}: {{default (printf "linkerd/helm %s" .Values.global.linkerdVersion) .Values.global.cliVersion}}
 data:
   grafana.ini: |-
-    instance_name = {{.Values.name}}
+    instance_name = linkerd-grafana
 
     [server]
     root_url = %(protocol)s://%(domain)s:/grafana/
@@ -70,7 +70,7 @@ data:
 kind: Service
 apiVersion: v1
 metadata:
-  name: {{.Values.name}}
+  name: linkerd-grafana
   namespace: {{.Values.global.namespace}}
   labels:
     {{.Values.global.controllerComponentLabel}}: grafana
@@ -87,7 +87,7 @@ spec:
     targetPort: 3000
 ---
 {{ $_ := set .Values.global.proxy "workloadKind" "deployment" -}}
-{{ $_ := set .Values.global.proxy "component" .Values.name -}}
+{{ $_ := set .Values.global.proxy "component" "linkerd-grafana" -}}
 {{ include "linkerd.proxy.validation" .Values.global.proxy -}}
 apiVersion: apps/v1
 kind: Deployment
@@ -100,7 +100,7 @@ metadata:
     app.kubernetes.io/version: {{default .Values.global.linkerdVersion .Values.global.controllerImageVersion}}
     {{.Values.global.controllerComponentLabel}}: grafana
     {{.Values.global.controllerNamespaceLabel}}: {{.Values.global.namespace}}
-  name: {{.Values.name}}
+  name: linkerd-grafana
   namespace: {{.Values.global.namespace}}
 spec:
   replicas: 1
@@ -132,7 +132,7 @@ spec:
         # see https://github.com/grafana/grafana/issues/20096
         - name: GODEBUG
           value: netdns=go
-        image: {{.Values.image.name}}:{{default .Values.global.linkerdVersion .Values.global.controllerImageVersion}}
+        image: {{.Values.image.name}}:{{ default (default .Values.global.linkerdVersion .Values.global.controllerImageVersion) .Values.image.tag}}
         imagePullPolicy: {{.Values.global.imagePullPolicy}}
         livenessProbe:
           httpGet:
@@ -158,7 +158,7 @@ spec:
         - mountPath: /etc/grafana
           name: grafana-config
           readOnly: true
-      {{- $tree := deepCopy . }}      
+      {{- $tree := deepCopy . }}
       {{- if not (empty .Values.proxy) }}
       {{- if not (empty .Values.proxy.resources) }}
       {{- $r := merge .Values.proxy.resources .Values.global.proxy.resources }}
@@ -170,7 +170,7 @@ spec:
       initContainers:
       - {{- include "partials.proxy-init" . | indent 8 | trimPrefix (repeat 7 " ") }}
       {{ end -}}
-      serviceAccountName: {{.Values.name}}
+      serviceAccountName: linkerd-grafana
       volumes:
       - emptyDir: {}
         name: data
@@ -182,7 +182,7 @@ spec:
             path: provisioning/datasources/datasources.yaml
           - key: dashboards.yaml
             path: provisioning/dashboards/dashboards.yaml
-          name: {{.Values.name}}-config
+          name: linkerd-grafana-config
         name: grafana-config
       {{ if .Values.global.controlPlaneTracing -}}
       - {{- include "partials.proxy.volumes.labels" . | indent 8 | trimPrefix (repeat 7 " ") }}
diff --git a/charts/add-ons/grafana/values.yaml b/charts/add-ons/grafana/values.yaml
index e69de29bb..e8ee1ef43 100644
--- a/charts/add-ons/grafana/values.yaml
+++ b/charts/add-ons/grafana/values.yaml
@@ -0,0 +1,2 @@
+image:
+  name: gcr.io/linkerd-io/grafana
diff --git a/charts/linkerd2/README.md b/charts/linkerd2/README.md
index 0508c6182..dbeb26565 100644
--- a/charts/linkerd2/README.md
+++ b/charts/linkerd2/README.md
@@ -142,8 +142,6 @@ their default values.
 | `global.proxyInit.resources.memory.request` | Amount of memory that the proxy-init container requests                                                                                                                               | `10Mi`                               |
 | `global.proxyInjectAnnotation`              | Annotation label to signal injection. Do not edit.                                                                                                                                    |                                      |
 | `global.proxyInjectDisabled`                | Annotation value to disable injection. Do not edit.                                                                                                                                   | `disabled`                           |
-| `grafanaImage`                              | Docker image for the Grafana container                                                                                                                                                | `gcr.io/linkerd-io/grafana`          |
-| `grafanaResources`                          | CPU and Memory resources required by grafana (see `global.proxy.resources` for sub-fields)             |   |
 | `heartbeatSchedule`                         | Config for the heartbeat cronjob                                                                                                                                                      | `0 0 * * *`                          |
 | `identity.issuer.clockSkewAllowance`        | Amount of time to allow for clock skew within a Linkerd cluster                                                                                                                       | `20s`                                |
 | `identity.issuer.crtExpiry`                 | Expiration timestamp for the issuer certificate. It must be provided during install                                                                                                   |                                      |
@@ -201,8 +199,8 @@ The following table lists the configurable parameters for the Grafana Add-On.
 | Parameter                             | Description                                                                                                                                                                           | Default                              |
 |:--------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------|
 | `grafana.enabled`                     | Flag to enable grafana instance to be installed                                                                                                                                                | `true`
-| `grafana.name`                | Name of the grafana instance Service                                                                                                                                                 | `linkerd-grafana`                             |
 | `grafana.image.name`                | Docker image name for the grafana instance                                                                                                                                                 | `gcr.io/linkerd-io/grafana`                             |
+| `grafana.image.tag`                | Docker image tag for the grafana instance                                                                                                                                                 | latest version                              |
 | `grafana.resources.cpu.limit`       | Maximum amount of CPU units that the grafana container can use                                                                                                                     ||
 | `grafana.resources.cpu.request`     | Amount of CPU units that the gafana container requests                                                                                                                            ||
 | `grafana.resources.memory.limit`    | Maximum amount of memory that grafana container can use                                                                                                                        ||
diff --git a/charts/linkerd2/templates/_config.tpl b/charts/linkerd2/templates/_config.tpl
index 7da034e01..bcac0a960 100644
--- a/charts/linkerd2/templates/_config.tpl
+++ b/charts/linkerd2/templates/_config.tpl
@@ -73,6 +73,10 @@
 {{- define "linkerd.configs.install" -}}
 {
   "cliVersion":"{{ .Values.global.linkerdVersion }}",
-  "flags":[]
+  "flags":[
+  {{- if .Values.disableHeartBeat -}}
+  {"name": "disable-heartbeat", "value": "true"}
+  {{- end -}}
+  ]
 }
 {{- end -}}
diff --git a/charts/linkerd2/templates/psp.yaml b/charts/linkerd2/templates/psp.yaml
index 31162dc0f..423cddc25 100644
--- a/charts/linkerd2/templates/psp.yaml
+++ b/charts/linkerd2/templates/psp.yaml
@@ -92,7 +92,7 @@ subjects:
   namespace: {{.Values.global.namespace}}
 {{ if .Values.grafana.enabled -}}
 - kind: ServiceAccount
-  name: {{.Values.grafana.name}}
+  name: linkerd-grafana
   namespace: {{.Values.global.namespace}}
 {{ end -}}
 {{ if not .Values.disableHeartBeat -}}
diff --git a/charts/linkerd2/templates/web.yaml b/charts/linkerd2/templates/web.yaml
index 01b2c05d6..6604fdd67 100644
--- a/charts/linkerd2/templates/web.yaml
+++ b/charts/linkerd2/templates/web.yaml
@@ -69,7 +69,7 @@ spec:
         {{- if .Values.global.grafanaUrl }}
         - -grafana-addr={{.Values.global.grafanaUrl}}
         {{- else if .Values.grafana.enabled }}
-        - -grafana-addr={{.Values.grafana.name}}.{{.Values.global.namespace}}.svc.{{.Values.global.clusterDomain}}:3000
+        - -grafana-addr=linkerd-grafana.{{.Values.global.namespace}}.svc.{{.Values.global.clusterDomain}}:3000
         {{- end}}
         {{- if .Values.tracing.enabled }}
         - -jaeger-addr={{.Values.tracing.jaeger.name}}.{{.Values.global.namespace}}.svc.{{.Values.global.clusterDomain}}:16686
@@ -110,7 +110,7 @@ spec:
         volumeMounts:
         - mountPath: /var/run/linkerd/config
           name: config
-      {{- $tree := deepCopy . }}      
+      {{- $tree := deepCopy . }}
       {{- if not (empty .Values.webProxyResources) }}
       {{- $r := merge .Values.webProxyResources .Values.global.proxy.resources }}
       {{- $_ := set $tree.Values.global.proxy "resources" $r }}
diff --git a/charts/linkerd2/values.yaml b/charts/linkerd2/values.yaml
index 4580f22f3..aad891c03 100644
--- a/charts/linkerd2/values.yaml
+++ b/charts/linkerd2/values.yaml
@@ -258,9 +258,9 @@ smiMetrics:
 
 grafana:
   enabled: true
-  name: linkerd-grafana
-  image:
-    name: gcr.io/linkerd-io/grafana
+  # image:
+  #   name: gcr.io/linkerd-io/grafana
+  #   tag: latest
   # set resource requests and limits for grafana and its linkerd proxy respectively
   # see global.proxy.resources in the linkerd2 chart for details.
   # resources:
diff --git a/cli/Dockerfile-bin b/cli/Dockerfile-bin
index 841d4e157..44aae6081 100644
--- a/cli/Dockerfile-bin
+++ b/cli/Dockerfile-bin
@@ -1,4 +1,5 @@
 ARG BUILDPLATFORM=linux/amd64
+ARG BUILD_STAGE=single-arch
 
 # Precompile key slow-to-build dependencies
 FROM --platform=$BUILDPLATFORM golang:1.14.2-alpine as go-deps
@@ -6,11 +7,10 @@ WORKDIR /linkerd-build
 COPY go.mod go.sum ./
 COPY bin/install-deps bin/
 RUN go mod download
-ARG TARGETARCH
-RUN ./bin/install-deps $TARGETARCH
+RUN ./bin/install-deps
 
 ## compile binaries
-FROM go-deps as golang
+FROM go-deps as golang-single-arch
 WORKDIR /linkerd-build
 COPY cli cli
 COPY charts charts
@@ -26,21 +26,32 @@ RUN mkdir -p /out
 RUN go generate -mod=readonly ./pkg/charts/static
 
 # Cache builds without version info
-ARG TARGETARCH
 RUN CGO_ENABLED=0 GOOS=darwin go build -o /out/linkerd-darwin -tags prod -mod=readonly -ldflags "-s -w" ./cli
-RUN CGO_ENABLED=0 GOOS=linux GOARCH=$TARGETARCH go build -o /out/linkerd-linux -tags prod -mod=readonly -ldflags "-s -w" ./cli
+RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /out/linkerd-linux-amd64 -tags prod -mod=readonly -ldflags "-s -w" ./cli
 RUN CGO_ENABLED=0 GOOS=windows go build -o /out/linkerd-windows -tags prod -mod=readonly -ldflags "-s -w" ./cli
 
 ARG LINKERD_VERSION
 ENV GO_LDFLAGS="-s -w -X github.com/linkerd/linkerd2/pkg/version.Version=${LINKERD_VERSION}"
 RUN CGO_ENABLED=0 GOOS=darwin go build -o /out/linkerd-darwin -tags prod -mod=readonly -ldflags "${GO_LDFLAGS}" ./cli
-RUN CGO_ENABLED=0 GOOS=linux GOARCH=$TARGETARCH go build -o /out/linkerd-linux -tags prod -mod=readonly -ldflags "${GO_LDFLAGS}" ./cli
+RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /out/linkerd-linux-amd64 -tags prod -mod=readonly -ldflags "${GO_LDFLAGS}" ./cli
 RUN CGO_ENABLED=0 GOOS=windows go build -o /out/linkerd-windows -tags prod -mod=readonly -ldflags "${GO_LDFLAGS}" ./cli
 
+FROM golang-single-arch as golang-multi-arch
+RUN ./bin/install-deps arm64
+RUN ./bin/install-deps arm
+RUN CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o /out/linkerd-linux-arm64 -tags prod -mod=readonly -ldflags "-s -w" ./cli
+RUN CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -o /out/linkerd-linux-arm -tags prod -mod=readonly -ldflags "-s -w" ./cli
+ARG LINKERD_VERSION
+ENV GO_LDFLAGS="-s -w -X github.com/linkerd/linkerd2/pkg/version.Version=${LINKERD_VERSION}"
+RUN CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o /out/linkerd-linux-arm64 -tags prod -mod=readonly -ldflags "${GO_LDFLAGS}" ./cli
+RUN CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -o /out/linkerd-linux-arm -tags prod -mod=readonly -ldflags "${GO_LDFLAGS}" ./cli
+
+FROM golang-${BUILD_STAGE} as golang
+
 ## export without sources & dependencies
 FROM scratch
 COPY LICENSE /linkerd/LICENSE
 COPY --from=golang /out /out
 # `ENTRYPOINT` prevents `docker build` from otherwise failing with "Error
 # response from daemon: No command specified."
-ENTRYPOINT ["/out/linkerd-linux"]
+ENTRYPOINT ["/out/linkerd-linux-amd64"]
diff --git a/cli/cmd/install.go b/cli/cmd/install.go
index 7c48ffea2..c1346d0a7 100644
--- a/cli/cmd/install.go
+++ b/cli/cmd/install.go
@@ -783,7 +783,6 @@ func (options *installOptions) buildValuesWithoutIdentity(configs *pb.All) (*l5d
 	installValues.EnablePodAntiAffinity = options.highAvailability
 	installValues.Global.HighAvailability = options.highAvailability
 	installValues.Global.ImagePullPolicy = options.imagePullPolicy
-	installValues.Grafana["image"].(map[string]interface{})["name"] = fmt.Sprintf("%s/grafana", options.dockerRegistry)
 	installValues.Global.Namespace = controlPlaneNamespace
 	installValues.Global.CNIEnabled = options.cniEnabled
 	installValues.Global.EnableEndpointSlices = options.enableEndpointSlices
@@ -792,6 +791,12 @@ func (options *installOptions) buildValuesWithoutIdentity(configs *pb.All) (*l5d
 	installValues.RestrictDashboardPrivileges = options.restrictDashboardPrivileges
 	installValues.DisableHeartBeat = options.disableHeartbeat
 	installValues.WebImage = fmt.Sprintf("%s/web", options.dockerRegistry)
+	if options.dockerRegistry != "gcr.io/linkerd-io" {
+		if installValues.Grafana["image"] == nil {
+			installValues.Grafana["image"] = map[string]interface{}{}
+		}
+		installValues.Grafana["image"].(map[string]interface{})["name"] = fmt.Sprintf("%s/grafana", options.dockerRegistry)
+	}
 	installValues.SMIMetrics.Image = options.smiMetricsImage
 	installValues.SMIMetrics.Enabled = options.smiMetricsEnabled
 
diff --git a/cli/cmd/root.go b/cli/cmd/root.go
index 68303e4b7..524d97c25 100644
--- a/cli/cmd/root.go
+++ b/cli/cmd/root.go
@@ -207,7 +207,8 @@ func getDefaultNamespace() string {
 	ns, _, err := kubeCfg.Namespace()
 
 	if err != nil {
-		log.Errorf("could not set namespace from kubectl context: ensure a valid KUBECONFIG path has been set")
+		log.Warnf(`could not set namespace from kubectl context, using 'default' namespace: %s
+		 ensure the KUBECONFIG path %s is valid`, err, kubeconfigPath)
 		return corev1.NamespaceDefault
 	}
 
diff --git a/pkg/healthcheck/healthcheck_addons.go b/pkg/healthcheck/healthcheck_addons.go
index a4dac3722..c426abb91 100644
--- a/pkg/healthcheck/healthcheck_addons.go
+++ b/pkg/healthcheck/healthcheck_addons.go
@@ -26,6 +26,9 @@ const (
 )
 
 var (
+	// errorKeyNotFound is returned when a key is not found in data
+	errorKeyNotFound error = errors.New("key not found")
+
 	// AddOnCategories is the list of add-on category checks
 	AddOnCategories = []CategoryID{LinkerdAddOnChecks, LinkerdPrometheusAddOnChecks, LinkerdGrafanaAddOnChecks, LinkerdTracingAddOnChecks}
 )
@@ -101,9 +104,15 @@ func (hc *HealthChecker) addOnCategories() []category {
 					check: func(context.Context) error {
 						if grafana, ok := hc.addOns[l5dcharts.GrafanaAddOn]; ok {
 							name, err := getString(grafana, "name")
-							if err != nil {
+							if err != nil && !errors.Is(err, errorKeyNotFound) {
 								return err
 							}
+
+							if errors.Is(err, errorKeyNotFound) {
+								// default name of grafana instance
+								name = "linkerd-grafana"
+							}
+
 							return hc.checkServiceAccounts([]string{name}, hc.ControlPlaneNamespace, "")
 						}
 						return &SkipError{Reason: "grafana add-on not enabled"}
@@ -115,9 +124,15 @@ func (hc *HealthChecker) addOnCategories() []category {
 					check: func(context.Context) error {
 						if grafana, ok := hc.addOns[l5dcharts.GrafanaAddOn]; ok {
 							name, err := getString(grafana, "name")
-							if err != nil {
+							if err != nil && !errors.Is(err, errorKeyNotFound) {
 								return err
 							}
+
+							if errors.Is(err, errorKeyNotFound) {
+								// default name of grafana instance
+								name = "linkerd-grafana"
+							}
+
 							_, err = hc.kubeAPI.CoreV1().ConfigMaps(hc.ControlPlaneNamespace).Get(fmt.Sprintf("%s-config", name), metav1.GetOptions{})
 							if err != nil {
 								return err
@@ -316,7 +331,7 @@ func getString(i interface{}, k string) (string, error) {
 
 	v, ok := m[k]
 	if !ok {
-		return "", fmt.Errorf("key '%s' not found in config value", k)
+		return "", errorKeyNotFound
 	}
 
 	res, ok := v.(string)


Test patch:
diff --git a/cli/cmd/testdata/grafana_overwrite.yaml b/cli/cmd/testdata/grafana_overwrite.yaml
index c8547f72a..407020760 100644
--- a/cli/cmd/testdata/grafana_overwrite.yaml
+++ b/cli/cmd/testdata/grafana_overwrite.yaml
@@ -1,5 +1,5 @@
 grafana:
   enabled: true
-  name: linkerd-grafana-overwrite
   image:
     name: linkerd-image-overwrite
+    tag: image-tag-overwrite
diff --git a/cli/cmd/testdata/install_addon_control-plane.golden b/cli/cmd/testdata/install_addon_control-plane.golden
index 5752d3f85..be2cd7fef 100644
--- a/cli/cmd/testdata/install_addon_control-plane.golden
+++ b/cli/cmd/testdata/install_addon_control-plane.golden
@@ -1756,9 +1756,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/install_control-plane.golden b/cli/cmd/testdata/install_control-plane.golden
index 69b03ed55..fbbabfe16 100644
--- a/cli/cmd/testdata/install_control-plane.golden
+++ b/cli/cmd/testdata/install_control-plane.golden
@@ -1755,9 +1755,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/install_controlplane_tracing_output.golden b/cli/cmd/testdata/install_controlplane_tracing_output.golden
index 4e7f31373..de406e8ed 100644
--- a/cli/cmd/testdata/install_controlplane_tracing_output.golden
+++ b/cli/cmd/testdata/install_controlplane_tracing_output.golden
@@ -2647,9 +2647,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/install_custom_registry.golden b/cli/cmd/testdata/install_custom_registry.golden
index 8f98ffcc3..2c26e94d6 100644
--- a/cli/cmd/testdata/install_custom_registry.golden
+++ b/cli/cmd/testdata/install_custom_registry.golden
@@ -2546,7 +2546,6 @@ data:
       enabled: true
       image:
         name: my.custom.registry/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/install_default.golden b/cli/cmd/testdata/install_default.golden
index 00de5a42f..9d5de84d0 100644
--- a/cli/cmd/testdata/install_default.golden
+++ b/cli/cmd/testdata/install_default.golden
@@ -2544,9 +2544,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/install_default_override_dst_get_nets.golden b/cli/cmd/testdata/install_default_override_dst_get_nets.golden
index ef0abf5cd..bf9e93b7c 100644
--- a/cli/cmd/testdata/install_default_override_dst_get_nets.golden
+++ b/cli/cmd/testdata/install_default_override_dst_get_nets.golden
@@ -2544,9 +2544,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/install_ha_output.golden b/cli/cmd/testdata/install_ha_output.golden
index 7ed49e2ec..c87d47a5a 100644
--- a/cli/cmd/testdata/install_ha_output.golden
+++ b/cli/cmd/testdata/install_ha_output.golden
@@ -2780,9 +2780,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
       resources:
         cpu:
           limit: "1"
diff --git a/cli/cmd/testdata/install_ha_with_overrides_output.golden b/cli/cmd/testdata/install_ha_with_overrides_output.golden
index f6766f7fd..52842fe3f 100644
--- a/cli/cmd/testdata/install_ha_with_overrides_output.golden
+++ b/cli/cmd/testdata/install_ha_with_overrides_output.golden
@@ -2780,9 +2780,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
       resources:
         cpu:
           limit: "1"
diff --git a/cli/cmd/testdata/install_heartbeat_disabled_output.golden b/cli/cmd/testdata/install_heartbeat_disabled_output.golden
index 18e318c61..37a4f71d5 100644
--- a/cli/cmd/testdata/install_heartbeat_disabled_output.golden
+++ b/cli/cmd/testdata/install_heartbeat_disabled_output.golden
@@ -2455,9 +2455,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/install_helm_output.golden b/cli/cmd/testdata/install_helm_output.golden
index b0537e550..eab5f7c95 100644
--- a/cli/cmd/testdata/install_helm_output.golden
+++ b/cli/cmd/testdata/install_helm_output.golden
@@ -2597,7 +2597,6 @@ data:
       enabled: true
       image:
         name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       args:
         config.file: /etc/prometheus/prometheus.yml
diff --git a/cli/cmd/testdata/install_helm_output_addons.golden b/cli/cmd/testdata/install_helm_output_addons.golden
index a5c2e73ec..1e1e67f58 100644
--- a/cli/cmd/testdata/install_helm_output_addons.golden
+++ b/cli/cmd/testdata/install_helm_output_addons.golden
@@ -2598,7 +2598,6 @@ data:
       enabled: true
       image:
         name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       args:
         config.file: /etc/prometheus/prometheus.yml
diff --git a/cli/cmd/testdata/install_helm_output_ha.golden b/cli/cmd/testdata/install_helm_output_ha.golden
index 872071248..d3dadd5a3 100644
--- a/cli/cmd/testdata/install_helm_output_ha.golden
+++ b/cli/cmd/testdata/install_helm_output_ha.golden
@@ -2833,7 +2833,6 @@ data:
       enabled: true
       image:
         name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
       resources:
         cpu:
           limit: "1"
diff --git a/cli/cmd/testdata/install_no_init_container.golden b/cli/cmd/testdata/install_no_init_container.golden
index ba57046c1..43329d5fb 100644
--- a/cli/cmd/testdata/install_no_init_container.golden
+++ b/cli/cmd/testdata/install_no_init_container.golden
@@ -2275,9 +2275,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/install_output.golden b/cli/cmd/testdata/install_output.golden
index 33fbf5395..970839f68 100644
--- a/cli/cmd/testdata/install_output.golden
+++ b/cli/cmd/testdata/install_output.golden
@@ -2509,9 +2509,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
       image: PrometheusImage
diff --git a/cli/cmd/testdata/install_prometheus_overwrite.golden b/cli/cmd/testdata/install_prometheus_overwrite.golden
index fdb695ad0..fd4f4e5bc 100644
--- a/cli/cmd/testdata/install_prometheus_overwrite.golden
+++ b/cli/cmd/testdata/install_prometheus_overwrite.golden
@@ -2544,9 +2544,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       alertManagers:
       - scheme: http
diff --git a/cli/cmd/testdata/install_proxy_ignores.golden b/cli/cmd/testdata/install_proxy_ignores.golden
index d9bc21867..c1e6a80ea 100644
--- a/cli/cmd/testdata/install_proxy_ignores.golden
+++ b/cli/cmd/testdata/install_proxy_ignores.golden
@@ -2544,9 +2544,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/install_restricted_dashboard.golden b/cli/cmd/testdata/install_restricted_dashboard.golden
index b62364164..f802be1c1 100644
--- a/cli/cmd/testdata/install_restricted_dashboard.golden
+++ b/cli/cmd/testdata/install_restricted_dashboard.golden
@@ -2476,9 +2476,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/install_tracing.golden b/cli/cmd/testdata/install_tracing.golden
index f5a82e8e0..f19daffbc 100644
--- a/cli/cmd/testdata/install_tracing.golden
+++ b/cli/cmd/testdata/install_tracing.golden
@@ -2545,9 +2545,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/install_tracing_overwrite.golden b/cli/cmd/testdata/install_tracing_overwrite.golden
index 0ad9a76f4..28fc82063 100644
--- a/cli/cmd/testdata/install_tracing_overwrite.golden
+++ b/cli/cmd/testdata/install_tracing_overwrite.golden
@@ -2545,9 +2545,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_add-on_controlplane.golden b/cli/cmd/testdata/upgrade_add-on_controlplane.golden
index 26547cee2..91f65efee 100644
--- a/cli/cmd/testdata/upgrade_add-on_controlplane.golden
+++ b/cli/cmd/testdata/upgrade_add-on_controlplane.golden
@@ -1770,9 +1770,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_add-on_overwrite.golden b/cli/cmd/testdata/upgrade_add-on_overwrite.golden
index fa91dedd2..6676580f2 100644
--- a/cli/cmd/testdata/upgrade_add-on_overwrite.golden
+++ b/cli/cmd/testdata/upgrade_add-on_overwrite.golden
@@ -2559,9 +2559,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_add_add-on.golden b/cli/cmd/testdata/upgrade_add_add-on.golden
index f4cb075b8..959d361a5 100644
--- a/cli/cmd/testdata/upgrade_add_add-on.golden
+++ b/cli/cmd/testdata/upgrade_add_add-on.golden
@@ -2559,9 +2559,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_default.golden b/cli/cmd/testdata/upgrade_default.golden
index 3757d3700..a5aee941d 100644
--- a/cli/cmd/testdata/upgrade_default.golden
+++ b/cli/cmd/testdata/upgrade_default.golden
@@ -2558,9 +2558,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_external_issuer.golden b/cli/cmd/testdata/upgrade_external_issuer.golden
index c429ff68f..ba14b75e8 100644
--- a/cli/cmd/testdata/upgrade_external_issuer.golden
+++ b/cli/cmd/testdata/upgrade_external_issuer.golden
@@ -2544,9 +2544,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_grafana_addon_overwrite.yaml b/cli/cmd/testdata/upgrade_grafana_addon_overwrite.yaml
index 28df97f8a..e97f4275b 100644
--- a/cli/cmd/testdata/upgrade_grafana_addon_overwrite.yaml
+++ b/cli/cmd/testdata/upgrade_grafana_addon_overwrite.yaml
@@ -2558,9 +2558,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_grafana_enabled.yaml b/cli/cmd/testdata/upgrade_grafana_enabled.yaml
index 28df97f8a..e97f4275b 100644
--- a/cli/cmd/testdata/upgrade_grafana_enabled.yaml
+++ b/cli/cmd/testdata/upgrade_grafana_enabled.yaml
@@ -2558,9 +2558,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_grafana_overwrite.yaml b/cli/cmd/testdata/upgrade_grafana_overwrite.yaml
index 63bdca38b..299074c25 100644
--- a/cli/cmd/testdata/upgrade_grafana_overwrite.yaml
+++ b/cli/cmd/testdata/upgrade_grafana_overwrite.yaml
@@ -763,7 +763,7 @@ subjects:
   name: linkerd-destination
   namespace: linkerd
 - kind: ServiceAccount
-  name: linkerd-grafana-overwrite
+  name: linkerd-grafana
   namespace: linkerd
 - kind: ServiceAccount
   name: linkerd-heartbeat
@@ -1643,7 +1643,7 @@ spec:
       containers:
       - args:
         - -api-addr=linkerd-controller-api.linkerd.svc.cluster.local:8085
-        - -grafana-addr=linkerd-grafana-overwrite.linkerd.svc.cluster.local:3000
+        - -grafana-addr=linkerd-grafana.linkerd.svc.cluster.local:3000
         - -controller-namespace=linkerd
         - -log-level=info
         - -enforced-host=^(localhost|127\.0\.0\.1|linkerd-web\.linkerd\.svc\.cluster\.local|linkerd-web\.linkerd\.svc|\[::1\])(:\d+)?$
@@ -2560,7 +2560,7 @@ data:
       enabled: true
       image:
         name: linkerd-image-overwrite
-      name: linkerd-grafana-overwrite
+        tag: image-tag-overwrite
     prometheus:
       enabled: true
     tracing:
@@ -2573,7 +2573,7 @@ data:
 kind: ServiceAccount
 apiVersion: v1
 metadata:
-  name: linkerd-grafana-overwrite
+  name: linkerd-grafana
   namespace: linkerd
   labels:
     linkerd.io/control-plane-component: grafana
@@ -2586,7 +2586,7 @@ metadata:
 kind: ConfigMap
 apiVersion: v1
 metadata:
-  name: linkerd-grafana-overwrite-config
+  name: linkerd-grafana-config
   namespace: linkerd
   labels:
     linkerd.io/control-plane-component: grafana
@@ -2595,7 +2595,7 @@ metadata:
     linkerd.io/created-by: linkerd/cli dev-undefined
 data:
   grafana.ini: |-
-    instance_name = linkerd-grafana-overwrite
+    instance_name = linkerd-grafana
 
     [server]
     root_url = %(protocol)s://%(domain)s:/grafana/
@@ -2646,7 +2646,7 @@ data:
 kind: Service
 apiVersion: v1
 metadata:
-  name: linkerd-grafana-overwrite
+  name: linkerd-grafana
   namespace: linkerd
   labels:
     linkerd.io/control-plane-component: grafana
@@ -2673,7 +2673,7 @@ metadata:
     app.kubernetes.io/version: UPGRADE-CONTROL-PLANE-VERSION
     linkerd.io/control-plane-component: grafana
     linkerd.io/control-plane-ns: linkerd
-  name: linkerd-grafana-overwrite
+  name: linkerd-grafana
   namespace: linkerd
 spec:
   replicas: 1
@@ -2681,7 +2681,7 @@ spec:
     matchLabels:
       linkerd.io/control-plane-component: grafana
       linkerd.io/control-plane-ns: linkerd
-      linkerd.io/proxy-deployment: linkerd-grafana-overwrite
+      linkerd.io/proxy-deployment: linkerd-grafana
   template:
     metadata:
       annotations:
@@ -2692,7 +2692,7 @@ spec:
         linkerd.io/control-plane-component: grafana
         linkerd.io/control-plane-ns: linkerd
         linkerd.io/workload-ns: linkerd
-        linkerd.io/proxy-deployment: linkerd-grafana-overwrite
+        linkerd.io/proxy-deployment: linkerd-grafana
     spec:
       nodeSelector:
         beta.kubernetes.io/os: linux
@@ -2704,7 +2704,7 @@ spec:
         # see https://github.com/grafana/grafana/issues/20096
         - name: GODEBUG
           value: netdns=go
-        image: linkerd-image-overwrite:UPGRADE-CONTROL-PLANE-VERSION
+        image: linkerd-image-overwrite:image-tag-overwrite
         imagePullPolicy: IfNotPresent
         livenessProbe:
           httpGet:
@@ -2866,7 +2866,7 @@ spec:
         volumeMounts:
         - mountPath: /run
           name: linkerd-proxy-init-xtables-lock
-      serviceAccountName: linkerd-grafana-overwrite
+      serviceAccountName: linkerd-grafana
       volumes:
       - emptyDir: {}
         name: data
@@ -2878,7 +2878,7 @@ spec:
             path: provisioning/datasources/datasources.yaml
           - key: dashboards.yaml
             path: provisioning/dashboards/dashboards.yaml
-          name: linkerd-grafana-overwrite-config
+          name: linkerd-grafana-config
         name: grafana-config
       - emptyDir: {}
         name: linkerd-proxy-init-xtables-lock
diff --git a/cli/cmd/testdata/upgrade_ha.golden b/cli/cmd/testdata/upgrade_ha.golden
index 2bcc14984..135499993 100644
--- a/cli/cmd/testdata/upgrade_ha.golden
+++ b/cli/cmd/testdata/upgrade_ha.golden
@@ -2794,9 +2794,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
       resources:
         cpu:
           limit: "1"
diff --git a/cli/cmd/testdata/upgrade_keep_webhook_cabundle.golden b/cli/cmd/testdata/upgrade_keep_webhook_cabundle.golden
index 2afe4939e..3ebd28cec 100644
--- a/cli/cmd/testdata/upgrade_keep_webhook_cabundle.golden
+++ b/cli/cmd/testdata/upgrade_keep_webhook_cabundle.golden
@@ -2558,9 +2558,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_nothing_addon.yaml b/cli/cmd/testdata/upgrade_nothing_addon.yaml
index 28df97f8a..e97f4275b 100644
--- a/cli/cmd/testdata/upgrade_nothing_addon.yaml
+++ b/cli/cmd/testdata/upgrade_nothing_addon.yaml
@@ -2558,9 +2558,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_overwrite_issuer.golden b/cli/cmd/testdata/upgrade_overwrite_issuer.golden
index e8bc57f70..8d378cdf6 100644
--- a/cli/cmd/testdata/upgrade_overwrite_issuer.golden
+++ b/cli/cmd/testdata/upgrade_overwrite_issuer.golden
@@ -2544,9 +2544,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_overwrite_trust_anchors-external-issuer.golden b/cli/cmd/testdata/upgrade_overwrite_trust_anchors-external-issuer.golden
index 06579ab8a..b2b4b1654 100644
--- a/cli/cmd/testdata/upgrade_overwrite_trust_anchors-external-issuer.golden
+++ b/cli/cmd/testdata/upgrade_overwrite_trust_anchors-external-issuer.golden
@@ -2530,9 +2530,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_overwrite_trust_anchors.golden b/cli/cmd/testdata/upgrade_overwrite_trust_anchors.golden
index e8bc57f70..8d378cdf6 100644
--- a/cli/cmd/testdata/upgrade_overwrite_trust_anchors.golden
+++ b/cli/cmd/testdata/upgrade_overwrite_trust_anchors.golden
@@ -2544,9 +2544,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/cli/cmd/testdata/upgrade_two_level_webhook_cert.golden b/cli/cmd/testdata/upgrade_two_level_webhook_cert.golden
index eef4893bf..20bd61e18 100644
--- a/cli/cmd/testdata/upgrade_two_level_webhook_cert.golden
+++ b/cli/cmd/testdata/upgrade_two_level_webhook_cert.golden
@@ -2558,9 +2558,6 @@ data:
       grafanaUrl: ""
     grafana:
       enabled: true
-      image:
-        name: gcr.io/linkerd-io/grafana
-      name: linkerd-grafana
     prometheus:
       enabled: true
     tracing:
diff --git a/pkg/charts/linkerd2/values_test.go b/pkg/charts/linkerd2/values_test.go
index 8590c9706..4a983ac66 100644
--- a/pkg/charts/linkerd2/values_test.go
+++ b/pkg/charts/linkerd2/values_test.go
@@ -138,10 +138,6 @@ func TestNewValues(t *testing.T) {
 		},
 		Grafana: Grafana{
 			"enabled": true,
-			"name":    "linkerd-grafana",
-			"image": map[string]interface{}{
-				"name": "gcr.io/linkerd-io/grafana",
-			},
 		},
 	}
 
@@ -191,10 +187,6 @@ func TestNewValues(t *testing.T) {
 
 		expected.Grafana = Grafana{
 			"enabled": true,
-			"name":    "linkerd-grafana",
-			"image": map[string]interface{}{
-				"name": "gcr.io/linkerd-io/grafana",
-			},
 			"resources": map[string]interface{}{
 				"cpu": map[string]interface{}{
 					"limit":   controllerResources.CPU.Limit,
diff --git a/pkg/healthcheck/healthcheck_test.go b/pkg/healthcheck/healthcheck_test.go
index 27635a42e..d53f2dff6 100644
--- a/pkg/healthcheck/healthcheck_test.go
+++ b/pkg/healthcheck/healthcheck_test.go
@@ -3292,7 +3292,7 @@ func TestGetString(t *testing.T) {
 			},
 			k:             "key1",
 			expected:      "",
-			expectedError: errors.New("key 'key1' not found in config value"),
+			expectedError: errorKeyNotFound,
 		},
 	}