Repository: linkerd/linkerd2
Pull request #11920 (2024-01-12 13:50:02)

policy: regenerate Server go bindings
`externalWorkloadSelector` has been added to the `Server` resource. To use it in our codebase, we need to upgrade the Golang bindings. This PR also updates all the versions of the Server resource to` v1beta2 `

 Signed-off-by: Zahari Dichev <zaharidichev@gmail.com>




Patch:
diff --git a/CHANGES.md b/CHANGES.md
index 2dbe08062..8c1833b89 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,43 @@
 # Changes
 
+## edge-24.1.1
+
+This edge release introduces a number of different fixes and improvements. More
+notably, it introduces a new `cni-repair-controller` binary to the CNI plugin
+image. The controller will automatically restart pods that have not received
+their iptables configuration.
+
+* Removed shortnames from Tap API resources to avoid colliding with existing
+  Kubernetes resources ([#11816]; fixes [#11784])
+* Introduced a new ExternalWorkload CRD to support upcoming mesh expansion
+  feature ([#11805])
+* Changed `MeshTLSAuthentication` resource validation to allow SPIFFE URI
+  identities ([#11882])
+* Introduced a new `cni-repair-controller` to the `linkerd-cni` DaemonSet to
+  automatically restart misconfigured pods that are missing iptables rules
+  ([#11699]; fixes [#11073])
+* Fixed a `"duplicate metrics"` warning in the multicluster service-mirror
+  component ([#11875]; fixes [#11839])
+* Added metric labels and weights to `linkerd diagnostics endpoints` json
+  output ([#11889])
+* Changed how `Server` updates are handled in the destination service. The
+  change will ensure that during a cluster resync, consumers won't be
+  overloaded by redundant updates ([#11907])
+* Changed `linkerd install` error output to add a newline when a Kubernetes
+  client cannot be successfully initialised ([#11917])
+
+[#11816]: https://github.com/linkerd/linkerd2/pull/11816
+[#11784]: https://github.com/linkerd/linkerd2/issues/11784
+[#11805]: https://github.com/linkerd/linkerd2/pull/11805
+[#11882]: https://github.com/linkerd/linkerd2/pull/11882
+[#11699]: https://github.com/linkerd/linkerd2/pull/11699
+[#11073]: https://github.com/linkerd/linkerd2/issues/11073
+[#11875]: https://github.com/linkerd/linkerd2/pull/11875
+[#11839]: https://github.com/linkerd/linkerd2/issues/11839
+[#11889]: https://github.com/linkerd/linkerd2/pull/11889
+[#11907]: https://github.com/linkerd/linkerd2/pull/11907
+[#11917]: https://github.com/linkerd/linkerd2/pull/11917
+
 ## edge-23.12.4
 
 This edge release includes fixes and improvements to the destination
diff --git a/charts/linkerd-control-plane/Chart.yaml b/charts/linkerd-control-plane/Chart.yaml
index b74a3d5a4..37f9a3a29 100644
--- a/charts/linkerd-control-plane/Chart.yaml
+++ b/charts/linkerd-control-plane/Chart.yaml
@@ -16,7 +16,7 @@ dependencies:
   - name: partials
     version: 0.1.0
     repository: file://../partials
-version: 1.18.3-edge
+version: 1.18.4-edge
 icon: https://linkerd.io/images/logo-only-200h.png
 maintainers:
   - name: Linkerd authors
diff --git a/charts/linkerd-control-plane/README.md b/charts/linkerd-control-plane/README.md
index 2fc82dcac..aacee978a 100644
--- a/charts/linkerd-control-plane/README.md
+++ b/charts/linkerd-control-plane/README.md
@@ -3,7 +3,7 @@
 Linkerd gives you observability, reliability, and security
 for your microservices — with no code change required.
 
-![Version: 1.18.3-edge](https://img.shields.io/badge/Version-1.18.3--edge-informational?style=flat-square)
+![Version: 1.18.4-edge](https://img.shields.io/badge/Version-1.18.4--edge-informational?style=flat-square)
 ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square)
 ![AppVersion: edge-XX.X.X](https://img.shields.io/badge/AppVersion-edge--XX.X.X-informational?style=flat-square)
 
diff --git a/charts/linkerd-control-plane/templates/destination.yaml b/charts/linkerd-control-plane/templates/destination.yaml
index d48a81a5c..5be29aed3 100644
--- a/charts/linkerd-control-plane/templates/destination.yaml
+++ b/charts/linkerd-control-plane/templates/destination.yaml
@@ -208,6 +208,10 @@ spec:
         {{- range (.Values.destinationController).experimentalArgs }}
         - {{ . }}
         {{- end }}
+        {{- with (.Values.destinationController).experimentalEnv }}
+        env:
+        {{- toYaml . | nindent 8 -}}
+        {{- end }}
         {{- include "partials.linkerd.trace" . | nindent 8 -}}
         image: {{.Values.controllerImage}}:{{.Values.controllerImageVersion | default .Values.linkerdVersion}}
         imagePullPolicy: {{.Values.imagePullPolicy}}
@@ -245,6 +249,10 @@ spec:
         - -log-level={{.Values.controllerLogLevel}}
         - -log-format={{.Values.controllerLogFormat}}
         - -enable-pprof={{.Values.enablePprof | default false}}
+        {{- with (.Values.spValidator).experimentalEnv }}
+        env:
+        {{- toYaml . | nindent 8 -}}
+        {{- end }}
         image: {{.Values.controllerImage}}:{{.Values.controllerImageVersion | default .Values.linkerdVersion}}
         imagePullPolicy: {{.Values.imagePullPolicy}}
         livenessProbe:
diff --git a/charts/linkerd-control-plane/templates/heartbeat.yaml b/charts/linkerd-control-plane/templates/heartbeat.yaml
index aa43874fb..8b3d1e1b9 100644
--- a/charts/linkerd-control-plane/templates/heartbeat.yaml
+++ b/charts/linkerd-control-plane/templates/heartbeat.yaml
@@ -59,6 +59,9 @@ spec:
             env:
             - name: LINKERD_DISABLED
               value: "the heartbeat controller does not use the proxy"
+            {{- with (.Values.heartbeat).experimentalEnv }}
+            {{- toYaml . | nindent 12 -}}
+            {{- end }}
             args:
             - "heartbeat"
             - "-controller-namespace={{.Release.Namespace}}"
diff --git a/charts/linkerd-control-plane/templates/identity.yaml b/charts/linkerd-control-plane/templates/identity.yaml
index 206a85d29..ae375f200 100644
--- a/charts/linkerd-control-plane/templates/identity.yaml
+++ b/charts/linkerd-control-plane/templates/identity.yaml
@@ -165,6 +165,9 @@ spec:
         env:
         - name: LINKERD_DISABLED
           value: "linkerd-await cannot block the identity controller"
+        {{- with (.Values.identity).experimentalEnv }}
+        {{- toYaml . | nindent 8 -}}
+        {{- end }}
         image: {{.Values.controllerImage}}:{{.Values.controllerImageVersion | default .Values.linkerdVersion}}
         imagePullPolicy: {{.Values.imagePullPolicy}}
         livenessProbe:
diff --git a/charts/linkerd-control-plane/templates/proxy-injector.yaml b/charts/linkerd-control-plane/templates/proxy-injector.yaml
index 4fd044d65..8837af9bd 100644
--- a/charts/linkerd-control-plane/templates/proxy-injector.yaml
+++ b/charts/linkerd-control-plane/templates/proxy-injector.yaml
@@ -79,6 +79,10 @@ spec:
         - -log-format={{.Values.controllerLogFormat}}
         - -linkerd-namespace={{.Release.Namespace}}
         - -enable-pprof={{.Values.enablePprof | default false}}
+        {{- with (.Values.proxyInjector).experimentalEnv }}
+        env:
+        {{- toYaml . | nindent 8 -}}
+        {{- end }}
         image: {{.Values.controllerImage}}:{{.Values.controllerImageVersion | default .Values.linkerdVersion}}
         imagePullPolicy: {{.Values.imagePullPolicy}}
         livenessProbe:
diff --git a/charts/linkerd-crds/Chart.yaml b/charts/linkerd-crds/Chart.yaml
index 2afe5bc43..9a775f280 100644
--- a/charts/linkerd-crds/Chart.yaml
+++ b/charts/linkerd-crds/Chart.yaml
@@ -5,16 +5,16 @@ description: |
 type: application
 home: https://linkerd.io
 keywords:
-- service-mesh
+  - service-mesh
 kubeVersion: ">=1.22.0-0"
 name: "linkerd-crds"
 sources:
-- https://github.com/linkerd/linkerd2/
+  - https://github.com/linkerd/linkerd2/
 dependencies:
-- name: partials
-  version: 0.1.0
-  repository: file://../partials
-version: 1.9.1-edge
+  - name: partials
+    version: 0.1.0
+    repository: file://../partials
+version: 1.9.2-edge
 icon: https://linkerd.io/images/logo-only-200h.png
 maintainers:
   - name: Linkerd authors
diff --git a/charts/linkerd-crds/README.md b/charts/linkerd-crds/README.md
index 3ae5c0253..32a396040 100644
--- a/charts/linkerd-crds/README.md
+++ b/charts/linkerd-crds/README.md
@@ -3,7 +3,7 @@
 Linkerd gives you observability, reliability, and security
 for your microservices — with no code change required.
 
-![Version: 1.9.1-edge](https://img.shields.io/badge/Version-1.9.1--edge-informational?style=flat-square)
+![Version: 1.9.2-edge](https://img.shields.io/badge/Version-1.9.2--edge-informational?style=flat-square)
 ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square)
 
 **Homepage:** <https://linkerd.io>
diff --git a/charts/linkerd2-cni/Chart.yaml b/charts/linkerd2-cni/Chart.yaml
index fb14287f4..53b2ac034 100644
--- a/charts/linkerd2-cni/Chart.yaml
+++ b/charts/linkerd2-cni/Chart.yaml
@@ -9,4 +9,4 @@ description: |
 kubeVersion: ">=1.22.0-0"
 icon: https://linkerd.io/images/logo-only-200h.png
 name: "linkerd2-cni"
-version: 30.13.2-edge
+version: 30.13.3-edge
diff --git a/charts/linkerd2-cni/README.md b/charts/linkerd2-cni/README.md
index e24dc6e31..7b55d2f96 100644
--- a/charts/linkerd2-cni/README.md
+++ b/charts/linkerd2-cni/README.md
@@ -6,7 +6,7 @@ Linkerd [CNI plugin](https://linkerd.io/2/features/cni/) takes care of setting
 up your pod's network so  incoming and outgoing traffic is proxied through the
 data plane.
 
-![Version: 30.13.2-edge](https://img.shields.io/badge/Version-30.13.2--edge-informational?style=flat-square)
+![Version: 30.13.3-edge](https://img.shields.io/badge/Version-30.13.3--edge-informational?style=flat-square)
 
 ![AppVersion: edge-XX.X.X](https://img.shields.io/badge/AppVersion-edge--XX.X.X-informational?style=flat-square)
 
diff --git a/cli/cmd/install.go b/cli/cmd/install.go
index 1b4a2670d..4f968015e 100644
--- a/cli/cmd/install.go
+++ b/cli/cmd/install.go
@@ -59,7 +59,7 @@ var (
 		"templates/workload/external-workload.yaml",
 	}
 
-	templatesControlPlane = []string{
+	TemplatesControlPlane = []string{
 		"templates/namespace.yaml",
 		"templates/identity-rbac.yaml",
 		"templates/destination-rbac.yaml",
@@ -365,7 +365,7 @@ func renderControlPlane(w io.Writer, values *l5dcharts.Values, valuesOverrides m
 	files := []*loader.BufferedFile{
 		{Name: chartutil.ChartfileName},
 	}
-	for _, template := range templatesControlPlane {
+	for _, template := range TemplatesControlPlane {
 		files = append(files, &loader.BufferedFile{Name: template})
 	}
 	if err := charts.FilesReader(static.Templates, l5dcharts.HelmChartDirCP+"/", files); err != nil {
diff --git a/controller/api/destination/watcher/endpoints_watcher.go b/controller/api/destination/watcher/endpoints_watcher.go
index 7ac2996a8..6fefdccc9 100644
--- a/controller/api/destination/watcher/endpoints_watcher.go
+++ b/controller/api/destination/watcher/endpoints_watcher.go
@@ -10,7 +10,7 @@ import (
 	"sync"
 	"time"
 
-	"github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	"github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	"github.com/linkerd/linkerd2/controller/k8s"
 	consts "github.com/linkerd/linkerd2/pkg/k8s"
 	"github.com/prometheus/client_golang/prometheus"
@@ -506,15 +506,15 @@ func (ew *EndpointsWatcher) getServicePublisher(id ServiceID) (sp *servicePublis
 func (ew *EndpointsWatcher) addServer(obj interface{}) {
 	ew.Lock()
 	defer ew.Unlock()
-	server := obj.(*v1beta1.Server)
+	server := obj.(*v1beta2.Server)
 	for _, sp := range ew.publishers {
 		sp.updateServer(server, true)
 	}
 }
 
 func (ew *EndpointsWatcher) updateServer(oldObj interface{}, newObj interface{}) {
-	oldServer := oldObj.(*v1beta1.Server)
-	newServer := newObj.(*v1beta1.Server)
+	oldServer := oldObj.(*v1beta2.Server)
+	newServer := newObj.(*v1beta2.Server)
 	oldUpdated := latestUpdated(oldServer.ManagedFields)
 	updated := latestUpdated(newServer.ManagedFields)
 	if !updated.IsZero() && updated != oldUpdated {
@@ -528,7 +528,7 @@ func (ew *EndpointsWatcher) updateServer(oldObj interface{}, newObj interface{})
 func (ew *EndpointsWatcher) deleteServer(obj interface{}) {
 	ew.Lock()
 	defer ew.Unlock()
-	server := obj.(*v1beta1.Server)
+	server := obj.(*v1beta2.Server)
 	for _, sp := range ew.publishers {
 		sp.updateServer(server, false)
 	}
@@ -700,7 +700,7 @@ func (sp *servicePublisher) metricsLabels(port Port, hostname string) prometheus
 	return endpointsLabels(sp.cluster, sp.id.Namespace, sp.id.Name, strconv.Itoa(int(port)), hostname)
 }
 
-func (sp *servicePublisher) updateServer(server *v1beta1.Server, isAdd bool) {
+func (sp *servicePublisher) updateServer(server *v1beta2.Server, isAdd bool) {
 	sp.Lock()
 	defer sp.Unlock()
 
@@ -1181,7 +1181,7 @@ func (pp *portPublisher) unsubscribe(listener EndpointUpdateListener) {
 	pp.metrics.setSubscribers(len(pp.listeners))
 }
 
-func (pp *portPublisher) updateServer(server *v1beta1.Server, selector labels.Selector, isAdd bool) {
+func (pp *portPublisher) updateServer(server *v1beta2.Server, selector labels.Selector, isAdd bool) {
 	updated := false
 	for id, address := range pp.addresses.Addresses {
 		if address.Pod != nil && selector.Matches(labels.Set(address.Pod.Labels)) {
diff --git a/controller/api/destination/watcher/pod_watcher.go b/controller/api/destination/watcher/pod_watcher.go
index e55f8e46d..382f0c25d 100644
--- a/controller/api/destination/watcher/pod_watcher.go
+++ b/controller/api/destination/watcher/pod_watcher.go
@@ -9,7 +9,7 @@ import (
 	"sync"
 	"time"
 
-	"github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	"github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	"github.com/linkerd/linkerd2/controller/k8s"
 	consts "github.com/linkerd/linkerd2/pkg/k8s"
 	"github.com/linkerd/linkerd2/pkg/util"
@@ -229,8 +229,8 @@ func (pw *PodWatcher) submitPodUpdate(pod *corev1.Pod, remove bool) {
 }
 
 func (pw *PodWatcher) updateServer(oldObj interface{}, newObj interface{}) {
-	oldServer := oldObj.(*v1beta1.Server)
-	newServer := newObj.(*v1beta1.Server)
+	oldServer := oldObj.(*v1beta2.Server)
+	newServer := newObj.(*v1beta2.Server)
 
 	oldUpdated := latestUpdated(oldServer.ManagedFields)
 	updated := latestUpdated(newServer.ManagedFields)
diff --git a/controller/gen/apis/server/v1beta1/doc.go b/controller/gen/apis/server/v1beta2/doc.go
similarity index 65%
rename from controller/gen/apis/server/v1beta1/doc.go
rename to controller/gen/apis/server/v1beta2/doc.go
index ffd023fe6..fe97a2b9a 100644
--- a/controller/gen/apis/server/v1beta1/doc.go
+++ b/controller/gen/apis/server/v1beta2/doc.go
@@ -1,3 +1,3 @@
 // +k8s:deepcopy-gen=package
 
-package v1beta1
+package v1beta2
diff --git a/controller/gen/apis/server/v1beta1/register.go b/controller/gen/apis/server/v1beta2/register.go
similarity index 97%
rename from controller/gen/apis/server/v1beta1/register.go
rename to controller/gen/apis/server/v1beta2/register.go
index 175a7ce81..7f40a0a42 100644
--- a/controller/gen/apis/server/v1beta1/register.go
+++ b/controller/gen/apis/server/v1beta2/register.go
@@ -1,4 +1,4 @@
-package v1beta1
+package v1beta2
 
 import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -13,7 +13,7 @@ var (
 	// of the group and the version of the API.
 	SchemeGroupVersion = schema.GroupVersion{
 		Group:   server.GroupName,
-		Version: "v1beta1",
+		Version: "v1beta2",
 	}
 
 	// SchemeBuilder collects functions that add things to a scheme. It's to
diff --git a/controller/gen/apis/server/v1beta1/types.go b/controller/gen/apis/server/v1beta2/types.go
similarity index 75%
rename from controller/gen/apis/server/v1beta1/types.go
rename to controller/gen/apis/server/v1beta2/types.go
index 5b5211deb..44768db32 100644
--- a/controller/gen/apis/server/v1beta1/types.go
+++ b/controller/gen/apis/server/v1beta2/types.go
@@ -1,4 +1,4 @@
-package v1beta1
+package v1beta2
 
 import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -29,9 +29,10 @@ type Server struct {
 
 // ServerSpec specifies a Server resource.
 type ServerSpec struct {
-	PodSelector   *metav1.LabelSelector `json:"podSelector"`
-	Port          intstr.IntOrString    `json:"port,omitempty"`
-	ProxyProtocol string                `json:"proxyProtocol,omitempty"`
+	PodSelector              *metav1.LabelSelector `json:"podSelector"`
+	ExternalWorkloadSelector *metav1.LabelSelector `json:"externalWorkloadSelector"`
+	Port                     intstr.IntOrString    `json:"port,omitempty"`
+	ProxyProtocol            string                `json:"proxyProtocol,omitempty"`
 }
 
 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
diff --git a/controller/gen/apis/server/v1beta1/zz_generated.deepcopy.go b/controller/gen/apis/server/v1beta2/zz_generated.deepcopy.go
similarity index 94%
rename from controller/gen/apis/server/v1beta1/zz_generated.deepcopy.go
rename to controller/gen/apis/server/v1beta2/zz_generated.deepcopy.go
index 9a6fa4257..5ffef4b58 100644
--- a/controller/gen/apis/server/v1beta1/zz_generated.deepcopy.go
+++ b/controller/gen/apis/server/v1beta2/zz_generated.deepcopy.go
@@ -19,7 +19,7 @@ limitations under the License.
 
 // Code generated by deepcopy-gen. DO NOT EDIT.
 
-package v1beta1
+package v1beta2
 
 import (
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -94,6 +94,11 @@ func (in *ServerSpec) DeepCopyInto(out *ServerSpec) {
 		*out = new(v1.LabelSelector)
 		(*in).DeepCopyInto(*out)
 	}
+	if in.ExternalWorkloadSelector != nil {
+		in, out := &in.ExternalWorkloadSelector, &out.ExternalWorkloadSelector
+		*out = new(v1.LabelSelector)
+		(*in).DeepCopyInto(*out)
+	}
 	out.Port = in.Port
 	return
 }
diff --git a/controller/gen/client/clientset/versioned/clientset.go b/controller/gen/client/clientset/versioned/clientset.go
index ae1460eb1..780e407eb 100644
--- a/controller/gen/client/clientset/versioned/clientset.go
+++ b/controller/gen/client/clientset/versioned/clientset.go
@@ -26,7 +26,7 @@ import (
 	linkv1alpha1 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/link/v1alpha1"
 	policyv1alpha1 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/policy/v1alpha1"
 	policyv1beta3 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/policy/v1beta3"
-	serverv1beta1 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/server/v1beta1"
+	serverv1beta2 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/server/v1beta2"
 	serverauthorizationv1beta1 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/serverauthorization/v1beta1"
 	linkerdv1alpha2 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/serviceprofile/v1alpha2"
 	discovery "k8s.io/client-go/discovery"
@@ -40,7 +40,7 @@ type Interface interface {
 	LinkV1alpha1() linkv1alpha1.LinkV1alpha1Interface
 	PolicyV1alpha1() policyv1alpha1.PolicyV1alpha1Interface
 	PolicyV1beta3() policyv1beta3.PolicyV1beta3Interface
-	ServerV1beta1() serverv1beta1.ServerV1beta1Interface
+	ServerV1beta2() serverv1beta2.ServerV1beta2Interface
 	ServerauthorizationV1beta1() serverauthorizationv1beta1.ServerauthorizationV1beta1Interface
 	LinkerdV1alpha2() linkerdv1alpha2.LinkerdV1alpha2Interface
 }
@@ -52,7 +52,7 @@ type Clientset struct {
 	linkV1alpha1               *linkv1alpha1.LinkV1alpha1Client
 	policyV1alpha1             *policyv1alpha1.PolicyV1alpha1Client
 	policyV1beta3              *policyv1beta3.PolicyV1beta3Client
-	serverV1beta1              *serverv1beta1.ServerV1beta1Client
+	serverV1beta2              *serverv1beta2.ServerV1beta2Client
 	serverauthorizationV1beta1 *serverauthorizationv1beta1.ServerauthorizationV1beta1Client
 	linkerdV1alpha2            *linkerdv1alpha2.LinkerdV1alpha2Client
 }
@@ -77,9 +77,9 @@ func (c *Clientset) PolicyV1beta3() policyv1beta3.PolicyV1beta3Interface {
 	return c.policyV1beta3
 }
 
-// ServerV1beta1 retrieves the ServerV1beta1Client
-func (c *Clientset) ServerV1beta1() serverv1beta1.ServerV1beta1Interface {
-	return c.serverV1beta1
+// ServerV1beta2 retrieves the ServerV1beta2Client
+func (c *Clientset) ServerV1beta2() serverv1beta2.ServerV1beta2Interface {
+	return c.serverV1beta2
 }
 
 // ServerauthorizationV1beta1 retrieves the ServerauthorizationV1beta1Client
@@ -152,7 +152,7 @@ func NewForConfigAndClient(c *rest.Config, httpClient *http.Client) (*Clientset,
 	if err != nil {
 		return nil, err
 	}
-	cs.serverV1beta1, err = serverv1beta1.NewForConfigAndClient(&configShallowCopy, httpClient)
+	cs.serverV1beta2, err = serverv1beta2.NewForConfigAndClient(&configShallowCopy, httpClient)
 	if err != nil {
 		return nil, err
 	}
@@ -189,7 +189,7 @@ func New(c rest.Interface) *Clientset {
 	cs.linkV1alpha1 = linkv1alpha1.New(c)
 	cs.policyV1alpha1 = policyv1alpha1.New(c)
 	cs.policyV1beta3 = policyv1beta3.New(c)
-	cs.serverV1beta1 = serverv1beta1.New(c)
+	cs.serverV1beta2 = serverv1beta2.New(c)
 	cs.serverauthorizationV1beta1 = serverauthorizationv1beta1.New(c)
 	cs.linkerdV1alpha2 = linkerdv1alpha2.New(c)
 
diff --git a/controller/gen/client/clientset/versioned/fake/clientset_generated.go b/controller/gen/client/clientset/versioned/fake/clientset_generated.go
index 3a7b8d51f..d74b11e6a 100644
--- a/controller/gen/client/clientset/versioned/fake/clientset_generated.go
+++ b/controller/gen/client/clientset/versioned/fake/clientset_generated.go
@@ -28,8 +28,8 @@ import (
 	fakepolicyv1alpha1 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/policy/v1alpha1/fake"
 	policyv1beta3 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/policy/v1beta3"
 	fakepolicyv1beta3 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/policy/v1beta3/fake"
-	serverv1beta1 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/server/v1beta1"
-	fakeserverv1beta1 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/server/v1beta1/fake"
+	serverv1beta2 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/server/v1beta2"
+	fakeserverv1beta2 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/server/v1beta2/fake"
 	serverauthorizationv1beta1 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/serverauthorization/v1beta1"
 	fakeserverauthorizationv1beta1 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/serverauthorization/v1beta1/fake"
 	linkerdv1alpha2 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/serviceprofile/v1alpha2"
@@ -111,9 +111,9 @@ func (c *Clientset) PolicyV1beta3() policyv1beta3.PolicyV1beta3Interface {
 	return &fakepolicyv1beta3.FakePolicyV1beta3{Fake: &c.Fake}
 }
 
-// ServerV1beta1 retrieves the ServerV1beta1Client
-func (c *Clientset) ServerV1beta1() serverv1beta1.ServerV1beta1Interface {
-	return &fakeserverv1beta1.FakeServerV1beta1{Fake: &c.Fake}
+// ServerV1beta2 retrieves the ServerV1beta2Client
+func (c *Clientset) ServerV1beta2() serverv1beta2.ServerV1beta2Interface {
+	return &fakeserverv1beta2.FakeServerV1beta2{Fake: &c.Fake}
 }
 
 // ServerauthorizationV1beta1 retrieves the ServerauthorizationV1beta1Client
diff --git a/controller/gen/client/clientset/versioned/fake/register.go b/controller/gen/client/clientset/versioned/fake/register.go
index 4271e8af8..a9ad313d5 100644
--- a/controller/gen/client/clientset/versioned/fake/register.go
+++ b/controller/gen/client/clientset/versioned/fake/register.go
@@ -23,7 +23,7 @@ import (
 	linkv1alpha1 "github.com/linkerd/linkerd2/controller/gen/apis/link/v1alpha1"
 	policyv1alpha1 "github.com/linkerd/linkerd2/controller/gen/apis/policy/v1alpha1"
 	policyv1beta3 "github.com/linkerd/linkerd2/controller/gen/apis/policy/v1beta3"
-	serverv1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	serverv1beta2 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	serverauthorizationv1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/serverauthorization/v1beta1"
 	linkerdv1alpha2 "github.com/linkerd/linkerd2/controller/gen/apis/serviceprofile/v1alpha2"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -41,7 +41,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{
 	linkv1alpha1.AddToScheme,
 	policyv1alpha1.AddToScheme,
 	policyv1beta3.AddToScheme,
-	serverv1beta1.AddToScheme,
+	serverv1beta2.AddToScheme,
 	serverauthorizationv1beta1.AddToScheme,
 	linkerdv1alpha2.AddToScheme,
 }
diff --git a/controller/gen/client/clientset/versioned/scheme/register.go b/controller/gen/client/clientset/versioned/scheme/register.go
index e266dcec9..6e1d9af68 100644
--- a/controller/gen/client/clientset/versioned/scheme/register.go
+++ b/controller/gen/client/clientset/versioned/scheme/register.go
@@ -23,7 +23,7 @@ import (
 	linkv1alpha1 "github.com/linkerd/linkerd2/controller/gen/apis/link/v1alpha1"
 	policyv1alpha1 "github.com/linkerd/linkerd2/controller/gen/apis/policy/v1alpha1"
 	policyv1beta3 "github.com/linkerd/linkerd2/controller/gen/apis/policy/v1beta3"
-	serverv1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	serverv1beta2 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	serverauthorizationv1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/serverauthorization/v1beta1"
 	linkerdv1alpha2 "github.com/linkerd/linkerd2/controller/gen/apis/serviceprofile/v1alpha2"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -41,7 +41,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{
 	linkv1alpha1.AddToScheme,
 	policyv1alpha1.AddToScheme,
 	policyv1beta3.AddToScheme,
-	serverv1beta1.AddToScheme,
+	serverv1beta2.AddToScheme,
 	serverauthorizationv1beta1.AddToScheme,
 	linkerdv1alpha2.AddToScheme,
 }
diff --git a/controller/gen/client/clientset/versioned/typed/server/v1beta1/doc.go b/controller/gen/client/clientset/versioned/typed/server/v1beta2/doc.go
similarity index 97%
rename from controller/gen/client/clientset/versioned/typed/server/v1beta1/doc.go
rename to controller/gen/client/clientset/versioned/typed/server/v1beta2/doc.go
index 771101956..56518ef7f 100644
--- a/controller/gen/client/clientset/versioned/typed/server/v1beta1/doc.go
+++ b/controller/gen/client/clientset/versioned/typed/server/v1beta2/doc.go
@@ -17,4 +17,4 @@ limitations under the License.
 // Code generated by client-gen. DO NOT EDIT.
 
 // This package has the automatically generated typed clients.
-package v1beta1
+package v1beta2
diff --git a/controller/gen/client/clientset/versioned/typed/server/v1beta1/fake/doc.go b/controller/gen/client/clientset/versioned/typed/server/v1beta2/fake/doc.go
similarity index 100%
rename from controller/gen/client/clientset/versioned/typed/server/v1beta1/fake/doc.go
rename to controller/gen/client/clientset/versioned/typed/server/v1beta2/fake/doc.go
diff --git a/controller/gen/client/clientset/versioned/typed/server/v1beta1/fake/fake_server.go b/controller/gen/client/clientset/versioned/typed/server/v1beta2/fake/fake_server.go
similarity index 77%
rename from controller/gen/client/clientset/versioned/typed/server/v1beta1/fake/fake_server.go
rename to controller/gen/client/clientset/versioned/typed/server/v1beta2/fake/fake_server.go
index c9199ab13..710bbecb5 100644
--- a/controller/gen/client/clientset/versioned/typed/server/v1beta1/fake/fake_server.go
+++ b/controller/gen/client/clientset/versioned/typed/server/v1beta2/fake/fake_server.go
@@ -21,7 +21,7 @@ package fake
 import (
 	"context"
 
-	v1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	v1beta2 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	labels "k8s.io/apimachinery/pkg/labels"
 	types "k8s.io/apimachinery/pkg/types"
@@ -31,29 +31,29 @@ import (
 
 // FakeServers implements ServerInterface
 type FakeServers struct {
-	Fake *FakeServerV1beta1
+	Fake *FakeServerV1beta2
 	ns   string
 }
 
-var serversResource = v1beta1.SchemeGroupVersion.WithResource("servers")
+var serversResource = v1beta2.SchemeGroupVersion.WithResource("servers")
 
-var serversKind = v1beta1.SchemeGroupVersion.WithKind("Server")
+var serversKind = v1beta2.SchemeGroupVersion.WithKind("Server")
 
 // Get takes name of the server, and returns the corresponding server object, and an error if there is any.
-func (c *FakeServers) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1beta1.Server, err error) {
+func (c *FakeServers) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1beta2.Server, err error) {
 	obj, err := c.Fake.
-		Invokes(testing.NewGetAction(serversResource, c.ns, name), &v1beta1.Server{})
+		Invokes(testing.NewGetAction(serversResource, c.ns, name), &v1beta2.Server{})
 
 	if obj == nil {
 		return nil, err
 	}
-	return obj.(*v1beta1.Server), err
+	return obj.(*v1beta2.Server), err
 }
 
 // List takes label and field selectors, and returns the list of Servers that match those selectors.
-func (c *FakeServers) List(ctx context.Context, opts v1.ListOptions) (result *v1beta1.ServerList, err error) {
+func (c *FakeServers) List(ctx context.Context, opts v1.ListOptions) (result *v1beta2.ServerList, err error) {
 	obj, err := c.Fake.
-		Invokes(testing.NewListAction(serversResource, serversKind, c.ns, opts), &v1beta1.ServerList{})
+		Invokes(testing.NewListAction(serversResource, serversKind, c.ns, opts), &v1beta2.ServerList{})
 
 	if obj == nil {
 		return nil, err
@@ -63,8 +63,8 @@ func (c *FakeServers) List(ctx context.Context, opts v1.ListOptions) (result *v1
 	if label == nil {
 		label = labels.Everything()
 	}
-	list := &v1beta1.ServerList{ListMeta: obj.(*v1beta1.ServerList).ListMeta}
-	for _, item := range obj.(*v1beta1.ServerList).Items {
+	list := &v1beta2.ServerList{ListMeta: obj.(*v1beta2.ServerList).ListMeta}
+	for _, item := range obj.(*v1beta2.ServerList).Items {
 		if label.Matches(labels.Set(item.Labels)) {
 			list.Items = append(list.Items, item)
 		}
@@ -80,31 +80,31 @@ func (c *FakeServers) Watch(ctx context.Context, opts v1.ListOptions) (watch.Int
 }
 
 // Create takes the representation of a server and creates it.  Returns the server's representation of the server, and an error, if there is any.
-func (c *FakeServers) Create(ctx context.Context, server *v1beta1.Server, opts v1.CreateOptions) (result *v1beta1.Server, err error) {
+func (c *FakeServers) Create(ctx context.Context, server *v1beta2.Server, opts v1.CreateOptions) (result *v1beta2.Server, err error) {
 	obj, err := c.Fake.
-		Invokes(testing.NewCreateAction(serversResource, c.ns, server), &v1beta1.Server{})
+		Invokes(testing.NewCreateAction(serversResource, c.ns, server), &v1beta2.Server{})
 
 	if obj == nil {
 		return nil, err
 	}
-	return obj.(*v1beta1.Server), err
+	return obj.(*v1beta2.Server), err
 }
 
 // Update takes the representation of a server and updates it. Returns the server's representation of the server, and an error, if there is any.
-func (c *FakeServers) Update(ctx context.Context, server *v1beta1.Server, opts v1.UpdateOptions) (result *v1beta1.Server, err error) {
+func (c *FakeServers) Update(ctx context.Context, server *v1beta2.Server, opts v1.UpdateOptions) (result *v1beta2.Server, err error) {
 	obj, err := c.Fake.
-		Invokes(testing.NewUpdateAction(serversResource, c.ns, server), &v1beta1.Server{})
+		Invokes(testing.NewUpdateAction(serversResource, c.ns, server), &v1beta2.Server{})
 
 	if obj == nil {
 		return nil, err
 	}
-	return obj.(*v1beta1.Server), err
+	return obj.(*v1beta2.Server), err
 }
 
 // Delete takes name of the server and deletes it. Returns an error if one occurs.
 func (c *FakeServers) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
 	_, err := c.Fake.
-		Invokes(testing.NewDeleteActionWithOptions(serversResource, c.ns, name, opts), &v1beta1.Server{})
+		Invokes(testing.NewDeleteActionWithOptions(serversResource, c.ns, name, opts), &v1beta2.Server{})
 
 	return err
 }
@@ -113,17 +113,17 @@ func (c *FakeServers) Delete(ctx context.Context, name string, opts v1.DeleteOpt
 func (c *FakeServers) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
 	action := testing.NewDeleteCollectionAction(serversResource, c.ns, listOpts)
 
-	_, err := c.Fake.Invokes(action, &v1beta1.ServerList{})
+	_, err := c.Fake.Invokes(action, &v1beta2.ServerList{})
 	return err
 }
 
 // Patch applies the patch and returns the patched server.
-func (c *FakeServers) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.Server, err error) {
+func (c *FakeServers) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta2.Server, err error) {
 	obj, err := c.Fake.
-		Invokes(testing.NewPatchSubresourceAction(serversResource, c.ns, name, pt, data, subresources...), &v1beta1.Server{})
+		Invokes(testing.NewPatchSubresourceAction(serversResource, c.ns, name, pt, data, subresources...), &v1beta2.Server{})
 
 	if obj == nil {
 		return nil, err
 	}
-	return obj.(*v1beta1.Server), err
+	return obj.(*v1beta2.Server), err
 }
diff --git a/controller/gen/client/clientset/versioned/typed/server/v1beta1/fake/fake_server_client.go b/controller/gen/client/clientset/versioned/typed/server/v1beta2/fake/fake_server_client.go
similarity index 78%
rename from controller/gen/client/clientset/versioned/typed/server/v1beta1/fake/fake_server_client.go
rename to controller/gen/client/clientset/versioned/typed/server/v1beta2/fake/fake_server_client.go
index ccb82dc2b..325ab60ae 100644
--- a/controller/gen/client/clientset/versioned/typed/server/v1beta1/fake/fake_server_client.go
+++ b/controller/gen/client/clientset/versioned/typed/server/v1beta2/fake/fake_server_client.go
@@ -19,22 +19,22 @@ limitations under the License.
 package fake
 
 import (
-	v1beta1 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/server/v1beta1"
+	v1beta2 "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/typed/server/v1beta2"
 	rest "k8s.io/client-go/rest"
 	testing "k8s.io/client-go/testing"
 )
 
-type FakeServerV1beta1 struct {
+type FakeServerV1beta2 struct {
 	*testing.Fake
 }
 
-func (c *FakeServerV1beta1) Servers(namespace string) v1beta1.ServerInterface {
+func (c *FakeServerV1beta2) Servers(namespace string) v1beta2.ServerInterface {
 	return &FakeServers{c, namespace}
 }
 
 // RESTClient returns a RESTClient that is used to communicate
 // with API server by this client implementation.
-func (c *FakeServerV1beta1) RESTClient() rest.Interface {
+func (c *FakeServerV1beta2) RESTClient() rest.Interface {
 	var ret *rest.RESTClient
 	return ret
 }
diff --git a/controller/gen/client/clientset/versioned/typed/server/v1beta1/generated_expansion.go b/controller/gen/client/clientset/versioned/typed/server/v1beta2/generated_expansion.go
similarity index 97%
rename from controller/gen/client/clientset/versioned/typed/server/v1beta1/generated_expansion.go
rename to controller/gen/client/clientset/versioned/typed/server/v1beta2/generated_expansion.go
index 386f7bb3c..9bf8424ef 100644
--- a/controller/gen/client/clientset/versioned/typed/server/v1beta1/generated_expansion.go
+++ b/controller/gen/client/clientset/versioned/typed/server/v1beta2/generated_expansion.go
@@ -16,6 +16,6 @@ limitations under the License.
 
 // Code generated by client-gen. DO NOT EDIT.
 
-package v1beta1
+package v1beta2
 
 type ServerExpansion interface{}
diff --git a/controller/gen/client/clientset/versioned/typed/server/v1beta1/server.go b/controller/gen/client/clientset/versioned/typed/server/v1beta2/server.go
similarity index 82%
rename from controller/gen/client/clientset/versioned/typed/server/v1beta1/server.go
rename to controller/gen/client/clientset/versioned/typed/server/v1beta2/server.go
index 0296afa77..d16fb85cb 100644
--- a/controller/gen/client/clientset/versioned/typed/server/v1beta1/server.go
+++ b/controller/gen/client/clientset/versioned/typed/server/v1beta2/server.go
@@ -16,13 +16,13 @@ limitations under the License.
 
 // Code generated by client-gen. DO NOT EDIT.
 
-package v1beta1
+package v1beta2
 
 import (
 	"context"
 	"time"
 
-	v1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	v1beta2 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	scheme "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/scheme"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	types "k8s.io/apimachinery/pkg/types"
@@ -38,14 +38,14 @@ type ServersGetter interface {
 
 // ServerInterface has methods to work with Server resources.
 type ServerInterface interface {
-	Create(ctx context.Context, server *v1beta1.Server, opts v1.CreateOptions) (*v1beta1.Server, error)
-	Update(ctx context.Context, server *v1beta1.Server, opts v1.UpdateOptions) (*v1beta1.Server, error)
+	Create(ctx context.Context, server *v1beta2.Server, opts v1.CreateOptions) (*v1beta2.Server, error)
+	Update(ctx context.Context, server *v1beta2.Server, opts v1.UpdateOptions) (*v1beta2.Server, error)
 	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
 	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
-	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1beta1.Server, error)
-	List(ctx context.Context, opts v1.ListOptions) (*v1beta1.ServerList, error)
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1beta2.Server, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1beta2.ServerList, error)
 	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
-	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.Server, err error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta2.Server, err error)
 	ServerExpansion
 }
 
@@ -56,7 +56,7 @@ type servers struct {
 }
 
 // newServers returns a Servers
-func newServers(c *ServerV1beta1Client, namespace string) *servers {
+func newServers(c *ServerV1beta2Client, namespace string) *servers {
 	return &servers{
 		client: c.RESTClient(),
 		ns:     namespace,
@@ -64,8 +64,8 @@ func newServers(c *ServerV1beta1Client, namespace string) *servers {
 }
 
 // Get takes name of the server, and returns the corresponding server object, and an error if there is any.
-func (c *servers) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1beta1.Server, err error) {
-	result = &v1beta1.Server{}
+func (c *servers) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1beta2.Server, err error) {
+	result = &v1beta2.Server{}
 	err = c.client.Get().
 		Namespace(c.ns).
 		Resource("servers").
@@ -77,12 +77,12 @@ func (c *servers) Get(ctx context.Context, name string, options v1.GetOptions) (
 }
 
 // List takes label and field selectors, and returns the list of Servers that match those selectors.
-func (c *servers) List(ctx context.Context, opts v1.ListOptions) (result *v1beta1.ServerList, err error) {
+func (c *servers) List(ctx context.Context, opts v1.ListOptions) (result *v1beta2.ServerList, err error) {
 	var timeout time.Duration
 	if opts.TimeoutSeconds != nil {
 		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
 	}
-	result = &v1beta1.ServerList{}
+	result = &v1beta2.ServerList{}
 	err = c.client.Get().
 		Namespace(c.ns).
 		Resource("servers").
@@ -109,8 +109,8 @@ func (c *servers) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interfa
 }
 
 // Create takes the representation of a server and creates it.  Returns the server's representation of the server, and an error, if there is any.
-func (c *servers) Create(ctx context.Context, server *v1beta1.Server, opts v1.CreateOptions) (result *v1beta1.Server, err error) {
-	result = &v1beta1.Server{}
+func (c *servers) Create(ctx context.Context, server *v1beta2.Server, opts v1.CreateOptions) (result *v1beta2.Server, err error) {
+	result = &v1beta2.Server{}
 	err = c.client.Post().
 		Namespace(c.ns).
 		Resource("servers").
@@ -122,8 +122,8 @@ func (c *servers) Create(ctx context.Context, server *v1beta1.Server, opts v1.Cr
 }
 
 // Update takes the representation of a server and updates it. Returns the server's representation of the server, and an error, if there is any.
-func (c *servers) Update(ctx context.Context, server *v1beta1.Server, opts v1.UpdateOptions) (result *v1beta1.Server, err error) {
-	result = &v1beta1.Server{}
+func (c *servers) Update(ctx context.Context, server *v1beta2.Server, opts v1.UpdateOptions) (result *v1beta2.Server, err error) {
+	result = &v1beta2.Server{}
 	err = c.client.Put().
 		Namespace(c.ns).
 		Resource("servers").
@@ -163,8 +163,8 @@ func (c *servers) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, l
 }
 
 // Patch applies the patch and returns the patched server.
-func (c *servers) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.Server, err error) {
-	result = &v1beta1.Server{}
+func (c *servers) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta2.Server, err error) {
+	result = &v1beta2.Server{}
 	err = c.client.Patch(pt).
 		Namespace(c.ns).
 		Resource("servers").
diff --git a/controller/gen/client/clientset/versioned/typed/server/v1beta1/server_client.go b/controller/gen/client/clientset/versioned/typed/server/v1beta2/server_client.go
similarity index 70%
rename from controller/gen/client/clientset/versioned/typed/server/v1beta1/server_client.go
rename to controller/gen/client/clientset/versioned/typed/server/v1beta2/server_client.go
index b23b1848f..d98903e9c 100644
--- a/controller/gen/client/clientset/versioned/typed/server/v1beta1/server_client.go
+++ b/controller/gen/client/clientset/versioned/typed/server/v1beta2/server_client.go
@@ -16,34 +16,34 @@ limitations under the License.
 
 // Code generated by client-gen. DO NOT EDIT.
 
-package v1beta1
+package v1beta2
 
 import (
 	"net/http"
 
-	v1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	v1beta2 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	"github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned/scheme"
 	rest "k8s.io/client-go/rest"
 )
 
-type ServerV1beta1Interface interface {
+type ServerV1beta2Interface interface {
 	RESTClient() rest.Interface
 	ServersGetter
 }
 
-// ServerV1beta1Client is used to interact with features provided by the server group.
-type ServerV1beta1Client struct {
+// ServerV1beta2Client is used to interact with features provided by the server group.
+type ServerV1beta2Client struct {
 	restClient rest.Interface
 }
 
-func (c *ServerV1beta1Client) Servers(namespace string) ServerInterface {
+func (c *ServerV1beta2Client) Servers(namespace string) ServerInterface {
 	return newServers(c, namespace)
 }
 
-// NewForConfig creates a new ServerV1beta1Client for the given config.
+// NewForConfig creates a new ServerV1beta2Client for the given config.
 // NewForConfig is equivalent to NewForConfigAndClient(c, httpClient),
 // where httpClient was generated with rest.HTTPClientFor(c).
-func NewForConfig(c *rest.Config) (*ServerV1beta1Client, error) {
+func NewForConfig(c *rest.Config) (*ServerV1beta2Client, error) {
 	config := *c
 	if err := setConfigDefaults(&config); err != nil {
 		return nil, err
@@ -55,9 +55,9 @@ func NewForConfig(c *rest.Config) (*ServerV1beta1Client, error) {
 	return NewForConfigAndClient(&config, httpClient)
 }
 
-// NewForConfigAndClient creates a new ServerV1beta1Client for the given config and http client.
+// NewForConfigAndClient creates a new ServerV1beta2Client for the given config and http client.
 // Note the http client provided takes precedence over the configured transport values.
-func NewForConfigAndClient(c *rest.Config, h *http.Client) (*ServerV1beta1Client, error) {
+func NewForConfigAndClient(c *rest.Config, h *http.Client) (*ServerV1beta2Client, error) {
 	config := *c
 	if err := setConfigDefaults(&config); err != nil {
 		return nil, err
@@ -66,12 +66,12 @@ func NewForConfigAndClient(c *rest.Config, h *http.Client) (*ServerV1beta1Client
 	if err != nil {
 		return nil, err
 	}
-	return &ServerV1beta1Client{client}, nil
+	return &ServerV1beta2Client{client}, nil
 }
 
-// NewForConfigOrDie creates a new ServerV1beta1Client for the given config and
+// NewForConfigOrDie creates a new ServerV1beta2Client for the given config and
 // panics if there is an error in the config.
-func NewForConfigOrDie(c *rest.Config) *ServerV1beta1Client {
+func NewForConfigOrDie(c *rest.Config) *ServerV1beta2Client {
 	client, err := NewForConfig(c)
 	if err != nil {
 		panic(err)
@@ -79,13 +79,13 @@ func NewForConfigOrDie(c *rest.Config) *ServerV1beta1Client {
 	return client
 }
 
-// New creates a new ServerV1beta1Client for the given RESTClient.
-func New(c rest.Interface) *ServerV1beta1Client {
-	return &ServerV1beta1Client{c}
+// New creates a new ServerV1beta2Client for the given RESTClient.
+func New(c rest.Interface) *ServerV1beta2Client {
+	return &ServerV1beta2Client{c}
 }
 
 func setConfigDefaults(config *rest.Config) error {
-	gv := v1beta1.SchemeGroupVersion
+	gv := v1beta2.SchemeGroupVersion
 	config.GroupVersion = &gv
 	config.APIPath = "/apis"
 	config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
@@ -99,7 +99,7 @@ func setConfigDefaults(config *rest.Config) error {
 
 // RESTClient returns a RESTClient that is used to communicate
 // with API server by this client implementation.
-func (c *ServerV1beta1Client) RESTClient() rest.Interface {
+func (c *ServerV1beta2Client) RESTClient() rest.Interface {
 	if c == nil {
 		return nil
 	}
diff --git a/controller/gen/client/informers/externalversions/generic.go b/controller/gen/client/informers/externalversions/generic.go
index cb6821e16..4a55a9f3d 100644
--- a/controller/gen/client/informers/externalversions/generic.go
+++ b/controller/gen/client/informers/externalversions/generic.go
@@ -25,8 +25,8 @@ import (
 	linkv1alpha1 "github.com/linkerd/linkerd2/controller/gen/apis/link/v1alpha1"
 	policyv1alpha1 "github.com/linkerd/linkerd2/controller/gen/apis/policy/v1alpha1"
 	v1beta3 "github.com/linkerd/linkerd2/controller/gen/apis/policy/v1beta3"
-	v1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
-	serverauthorizationv1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/serverauthorization/v1beta1"
+	v1beta2 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
+	v1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/serverauthorization/v1beta1"
 	v1alpha2 "github.com/linkerd/linkerd2/controller/gen/apis/serviceprofile/v1alpha2"
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	cache "k8s.io/client-go/tools/cache"
@@ -84,12 +84,12 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource
 	case v1beta3.SchemeGroupVersion.WithResource("httproutes"):
 		return &genericInformer{resource: resource.GroupResource(), informer: f.Policy().V1beta3().HTTPRoutes().Informer()}, nil
 
-		// Group=server, Version=v1beta1
-	case v1beta1.SchemeGroupVersion.WithResource("servers"):
-		return &genericInformer{resource: resource.GroupResource(), informer: f.Server().V1beta1().Servers().Informer()}, nil
+		// Group=server, Version=v1beta2
+	case v1beta2.SchemeGroupVersion.WithResource("servers"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Server().V1beta2().Servers().Informer()}, nil
 
 		// Group=serverauthorization, Version=v1beta1
-	case serverauthorizationv1beta1.SchemeGroupVersion.WithResource("serverauthorizations"):
+	case v1beta1.SchemeGroupVersion.WithResource("serverauthorizations"):
 		return &genericInformer{resource: resource.GroupResource(), informer: f.Serverauthorization().V1beta1().ServerAuthorizations().Informer()}, nil
 
 	}
diff --git a/controller/gen/client/informers/externalversions/server/interface.go b/controller/gen/client/informers/externalversions/server/interface.go
index d50785364..1d0bc3547 100644
--- a/controller/gen/client/informers/externalversions/server/interface.go
+++ b/controller/gen/client/informers/externalversions/server/interface.go
@@ -20,13 +20,13 @@ package server
 
 import (
 	internalinterfaces "github.com/linkerd/linkerd2/controller/gen/client/informers/externalversions/internalinterfaces"
-	v1beta1 "github.com/linkerd/linkerd2/controller/gen/client/informers/externalversions/server/v1beta1"
+	v1beta2 "github.com/linkerd/linkerd2/controller/gen/client/informers/externalversions/server/v1beta2"
 )
 
 // Interface provides access to each of this group's versions.
 type Interface interface {
-	// V1beta1 provides access to shared informers for resources in V1beta1.
-	V1beta1() v1beta1.Interface
+	// V1beta2 provides access to shared informers for resources in V1beta2.
+	V1beta2() v1beta2.Interface
 }
 
 type group struct {
@@ -40,7 +40,7 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList
 	return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
 }
 
-// V1beta1 returns a new v1beta1.Interface.
-func (g *group) V1beta1() v1beta1.Interface {
-	return v1beta1.New(g.factory, g.namespace, g.tweakListOptions)
+// V1beta2 returns a new v1beta2.Interface.
+func (g *group) V1beta2() v1beta2.Interface {
+	return v1beta2.New(g.factory, g.namespace, g.tweakListOptions)
 }
diff --git a/controller/gen/client/informers/externalversions/server/v1beta1/interface.go b/controller/gen/client/informers/externalversions/server/v1beta2/interface.go
similarity index 98%
rename from controller/gen/client/informers/externalversions/server/v1beta1/interface.go
rename to controller/gen/client/informers/externalversions/server/v1beta2/interface.go
index 717142453..0291fda7d 100644
--- a/controller/gen/client/informers/externalversions/server/v1beta1/interface.go
+++ b/controller/gen/client/informers/externalversions/server/v1beta2/interface.go
@@ -16,7 +16,7 @@ limitations under the License.
 
 // Code generated by informer-gen. DO NOT EDIT.
 
-package v1beta1
+package v1beta2
 
 import (
 	internalinterfaces "github.com/linkerd/linkerd2/controller/gen/client/informers/externalversions/internalinterfaces"
diff --git a/controller/gen/client/informers/externalversions/server/v1beta1/server.go b/controller/gen/client/informers/externalversions/server/v1beta2/server.go
similarity index 84%
rename from controller/gen/client/informers/externalversions/server/v1beta1/server.go
rename to controller/gen/client/informers/externalversions/server/v1beta2/server.go
index 4267426a4..10cd7cb05 100644
--- a/controller/gen/client/informers/externalversions/server/v1beta1/server.go
+++ b/controller/gen/client/informers/externalversions/server/v1beta2/server.go
@@ -16,16 +16,16 @@ limitations under the License.
 
 // Code generated by informer-gen. DO NOT EDIT.
 
-package v1beta1
+package v1beta2
 
 import (
 	"context"
 	time "time"
 
-	serverv1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	serverv1beta2 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	versioned "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned"
 	internalinterfaces "github.com/linkerd/linkerd2/controller/gen/client/informers/externalversions/internalinterfaces"
-	v1beta1 "github.com/linkerd/linkerd2/controller/gen/client/listers/server/v1beta1"
+	v1beta2 "github.com/linkerd/linkerd2/controller/gen/client/listers/server/v1beta2"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	watch "k8s.io/apimachinery/pkg/watch"
@@ -36,7 +36,7 @@ import (
 // Servers.
 type ServerInformer interface {
 	Informer() cache.SharedIndexInformer
-	Lister() v1beta1.ServerLister
+	Lister() v1beta2.ServerLister
 }
 
 type serverInformer struct {
@@ -62,16 +62,16 @@ func NewFilteredServerInformer(client versioned.Interface, namespace string, res
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.ServerV1beta1().Servers(namespace).List(context.TODO(), options)
+				return client.ServerV1beta2().Servers(namespace).List(context.TODO(), options)
 			},
 			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.ServerV1beta1().Servers(namespace).Watch(context.TODO(), options)
+				return client.ServerV1beta2().Servers(namespace).Watch(context.TODO(), options)
 			},
 		},
-		&serverv1beta1.Server{},
+		&serverv1beta2.Server{},
 		resyncPeriod,
 		indexers,
 	)
@@ -82,9 +82,9 @@ func (f *serverInformer) defaultInformer(client versioned.Interface, resyncPerio
 }
 
 func (f *serverInformer) Informer() cache.SharedIndexInformer {
-	return f.factory.InformerFor(&serverv1beta1.Server{}, f.defaultInformer)
+	return f.factory.InformerFor(&serverv1beta2.Server{}, f.defaultInformer)
 }
 
-func (f *serverInformer) Lister() v1beta1.ServerLister {
-	return v1beta1.NewServerLister(f.Informer().GetIndexer())
+func (f *serverInformer) Lister() v1beta2.ServerLister {
+	return v1beta2.NewServerLister(f.Informer().GetIndexer())
 }
diff --git a/controller/gen/client/listers/server/v1beta1/expansion_generated.go b/controller/gen/client/listers/server/v1beta2/expansion_generated.go
similarity index 98%
rename from controller/gen/client/listers/server/v1beta1/expansion_generated.go
rename to controller/gen/client/listers/server/v1beta2/expansion_generated.go
index 195815706..fca48bf88 100644
--- a/controller/gen/client/listers/server/v1beta1/expansion_generated.go
+++ b/controller/gen/client/listers/server/v1beta2/expansion_generated.go
@@ -16,7 +16,7 @@ limitations under the License.
 
 // Code generated by lister-gen. DO NOT EDIT.
 
-package v1beta1
+package v1beta2
 
 // ServerListerExpansion allows custom methods to be added to
 // ServerLister.
diff --git a/controller/gen/client/listers/server/v1beta1/server.go b/controller/gen/client/listers/server/v1beta2/server.go
similarity index 83%
rename from controller/gen/client/listers/server/v1beta1/server.go
rename to controller/gen/client/listers/server/v1beta2/server.go
index c2486f96b..ede3535cf 100644
--- a/controller/gen/client/listers/server/v1beta1/server.go
+++ b/controller/gen/client/listers/server/v1beta2/server.go
@@ -16,10 +16,10 @@ limitations under the License.
 
 // Code generated by lister-gen. DO NOT EDIT.
 
-package v1beta1
+package v1beta2
 
 import (
-	v1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	v1beta2 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	"k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/labels"
 	"k8s.io/client-go/tools/cache"
@@ -30,7 +30,7 @@ import (
 type ServerLister interface {
 	// List lists all Servers in the indexer.
 	// Objects returned here must be treated as read-only.
-	List(selector labels.Selector) (ret []*v1beta1.Server, err error)
+	List(selector labels.Selector) (ret []*v1beta2.Server, err error)
 	// Servers returns an object that can list and get Servers.
 	Servers(namespace string) ServerNamespaceLister
 	ServerListerExpansion
@@ -47,9 +47,9 @@ func NewServerLister(indexer cache.Indexer) ServerLister {
 }
 
 // List lists all Servers in the indexer.
-func (s *serverLister) List(selector labels.Selector) (ret []*v1beta1.Server, err error) {
+func (s *serverLister) List(selector labels.Selector) (ret []*v1beta2.Server, err error) {
 	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
-		ret = append(ret, m.(*v1beta1.Server))
+		ret = append(ret, m.(*v1beta2.Server))
 	})
 	return ret, err
 }
@@ -64,10 +64,10 @@ func (s *serverLister) Servers(namespace string) ServerNamespaceLister {
 type ServerNamespaceLister interface {
 	// List lists all Servers in the indexer for a given namespace.
 	// Objects returned here must be treated as read-only.
-	List(selector labels.Selector) (ret []*v1beta1.Server, err error)
+	List(selector labels.Selector) (ret []*v1beta2.Server, err error)
 	// Get retrieves the Server from the indexer for a given namespace and name.
 	// Objects returned here must be treated as read-only.
-	Get(name string) (*v1beta1.Server, error)
+	Get(name string) (*v1beta2.Server, error)
 	ServerNamespaceListerExpansion
 }
 
@@ -79,21 +79,21 @@ type serverNamespaceLister struct {
 }
 
 // List lists all Servers in the indexer for a given namespace.
-func (s serverNamespaceLister) List(selector labels.Selector) (ret []*v1beta1.Server, err error) {
+func (s serverNamespaceLister) List(selector labels.Selector) (ret []*v1beta2.Server, err error) {
 	err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) {
-		ret = append(ret, m.(*v1beta1.Server))
+		ret = append(ret, m.(*v1beta2.Server))
 	})
 	return ret, err
 }
 
 // Get retrieves the Server from the indexer for a given namespace and name.
-func (s serverNamespaceLister) Get(name string) (*v1beta1.Server, error) {
+func (s serverNamespaceLister) Get(name string) (*v1beta2.Server, error) {
 	obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name)
 	if err != nil {
 		return nil, err
 	}
 	if !exists {
-		return nil, errors.NewNotFound(v1beta1.Resource("server"), name)
+		return nil, errors.NewNotFound(v1beta2.Resource("server"), name)
 	}
-	return obj.(*v1beta1.Server), nil
+	return obj.(*v1beta2.Server), nil
 }
diff --git a/controller/k8s/api.go b/controller/k8s/api.go
index 7003c6d8e..fb23b81f6 100644
--- a/controller/k8s/api.go
+++ b/controller/k8s/api.go
@@ -12,7 +12,7 @@ import (
 	l5dcrdclient "github.com/linkerd/linkerd2/controller/gen/client/clientset/versioned"
 	l5dcrdinformer "github.com/linkerd/linkerd2/controller/gen/client/informers/externalversions"
 	ewinformers "github.com/linkerd/linkerd2/controller/gen/client/informers/externalversions/externalworkload/v1alpha1"
-	srvinformers "github.com/linkerd/linkerd2/controller/gen/client/informers/externalversions/server/v1beta1"
+	srvinformers "github.com/linkerd/linkerd2/controller/gen/client/informers/externalversions/server/v1beta2"
 	spinformers "github.com/linkerd/linkerd2/controller/gen/client/informers/externalversions/serviceprofile/v1alpha2"
 	"github.com/linkerd/linkerd2/pkg/k8s"
 	"github.com/prometheus/client_golang/prometheus"
@@ -279,7 +279,7 @@ func newAPI(
 			if l5dCrdSharedInformers == nil {
 				panic("Linkerd CRD shared informer not configured")
 			}
-			api.srv = l5dCrdSharedInformers.Server().V1beta1().Servers()
+			api.srv = l5dCrdSharedInformers.Server().V1beta2().Servers()
 			api.syncChecks = append(api.syncChecks, api.srv.Informer().HasSynced)
 			api.promGauges.addInformerSize(k8s.Server, informerLabels, api.srv.Informer())
 		case SS:
diff --git a/controller/k8s/api_resource.go b/controller/k8s/api_resource.go
index af035e9ad..45a86a067 100644
--- a/controller/k8s/api_resource.go
+++ b/controller/k8s/api_resource.go
@@ -3,7 +3,7 @@ package k8s
 import (
 	"strings"
 
-	serverv1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	serverv1beta2 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	sazv1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/serverauthorization/v1beta1"
 	spv1alpha2 "github.com/linkerd/linkerd2/controller/gen/apis/serviceprofile/v1alpha2"
 	"github.com/linkerd/linkerd2/pkg/k8s"
@@ -84,7 +84,7 @@ func (res APIResource) GVK() (schema.GroupVersionKind, error) {
 	case SS:
 		return appsv1.SchemeGroupVersion.WithKind("StatefulSet"), nil
 	case Srv:
-		return serverv1beta1.SchemeGroupVersion.WithKind("Server"), nil
+		return serverv1beta2.SchemeGroupVersion.WithKind("Server"), nil
 	case Svc:
 		return v1.SchemeGroupVersion.WithKind("Service"), nil
 	default:
diff --git a/controller/script/policy-client/main.go b/controller/script/policy-client/main.go
index 144a77f87..089b66dba 100644
--- a/controller/script/policy-client/main.go
+++ b/controller/script/policy-client/main.go
@@ -24,7 +24,7 @@ func main() {
 	}
 	client := versioned.NewForConfigOrDie(config)
 
-	srvWatch, err := client.ServerV1beta1().Servers(*namespace).Watch(context.Background(), metav1.ListOptions{})
+	srvWatch, err := client.ServerV1beta2().Servers(*namespace).Watch(context.Background(), metav1.ListOptions{})
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "failed to watch Servers: %s", err)
 		os.Exit(1)
diff --git a/jaeger/charts/linkerd-jaeger/Chart.yaml b/jaeger/charts/linkerd-jaeger/Chart.yaml
index a0d5dde36..f72b117b2 100644
--- a/jaeger/charts/linkerd-jaeger/Chart.yaml
+++ b/jaeger/charts/linkerd-jaeger/Chart.yaml
@@ -11,7 +11,7 @@ kubeVersion: ">=1.22.0-0"
 name: linkerd-jaeger
 sources:
   - https://github.com/linkerd/linkerd2/
-version: 30.14.3-edge
+version: 30.14.4-edge
 icon: https://linkerd.io/images/logo-only-200h.png
 maintainers:
   - name: Linkerd authors
diff --git a/jaeger/charts/linkerd-jaeger/README.md b/jaeger/charts/linkerd-jaeger/README.md
index 094dc624e..a23fedf1a 100644
--- a/jaeger/charts/linkerd-jaeger/README.md
+++ b/jaeger/charts/linkerd-jaeger/README.md
@@ -3,7 +3,7 @@
 The Linkerd-Jaeger extension adds distributed tracing to Linkerd using
 OpenCensus and Jaeger.
 
-![Version: 30.14.3-edge](https://img.shields.io/badge/Version-30.14.3--edge-informational?style=flat-square)
+![Version: 30.14.4-edge](https://img.shields.io/badge/Version-30.14.4--edge-informational?style=flat-square)
 
 ![AppVersion: edge-XX.X.X](https://img.shields.io/badge/AppVersion-edge--XX.X.X-informational?style=flat-square)
 
diff --git a/jaeger/charts/linkerd-jaeger/templates/jaeger-injector-policy.yaml b/jaeger/charts/linkerd-jaeger/templates/jaeger-injector-policy.yaml
index b032506f1..77bd1f645 100644
--- a/jaeger/charts/linkerd-jaeger/templates/jaeger-injector-policy.yaml
+++ b/jaeger/charts/linkerd-jaeger/templates/jaeger-injector-policy.yaml
@@ -1,5 +1,5 @@
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
diff --git a/jaeger/charts/linkerd-jaeger/templates/tracing-policy.yaml b/jaeger/charts/linkerd-jaeger/templates/tracing-policy.yaml
index c9b37c4c4..7d9049bd0 100644
--- a/jaeger/charts/linkerd-jaeger/templates/tracing-policy.yaml
+++ b/jaeger/charts/linkerd-jaeger/templates/tracing-policy.yaml
@@ -1,6 +1,6 @@
 {{ if .Values.collector.enabled -}}
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
@@ -18,7 +18,7 @@ spec:
   port: 4317
   proxyProtocol: gRPC
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
@@ -35,7 +35,7 @@ spec:
   port: 4318
   proxyProtocol: HTTP/1
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
@@ -53,7 +53,7 @@ spec:
   port: 55678
   proxyProtocol: gRPC
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
@@ -70,7 +70,7 @@ spec:
       component: collector
   port: 9411
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
@@ -87,7 +87,7 @@ spec:
       component: collector
   port: 14268
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
@@ -104,7 +104,7 @@ spec:
       component: collector
   port: 14250
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
@@ -236,7 +236,7 @@ spec:
   # allow connections from any pod (meshed or not) sending trace data
   requiredAuthenticationRefs: []
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
@@ -275,7 +275,7 @@ spec:
       name: collector
       namespace: {{.Release.Namespace}}
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
@@ -315,7 +315,7 @@ spec:
       name: prometheus
       namespace: linkerd-viz
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
diff --git a/multicluster/charts/linkerd-multicluster-link/templates/service-mirror.yaml b/multicluster/charts/linkerd-multicluster-link/templates/service-mirror.yaml
index 626f79286..55b4a5564 100644
--- a/multicluster/charts/linkerd-multicluster-link/templates/service-mirror.yaml
+++ b/multicluster/charts/linkerd-multicluster-link/templates/service-mirror.yaml
@@ -139,6 +139,10 @@ spec:
         {{- end }}
         - -enable-pprof={{.Values.enablePprof | default false}}
         - {{.Values.targetClusterName}}
+        {{- with .Values.serviceMirrorExperimentalEnv }}
+        env:
+        {{- toYaml . | nindent 8 -}}
+        {{- end }}
         image: {{.Values.controllerImage}}:{{.Values.controllerImageVersion}}
         name: service-mirror
         securityContext:
diff --git a/multicluster/charts/linkerd-multicluster/Chart.yaml b/multicluster/charts/linkerd-multicluster/Chart.yaml
index 6ac695e5d..b00d5c2cb 100644
--- a/multicluster/charts/linkerd-multicluster/Chart.yaml
+++ b/multicluster/charts/linkerd-multicluster/Chart.yaml
@@ -11,7 +11,7 @@ kubeVersion: ">=1.22.0-0"
 name: "linkerd-multicluster"
 sources:
   - https://github.com/linkerd/linkerd2/
-version: 30.12.12-edge
+version: 30.12.13-edge
 icon: https://linkerd.io/images/logo-only-200h.png
 maintainers:
   - name: Linkerd authors
diff --git a/multicluster/charts/linkerd-multicluster/README.md b/multicluster/charts/linkerd-multicluster/README.md
index 6e4a0a51a..2fad13df6 100644
--- a/multicluster/charts/linkerd-multicluster/README.md
+++ b/multicluster/charts/linkerd-multicluster/README.md
@@ -3,7 +3,7 @@
 The Linkerd-Multicluster extension contains resources to support multicluster
 linking to remote clusters
 
-![Version: 30.12.12-edge](https://img.shields.io/badge/Version-30.12.12--edge-informational?style=flat-square)
+![Version: 30.12.13-edge](https://img.shields.io/badge/Version-30.12.13--edge-informational?style=flat-square)
 
 ![AppVersion: edge-XX.X.X](https://img.shields.io/badge/AppVersion-edge--XX.X.X-informational?style=flat-square)
 
diff --git a/multicluster/charts/linkerd-multicluster/templates/gateway-policy.yaml b/multicluster/charts/linkerd-multicluster/templates/gateway-policy.yaml
index 15476d5fc..d81f31fc6 100644
--- a/multicluster/charts/linkerd-multicluster/templates/gateway-policy.yaml
+++ b/multicluster/charts/linkerd-multicluster/templates/gateway-policy.yaml
@@ -1,6 +1,6 @@
 {{if .Values.gateway.enabled -}}
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
diff --git a/multicluster/charts/linkerd-multicluster/templates/service-mirror-policy.yaml b/multicluster/charts/linkerd-multicluster/templates/service-mirror-policy.yaml
index 6d97f3c15..b87a4c751 100644
--- a/multicluster/charts/linkerd-multicluster/templates/service-mirror-policy.yaml
+++ b/multicluster/charts/linkerd-multicluster/templates/service-mirror-policy.yaml
@@ -1,5 +1,5 @@
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
diff --git a/multicluster/cmd/install.go b/multicluster/cmd/install.go
index cd7fdd3fa..3ca596d22 100644
--- a/multicluster/cmd/install.go
+++ b/multicluster/cmd/install.go
@@ -34,6 +34,18 @@ type (
 	}
 )
 
+var TemplatesMulticluster = []string{
+	chartutil.ChartfileName,
+	chartutil.ValuesfileName,
+	"templates/namespace.yaml",
+	"templates/gateway.yaml",
+	"templates/gateway-policy.yaml",
+	"templates/psp.yaml",
+	"templates/remote-access-service-mirror-rbac.yaml",
+	"templates/link-crd.yaml",
+	"templates/service-mirror-policy.yaml",
+}
+
 func newMulticlusterInstallCommand() *cobra.Command {
 	options, err := newMulticlusterInstallOptionsWithDefault()
 	var ha bool
@@ -129,16 +141,9 @@ func install(ctx context.Context, w io.Writer, options *multiclusterInstallOptio
 }
 
 func render(w io.Writer, values *multicluster.Values, valuesOverrides map[string]interface{}) error {
-	files := []*loader.BufferedFile{
-		{Name: chartutil.ChartfileName},
-		{Name: chartutil.ValuesfileName},
-		{Name: "templates/namespace.yaml"},
-		{Name: "templates/gateway.yaml"},
-		{Name: "templates/gateway-policy.yaml"},
-		{Name: "templates/psp.yaml"},
-		{Name: "templates/remote-access-service-mirror-rbac.yaml"},
-		{Name: "templates/link-crd.yaml"},
-		{Name: "templates/service-mirror-policy.yaml"},
+	var files []*loader.BufferedFile
+	for _, template := range TemplatesMulticluster {
+		files = append(files, &loader.BufferedFile{Name: template})
 	}
 
 	var partialFiles []*loader.BufferedFile
diff --git a/pkg/k8s/policy.go b/pkg/k8s/policy.go
index 54cf1ca0e..aedf7d071 100644
--- a/pkg/k8s/policy.go
+++ b/pkg/k8s/policy.go
@@ -9,7 +9,7 @@ import (
 	"k8s.io/apimachinery/pkg/labels"
 
 	policyv1 "github.com/linkerd/linkerd2/controller/gen/apis/policy/v1alpha1"
-	serverv1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	serverv1beta2 "github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	serverauthorizationv1beta1 "github.com/linkerd/linkerd2/controller/gen/apis/serverauthorization/v1beta1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -34,7 +34,7 @@ var HTTPRouteGVR = policyv1.SchemeGroupVersion.WithResource("httproutes")
 var SazGVR = serverauthorizationv1beta1.SchemeGroupVersion.WithResource("serverauthorizations")
 
 // ServerGVR is the GroupVersionResource for the Server resource.
-var ServerGVR = serverv1beta1.SchemeGroupVersion.WithResource("servers")
+var ServerGVR = serverv1beta2.SchemeGroupVersion.WithResource("servers")
 
 // AuthorizationsForResource returns a list of ServerAuthorizations and
 // AuthorizationPolicies which apply to any Server or HttpRoute which select
@@ -54,22 +54,22 @@ func AuthorizationsForResource(ctx context.Context, k8sAPI *KubernetesAPI, names
 	}
 
 	for _, saz := range sazs.Items {
-		var servers []serverv1beta1.Server
+		var servers []serverv1beta2.Server
 
 		if saz.Spec.Server.Name != "" {
-			server, err := k8sAPI.L5dCrdClient.ServerV1beta1().Servers(saz.GetNamespace()).Get(ctx, saz.Spec.Server.Name, metav1.GetOptions{})
+			server, err := k8sAPI.L5dCrdClient.ServerV1beta2().Servers(saz.GetNamespace()).Get(ctx, saz.Spec.Server.Name, metav1.GetOptions{})
 			if err != nil {
 				fmt.Fprintf(os.Stderr, "ServerAuthorization/%s targets Server/%s but we failed to get it: %s\n", saz.Name, saz.Spec.Server.Name, err)
 				continue
 			}
-			servers = []serverv1beta1.Server{*server}
+			servers = []serverv1beta2.Server{*server}
 		} else if saz.Spec.Server.Selector != nil {
 			selector, err := metav1.LabelSelectorAsSelector(saz.Spec.Server.Selector)
 			if err != nil {
 				fmt.Fprintf(os.Stderr, "Failed to parse Server selector for ServerAuthorization/%s: %s\n", saz.Name, err)
 				continue
 			}
-			serverList, err := k8sAPI.L5dCrdClient.ServerV1beta1().Servers(saz.GetNamespace()).List(ctx, metav1.ListOptions{LabelSelector: selector.String()})
+			serverList, err := k8sAPI.L5dCrdClient.ServerV1beta2().Servers(saz.GetNamespace()).List(ctx, metav1.ListOptions{LabelSelector: selector.String()})
 			if err != nil {
 				fmt.Fprintf(os.Stderr, "Failed to get Servers for ServerAuthorization/%s: %s\n", saz.Name, err)
 				continue
@@ -95,14 +95,14 @@ func AuthorizationsForResource(ctx context.Context, k8sAPI *KubernetesAPI, names
 		os.Exit(1)
 	}
 
-	allServersInNamespace := map[string]*serverv1beta1.ServerList{}
+	allServersInNamespace := map[string]*serverv1beta2.ServerList{}
 
 	for _, p := range policies.Items {
 		target := p.Spec.TargetRef
 		if target.Kind == NamespaceKind && target.Group == K8sCoreAPIGroup {
 			serverList, ok := allServersInNamespace[p.Namespace]
 			if !ok {
-				serverList, err = k8sAPI.L5dCrdClient.ServerV1beta1().Servers(p.Namespace).List(ctx, metav1.ListOptions{})
+				serverList, err = k8sAPI.L5dCrdClient.ServerV1beta2().Servers(p.Namespace).List(ctx, metav1.ListOptions{})
 				if err != nil {
 					fmt.Fprintf(os.Stderr, "Failed to get Servers for Namespace/%s: %s\n", p.Namespace, err)
 					continue
@@ -122,7 +122,7 @@ func AuthorizationsForResource(ctx context.Context, k8sAPI *KubernetesAPI, names
 				}
 			}
 		} else if target.Kind == ServerKind && target.Group == PolicyAPIGroup {
-			server, err := k8sAPI.L5dCrdClient.ServerV1beta1().Servers(p.Namespace).Get(ctx, string(target.Name), metav1.GetOptions{})
+			server, err := k8sAPI.L5dCrdClient.ServerV1beta2().Servers(p.Namespace).Get(ctx, string(target.Name), metav1.GetOptions{})
 			if err != nil {
 				fmt.Fprintf(os.Stderr, "AuthorizationPolicy/%s targets Server/%s but we failed to get it: %s\n", p.Name, target.Name, err)
 				continue
@@ -144,7 +144,7 @@ func AuthorizationsForResource(ctx context.Context, k8sAPI *KubernetesAPI, names
 			for _, parent := range route.Spec.ParentRefs {
 				if parent.Kind != nil && *parent.Kind == ServerKind &&
 					parent.Group != nil && *parent.Group == PolicyAPIGroup {
-					server, err := k8sAPI.L5dCrdClient.ServerV1beta1().Servers(p.Namespace).Get(ctx, string(parent.Name), metav1.GetOptions{})
+					server, err := k8sAPI.L5dCrdClient.ServerV1beta2().Servers(p.Namespace).Get(ctx, string(parent.Name), metav1.GetOptions{})
 					if err != nil {
 						fmt.Fprintf(os.Stderr, "HTTPRoute/%s belongs to Server/%s but we failed to get it: %s\n", target.Name, parent.Name, err)
 						continue
@@ -175,7 +175,7 @@ func ServersForResource(ctx context.Context, k8sAPI *KubernetesAPI, namespace st
 
 	results := make([]string, 0)
 
-	servers, err := k8sAPI.L5dCrdClient.ServerV1beta1().Servers(namespace).List(ctx, metav1.ListOptions{})
+	servers, err := k8sAPI.L5dCrdClient.ServerV1beta2().Servers(namespace).List(ctx, metav1.ListOptions{})
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "Failed to get serverauthorization resources: %s\n", err)
 		os.Exit(1)
@@ -216,7 +216,7 @@ func ServerAuthorizationsForServer(ctx context.Context, k8sAPI *KubernetesAPI, n
 				fmt.Fprintf(os.Stderr, "Failed to get servers: %s\n", err)
 				os.Exit(1)
 			}
-			serverList, err := k8sAPI.L5dCrdClient.ServerV1beta1().Servers(saz.GetNamespace()).List(ctx, metav1.ListOptions{LabelSelector: selector.String()})
+			serverList, err := k8sAPI.L5dCrdClient.ServerV1beta2().Servers(saz.GetNamespace()).List(ctx, metav1.ListOptions{LabelSelector: selector.String()})
 			if err != nil {
 				fmt.Fprintf(os.Stderr, "Failed to get servers: %s\n", err)
 				os.Exit(1)
@@ -234,7 +234,7 @@ func ServerAuthorizationsForServer(ctx context.Context, k8sAPI *KubernetesAPI, n
 
 // serverIncludesPod returns true the given server selects any of the given pods
 // and that pod uses the server's port.
-func serverIncludesPod(server serverv1beta1.Server, pods []corev1.Pod) bool {
+func serverIncludesPod(server serverv1beta2.Server, pods []corev1.Pod) bool {
 	if server.Spec.PodSelector == nil {
 		return false
 	}
diff --git a/viz/charts/linkerd-viz/Chart.yaml b/viz/charts/linkerd-viz/Chart.yaml
index 9d1547e35..944e41212 100644
--- a/viz/charts/linkerd-viz/Chart.yaml
+++ b/viz/charts/linkerd-viz/Chart.yaml
@@ -11,7 +11,7 @@ kubeVersion: ">=1.22.0-0"
 name: "linkerd-viz"
 sources:
   - https://github.com/linkerd/linkerd2/
-version: 30.14.3-edge
+version: 30.14.4-edge
 icon: https://linkerd.io/images/logo-only-200h.png
 maintainers:
   - name: Linkerd authors
diff --git a/viz/charts/linkerd-viz/README.md b/viz/charts/linkerd-viz/README.md
index da60a78f7..eceeb2ef1 100644
--- a/viz/charts/linkerd-viz/README.md
+++ b/viz/charts/linkerd-viz/README.md
@@ -3,7 +3,7 @@
 The Linkerd-Viz extension contains observability and visualization
 components for Linkerd.
 
-![Version: 30.14.3-edge](https://img.shields.io/badge/Version-30.14.3--edge-informational?style=flat-square)
+![Version: 30.14.4-edge](https://img.shields.io/badge/Version-30.14.4--edge-informational?style=flat-square)
 
 ![AppVersion: edge-XX.X.X](https://img.shields.io/badge/AppVersion-edge--XX.X.X-informational?style=flat-square)
 
diff --git a/viz/charts/linkerd-viz/templates/metrics-api-policy.yaml b/viz/charts/linkerd-viz/templates/metrics-api-policy.yaml
index 83f631ac6..46bbac246 100644
--- a/viz/charts/linkerd-viz/templates/metrics-api-policy.yaml
+++ b/viz/charts/linkerd-viz/templates/metrics-api-policy.yaml
@@ -1,5 +1,5 @@
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
diff --git a/viz/charts/linkerd-viz/templates/prometheus-policy.yaml b/viz/charts/linkerd-viz/templates/prometheus-policy.yaml
index 1db3a1b83..fd7e539a6 100644
--- a/viz/charts/linkerd-viz/templates/prometheus-policy.yaml
+++ b/viz/charts/linkerd-viz/templates/prometheus-policy.yaml
@@ -1,5 +1,5 @@
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
diff --git a/viz/charts/linkerd-viz/templates/tap-injector-policy.yaml b/viz/charts/linkerd-viz/templates/tap-injector-policy.yaml
index 78692a5c4..8a3fe157f 100644
--- a/viz/charts/linkerd-viz/templates/tap-injector-policy.yaml
+++ b/viz/charts/linkerd-viz/templates/tap-injector-policy.yaml
@@ -1,5 +1,5 @@
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
diff --git a/viz/charts/linkerd-viz/templates/tap-policy.yaml b/viz/charts/linkerd-viz/templates/tap-policy.yaml
index 8c4d0e884..268a7ea6b 100644
--- a/viz/charts/linkerd-viz/templates/tap-policy.yaml
+++ b/viz/charts/linkerd-viz/templates/tap-policy.yaml
@@ -1,5 +1,5 @@
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: {{ .Release.Namespace }}
diff --git a/viz/cmd/allow-scrapes.go b/viz/cmd/allow-scrapes.go
index d95e63757..2ddd9b0c8 100644
--- a/viz/cmd/allow-scrapes.go
+++ b/viz/cmd/allow-scrapes.go
@@ -11,7 +11,7 @@ import (
 
 const (
 	allowScrapePolicy = `---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   name: proxy-admin
diff --git a/viz/cmd/uninstall.go b/viz/cmd/uninstall.go
index deec55781..e1d225662 100644
--- a/viz/cmd/uninstall.go
+++ b/viz/cmd/uninstall.go
@@ -80,7 +80,7 @@ func uninstallRunE(ctx context.Context) error {
 		}
 	}
 
-	srvs, err := k8sAPI.L5dCrdClient.ServerV1beta1().Servers(v1.NamespaceAll).List(ctx, metav1.ListOptions{LabelSelector: selector})
+	srvs, err := k8sAPI.L5dCrdClient.ServerV1beta2().Servers(v1.NamespaceAll).List(ctx, metav1.ListOptions{LabelSelector: selector})
 	if err != nil {
 		return err
 	}


Test patch:
diff --git a/cli/cmd/install_helm_test.go b/cli/cmd/install_helm_test.go
index d0a796f03..c13dc08f3 100644
--- a/cli/cmd/install_helm_test.go
+++ b/cli/cmd/install_helm_test.go
@@ -287,7 +287,7 @@ func chartControlPlane(t *testing.T, ha bool, additionalConfig string, ignoreOut
 
 	linkerd2Chart.AddDependency(chartPartials)
 
-	for _, filepath := range templatesControlPlane {
+	for _, filepath := range TemplatesControlPlane {
 		linkerd2Chart.Templates = append(linkerd2Chart.Templates, &chart.File{
 			Name: filepath,
 		})
diff --git a/cli/cmd/testdata/install_crds.golden b/cli/cmd/testdata/install_crds.golden
index 24aba5bb9..9896e11e4 100644
--- a/cli/cmd/testdata/install_crds.golden
+++ b/cli/cmd/testdata/install_crds.golden
@@ -6,7 +6,7 @@ metadata:
   annotations:
     linkerd.io/created-by: linkerd/cli dev-undefined
   labels:
-    helm.sh/chart: linkerd-crds-1.9.1-edge
+    helm.sh/chart: linkerd-crds-1.9.2-edge
     linkerd.io/control-plane-ns: linkerd
 spec:
   group: policy.linkerd.io
@@ -105,7 +105,7 @@ metadata:
   annotations:
     linkerd.io/created-by: linkerd/cli dev-undefined
   labels:
-    helm.sh/chart: linkerd-crds-1.9.1-edge
+    helm.sh/chart: linkerd-crds-1.9.2-edge
     linkerd.io/control-plane-ns: linkerd
 spec:
   group: policy.linkerd.io
@@ -5321,7 +5321,7 @@ metadata:
   annotations:
     linkerd.io/created-by: linkerd/cli dev-undefined
   labels:
-    helm.sh/chart: linkerd-crds-1.9.1-edge
+    helm.sh/chart: linkerd-crds-1.9.2-edge
     linkerd.io/control-plane-ns: linkerd
 spec:
   group: policy.linkerd.io
@@ -5408,7 +5408,7 @@ metadata:
   annotations:
     linkerd.io/created-by: linkerd/cli dev-undefined
   labels:
-    helm.sh/chart: linkerd-crds-1.9.1-edge
+    helm.sh/chart: linkerd-crds-1.9.2-edge
     linkerd.io/control-plane-ns: linkerd
 spec:
   group: policy.linkerd.io
@@ -5461,7 +5461,7 @@ metadata:
   annotations:
     linkerd.io/created-by: linkerd/cli dev-undefined
   labels:
-    helm.sh/chart: linkerd-crds-1.9.1-edge
+    helm.sh/chart: linkerd-crds-1.9.2-edge
     linkerd.io/control-plane-ns: linkerd
 spec:
   group: policy.linkerd.io
@@ -5727,7 +5727,7 @@ metadata:
   annotations:
     linkerd.io/created-by: linkerd/cli dev-undefined
   labels:
-    helm.sh/chart: linkerd-crds-1.9.1-edge
+    helm.sh/chart: linkerd-crds-1.9.2-edge
     linkerd.io/control-plane-ns: linkerd
 spec:
   group: policy.linkerd.io
@@ -5952,7 +5952,7 @@ metadata:
   annotations:
     linkerd.io/created-by: linkerd/cli dev-undefined
   labels:
-    helm.sh/chart: linkerd-crds-1.9.1-edge
+    helm.sh/chart: linkerd-crds-1.9.2-edge
     linkerd.io/control-plane-ns: linkerd
 spec:
   group: linkerd.io
@@ -6226,7 +6226,7 @@ metadata:
     gateway.networking.k8s.io/channel: experimental
     linkerd.io/created-by: linkerd/cli dev-undefined
   labels:
-    helm.sh/chart: linkerd-crds-1.9.1-edge
+    helm.sh/chart: linkerd-crds-1.9.2-edge
     linkerd.io/control-plane-ns: linkerd
   creationTimestamp: null
   name: httproutes.gateway.networking.k8s.io
@@ -10234,7 +10234,7 @@ metadata:
   annotations:
     linkerd.io/created-by: linkerd/cli dev-undefined
   labels:
-    helm.sh/chart: linkerd-crds-1.9.1-edge
+    helm.sh/chart: linkerd-crds-1.9.2-edge
     linkerd.io/control-plane-ns: linkerd
 spec:
   group: workload.linkerd.io
diff --git a/controller/api/destination/server_test.go b/controller/api/destination/server_test.go
index c5baa1bcc..5265804d9 100644
--- a/controller/api/destination/server_test.go
+++ b/controller/api/destination/server_test.go
@@ -11,7 +11,7 @@ import (
 	"github.com/linkerd/linkerd2-proxy-api/go/net"
 	"github.com/linkerd/linkerd2/controller/api/destination/watcher"
 	"github.com/linkerd/linkerd2/controller/api/util"
-	"github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta1"
+	"github.com/linkerd/linkerd2/controller/gen/apis/server/v1beta2"
 	"github.com/linkerd/linkerd2/controller/k8s"
 	"github.com/linkerd/linkerd2/pkg/addr"
 	pkgk8s "github.com/linkerd/linkerd2/pkg/k8s"
@@ -722,12 +722,12 @@ func TestGetProfiles(t *testing.T) {
 		}
 
 		// Server is created, setting the port to opaque
-		(*l5dClient).ServerV1beta1().Servers("ns").Create(context.Background(), &v1beta1.Server{
+		(*l5dClient).ServerV1beta2().Servers("ns").Create(context.Background(), &v1beta2.Server{
 			ObjectMeta: metav1.ObjectMeta{
 				Name:      "srv-hostport-mapping-2",
 				Namespace: "ns",
 			},
-			Spec: v1beta1.ServerSpec{
+			Spec: v1beta2.ServerSpec{
 				PodSelector: &metav1.LabelSelector{
 					MatchLabels: map[string]string{
 						"app": "hostport-mapping-2",
diff --git a/controller/api/destination/test_util.go b/controller/api/destination/test_util.go
index 3ae6430d7..d0e796128 100644
--- a/controller/api/destination/test_util.go
+++ b/controller/api/destination/test_util.go
@@ -328,7 +328,7 @@ spec:
         name: http
         protocol: TCP`,
 		`
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   name: srv
diff --git a/jaeger/cmd/testdata/install_collector_disabled.golden b/jaeger/cmd/testdata/install_collector_disabled.golden
index e194fe7c8..5840aac64 100644
--- a/jaeger/cmd/testdata/install_collector_disabled.golden
+++ b/jaeger/cmd/testdata/install_collector_disabled.golden
@@ -41,7 +41,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -collector-svc-addr=collector.linkerd-jaeger:55678
@@ -109,7 +109,7 @@ spec:
     port: 443
     targetPort: jaeger-injector
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -295,7 +295,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - --query.base-path=/jaeger
diff --git a/jaeger/cmd/testdata/install_default.golden b/jaeger/cmd/testdata/install_default.golden
index b60eeb99f..a07950d5b 100644
--- a/jaeger/cmd/testdata/install_default.golden
+++ b/jaeger/cmd/testdata/install_default.golden
@@ -41,7 +41,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -collector-svc-addr=collector.linkerd-jaeger:55678
@@ -109,7 +109,7 @@ spec:
     port: 443
     targetPort: jaeger-injector
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -454,7 +454,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - command:
         - /otelcol-contrib
@@ -569,7 +569,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - --query.base-path=/jaeger
@@ -601,7 +601,7 @@ spec:
           type: RuntimeDefault
       serviceAccountName: jaeger
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -618,7 +618,7 @@ spec:
   port: 4317
   proxyProtocol: gRPC
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -635,7 +635,7 @@ spec:
   port: 4318
   proxyProtocol: HTTP/1
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -652,7 +652,7 @@ spec:
   port: 55678
   proxyProtocol: gRPC
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -668,7 +668,7 @@ spec:
       component: collector
   port: 9411
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -684,7 +684,7 @@ spec:
       component: collector
   port: 14268
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -700,7 +700,7 @@ spec:
       component: collector
   port: 14250
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -825,7 +825,7 @@ spec:
   # allow connections from any pod (meshed or not) sending trace data
   requiredAuthenticationRefs: []
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -862,7 +862,7 @@ spec:
       name: collector
       namespace: linkerd-jaeger
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -900,7 +900,7 @@ spec:
       name: prometheus
       namespace: linkerd-viz
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
diff --git a/jaeger/cmd/testdata/install_jaeger_disabled.golden b/jaeger/cmd/testdata/install_jaeger_disabled.golden
index 0ddb4a50a..2b235d1c5 100644
--- a/jaeger/cmd/testdata/install_jaeger_disabled.golden
+++ b/jaeger/cmd/testdata/install_jaeger_disabled.golden
@@ -41,7 +41,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -collector-svc-addr=collector.linkerd-jaeger:55678
@@ -109,7 +109,7 @@ spec:
     port: 443
     targetPort: jaeger-injector
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -443,7 +443,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - command:
         - /otelcol-contrib
@@ -505,7 +505,7 @@ spec:
           name: collector-config
         name: collector-config-val
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -522,7 +522,7 @@ spec:
   port: 4317
   proxyProtocol: gRPC
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -539,7 +539,7 @@ spec:
   port: 4318
   proxyProtocol: HTTP/1
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -556,7 +556,7 @@ spec:
   port: 55678
   proxyProtocol: gRPC
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -572,7 +572,7 @@ spec:
       component: collector
   port: 9411
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -588,7 +588,7 @@ spec:
       component: collector
   port: 14268
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -604,7 +604,7 @@ spec:
       component: collector
   port: 14250
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -729,7 +729,7 @@ spec:
   # allow connections from any pod (meshed or not) sending trace data
   requiredAuthenticationRefs: []
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -766,7 +766,7 @@ spec:
       name: collector
       namespace: linkerd-jaeger
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
@@ -804,7 +804,7 @@ spec:
       name: prometheus
       namespace: linkerd-viz
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-jaeger
diff --git a/multicluster/cmd/testdata/install_default.golden b/multicluster/cmd/testdata/install_default.golden
index 0b78c556f..6b2a76798 100644
--- a/multicluster/cmd/testdata/install_default.golden
+++ b/multicluster/cmd/testdata/install_default.golden
@@ -38,7 +38,7 @@ spec:
         app: linkerd-gateway
         linkerd.io/extension: multicluster
     spec:
-      
+
       containers:
         - name: pause
           image: gcr.io/google_containers/pause:3.2
@@ -91,7 +91,7 @@ metadata:
   labels:
     linkerd.io/extension: multicluster
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-multicluster
@@ -355,7 +355,7 @@ spec:
     singular: link
     kind: Link
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-multicluster
diff --git a/multicluster/cmd/testdata/install_ha.golden b/multicluster/cmd/testdata/install_ha.golden
index e25b7d0e2..585efbaef 100644
--- a/multicluster/cmd/testdata/install_ha.golden
+++ b/multicluster/cmd/testdata/install_ha.golden
@@ -129,7 +129,7 @@ metadata:
   labels:
     linkerd.io/extension: multicluster
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-multicluster
@@ -427,7 +427,7 @@ spec:
     singular: link
     kind: Link
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-multicluster
diff --git a/multicluster/cmd/testdata/install_psp.golden b/multicluster/cmd/testdata/install_psp.golden
index c67b4300c..c3bf4e9e2 100644
--- a/multicluster/cmd/testdata/install_psp.golden
+++ b/multicluster/cmd/testdata/install_psp.golden
@@ -38,7 +38,7 @@ spec:
         app: linkerd-gateway
         linkerd.io/extension: multicluster
     spec:
-      
+
       containers:
         - name: pause
           image: gcr.io/google_containers/pause:3.2
@@ -91,7 +91,7 @@ metadata:
   labels:
     linkerd.io/extension: multicluster
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-multicluster
@@ -389,7 +389,7 @@ spec:
     singular: link
     kind: Link
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-multicluster
diff --git a/test/integration/install/smoke/testdata/smoke_test.yaml b/test/integration/install/smoke/testdata/smoke_test.yaml
index a75c47acf..30af66dc6 100644
--- a/test/integration/install/smoke/testdata/smoke_test.yaml
+++ b/test/integration/install/smoke/testdata/smoke_test.yaml
@@ -32,7 +32,7 @@ spec:
     port: 9090
     targetPort: 9090
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   name: smoke-test-terminus
@@ -93,7 +93,7 @@ spec:
     port: 8080
     targetPort: 8080
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   name: smoke-test-proxy-admin
diff --git a/test/integration/install/testdata/smoke_test.yaml b/test/integration/install/testdata/smoke_test.yaml
index a75c47acf..30af66dc6 100644
--- a/test/integration/install/testdata/smoke_test.yaml
+++ b/test/integration/install/testdata/smoke_test.yaml
@@ -32,7 +32,7 @@ spec:
     port: 9090
     targetPort: 9090
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   name: smoke-test-terminus
@@ -93,7 +93,7 @@ spec:
     port: 8080
     targetPort: 8080
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   name: smoke-test-proxy-admin
diff --git a/test/integration/viz/policy/testdata/emoji-policy.yaml b/test/integration/viz/policy/testdata/emoji-policy.yaml
index 1232f4a47..34e70a401 100644
--- a/test/integration/viz/policy/testdata/emoji-policy.yaml
+++ b/test/integration/viz/policy/testdata/emoji-policy.yaml
@@ -1,5 +1,5 @@
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   name: emoji-grpc
@@ -31,7 +31,7 @@ spec:
       identities:
         - "*.linkerd-stat-authz-test.serviceaccount.identity.linkerd.cluster.local"
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   name: voting-grpc
@@ -61,7 +61,7 @@ spec:
       serviceAccounts:
         - name: web
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   name: web-http
diff --git a/viz/cmd/testdata/install_default.golden b/viz/cmd/testdata/install_default.golden
index 45c977391..575cdfbe2 100644
--- a/viz/cmd/testdata/install_default.golden
+++ b/viz/cmd/testdata/install_default.golden
@@ -418,7 +418,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -controller-namespace=linkerd
@@ -461,7 +461,7 @@ spec:
           type: RuntimeDefault
       serviceAccountName: metrics-api
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -781,7 +781,7 @@ spec:
           name: prometheus-config
         name: prometheus-config
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -884,7 +884,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - api
@@ -937,7 +937,7 @@ spec:
         secret:
           secretName: tap-k8s-tls
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -1099,7 +1099,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - injector
@@ -1149,7 +1149,7 @@ spec:
         secret:
           secretName: tap-injector-k8s-tls
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -1217,7 +1217,7 @@ metadata:
     namespace: linkerd-viz
   annotations:
     linkerd.io/created-by: linkerd/helm dev-undefined
-    
+
     linkerd.io/inject: enabled
 spec:
   type: ClusterIP
@@ -1269,7 +1269,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -linkerd-metrics-api-addr=metrics-api.linkerd-viz.svc.cluster.local:8085
diff --git a/viz/cmd/testdata/install_default_overrides.golden b/viz/cmd/testdata/install_default_overrides.golden
index 8b6098b3a..edfc1a2cb 100644
--- a/viz/cmd/testdata/install_default_overrides.golden
+++ b/viz/cmd/testdata/install_default_overrides.golden
@@ -418,7 +418,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -controller-namespace=linkerd
@@ -461,7 +461,7 @@ spec:
           type: RuntimeDefault
       serviceAccountName: metrics-api
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -781,7 +781,7 @@ spec:
           name: prometheus-config
         name: prometheus-config
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -884,7 +884,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - api
@@ -937,7 +937,7 @@ spec:
         secret:
           secretName: tap-k8s-tls
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -1099,7 +1099,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - injector
@@ -1149,7 +1149,7 @@ spec:
         secret:
           secretName: tap-injector-k8s-tls
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -1217,7 +1217,7 @@ metadata:
     namespace: linkerd-viz
   annotations:
     linkerd.io/created-by: linkerd/helm dev-undefined
-    
+
     linkerd.io/inject: enabled
 spec:
   type: ClusterIP
@@ -1269,7 +1269,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -linkerd-metrics-api-addr=metrics-api.linkerd-viz.svc.cluster.local:8085
diff --git a/viz/cmd/testdata/install_prometheus_disabled.golden b/viz/cmd/testdata/install_prometheus_disabled.golden
index bedafbf99..960f1204f 100644
--- a/viz/cmd/testdata/install_prometheus_disabled.golden
+++ b/viz/cmd/testdata/install_prometheus_disabled.golden
@@ -378,7 +378,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -controller-namespace=linkerd
@@ -421,7 +421,7 @@ spec:
           type: RuntimeDefault
       serviceAccountName: metrics-api
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -490,7 +490,7 @@ spec:
   - cidr: "0.0.0.0/0"
   - cidr: "::/0"
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -593,7 +593,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - api
@@ -646,7 +646,7 @@ spec:
         secret:
           secretName: tap-k8s-tls
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -808,7 +808,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - injector
@@ -858,7 +858,7 @@ spec:
         secret:
           secretName: tap-injector-k8s-tls
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -926,7 +926,7 @@ metadata:
     namespace: linkerd-viz
   annotations:
     linkerd.io/created-by: linkerd/helm dev-undefined
-    
+
     linkerd.io/inject: enabled
 spec:
   type: ClusterIP
@@ -978,7 +978,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -linkerd-metrics-api-addr=metrics-api.linkerd-viz.svc.cluster.local:8085
diff --git a/viz/cmd/testdata/install_prometheus_loglevel_from_args.golden b/viz/cmd/testdata/install_prometheus_loglevel_from_args.golden
index 73cc6a799..d949059c0 100644
--- a/viz/cmd/testdata/install_prometheus_loglevel_from_args.golden
+++ b/viz/cmd/testdata/install_prometheus_loglevel_from_args.golden
@@ -418,7 +418,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -controller-namespace=linkerd
@@ -461,7 +461,7 @@ spec:
           type: RuntimeDefault
       serviceAccountName: metrics-api
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -781,7 +781,7 @@ spec:
           name: prometheus-config
         name: prometheus-config
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -884,7 +884,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - api
@@ -937,7 +937,7 @@ spec:
         secret:
           secretName: tap-k8s-tls
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -1099,7 +1099,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - injector
@@ -1149,7 +1149,7 @@ spec:
         secret:
           secretName: tap-injector-k8s-tls
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -1217,7 +1217,7 @@ metadata:
     namespace: linkerd-viz
   annotations:
     linkerd.io/created-by: linkerd/helm dev-undefined
-    
+
     linkerd.io/inject: enabled
 spec:
   type: ClusterIP
@@ -1269,7 +1269,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -linkerd-metrics-api-addr=metrics-api.linkerd-viz.svc.cluster.local:8085
diff --git a/viz/cmd/testdata/install_proxy_resources.golden b/viz/cmd/testdata/install_proxy_resources.golden
index 3581b7f79..f7fbc2147 100644
--- a/viz/cmd/testdata/install_proxy_resources.golden
+++ b/viz/cmd/testdata/install_proxy_resources.golden
@@ -418,7 +418,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -controller-namespace=linkerd
@@ -461,7 +461,7 @@ spec:
           type: RuntimeDefault
       serviceAccountName: metrics-api
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -785,7 +785,7 @@ spec:
           name: prometheus-config
         name: prometheus-config
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -892,7 +892,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - api
@@ -945,7 +945,7 @@ spec:
         secret:
           secretName: tap-k8s-tls
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -1107,7 +1107,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - injector
@@ -1157,7 +1157,7 @@ spec:
         secret:
           secretName: tap-injector-k8s-tls
 ---
-apiVersion: policy.linkerd.io/v1beta1
+apiVersion: policy.linkerd.io/v1beta2
 kind: Server
 metadata:
   namespace: linkerd-viz
@@ -1225,7 +1225,7 @@ metadata:
     namespace: linkerd-viz
   annotations:
     linkerd.io/created-by: linkerd/helm dev-undefined
-    
+
     linkerd.io/inject: enabled
 spec:
   type: ClusterIP
@@ -1281,7 +1281,7 @@ spec:
     spec:
       nodeSelector:
         kubernetes.io/os: linux
-      
+
       containers:
       - args:
         - -linkerd-metrics-api-addr=metrics-api.linkerd-viz.svc.cluster.local:8085