diff --git a/linkerd.io/content/2.12/features/topology-aware-routing.md b/linkerd.io/content/2.12/features/topology-aware-routing.md
new file mode 100644
index 0000000000..245c39100d
--- /dev/null
+++ b/linkerd.io/content/2.12/features/topology-aware-routing.md
@@ -0,0 +1,47 @@
+---
+title: Topology Aware Routing
+description: |-
+ Linkerd's implementation of Kubernetes topology aware routing enables endpoint consumption based on a node's zone label.
+---
+
+Kubernetes clusters are increasingly deployed in multi-zone environments with
+network traffic often relying on obscure endpoint matching and routing for a
+given service. Linkerd's implementation of Kubernetes ([Topology Aware
+Routing][topology aware routing]) provides users with a mechanism for
+asserting more control over endpoint selection and routing within a cluster
+that spans multiple zones. Users can now implement routing constraints and
+prefer endpoints in a specific zone in order to limit cross-zone networking
+costs or improve performance through lowered cross-zone latency and bandwidth
+constraints.
+
+The goal of topology aware routing is to to provide a simpler way for users to
+prefer endpoints by basing decisions solely off the node's
+`topology.kubernetes.io/zone` label. If a client is in `zone-a`, then it
+should prefer endpoints marked for use by clients in `zone-a`. When the
+feature is enabled and the label set, Linkerd's destination controller will
+attempt to find endpoints whose `routing.ForZones` field matches the client's
+zone.
+
+To get started with topology aware routing take a look at the [enabling
+topology aware routing](../../tasks/enabling-topology-aware-routing/) task
+documentation.
+
+[topology aware routing]:
+ https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/
+
+{{< note >}}
+
+Topology aware routing requires that the cluster have the `TopologyAwareHints`
+feature gate enabled (which is the default starting with Kubernetes 1.24), and
+that Linkerd's `endpointSlice` feature be turned on (this is the default
+starting with Linkerd stable-2.12).
+
+{{< /note >}}
+
+{{< note >}}
+
+Starting in Kubernetes 1.31, Kubernetes also has the `trafficDistribution`
+feature available as an alternative to topology aware routing.
+`trafficDistribution` is not yet supported by Linkerd.
+
+{{< /note >}}
diff --git a/linkerd.io/content/2.12/tasks/enabling-topology-aware-routing.md b/linkerd.io/content/2.12/tasks/enabling-topology-aware-routing.md
new file mode 100644
index 0000000000..fd5f8d5f0b
--- /dev/null
+++ b/linkerd.io/content/2.12/tasks/enabling-topology-aware-routing.md
@@ -0,0 +1,77 @@
+---
+title: "Enabling Topology Aware Routing"
+description: |-
+ Enable topology aware routing to allow Linkerd to intelligently choose same-zone endpoints
+---
+
+[Topology aware routing](../../features/topology-aware-routing/) allows
+Linkerd users to specify endpoint selection boundaries when a request is made
+against a service, making it possible to limit cross-zone endpoint selection
+and lower the associated costs and latency.
+
+There are three requirements to successfully enabling topology aware routing
+with Linkerd:
+
+1. The `TopologyAwareHints` feature gate MUST be enabled on the Kubernetes
+ cluster. (This feature gate is enabled by default in Kubernetes 1.24 and
+ later.)
+
+2. Each Kubernetes node needs to be assigned to a zone, using
+ `"topology.kubernetes.io/zone` label.
+
+3. Relevant Kubernetes services will need to be modified with the
+ `service.kubernetes.io/topology-aware-hints=auto` annotation.
+
+When Linkerd receives a set of endpoint slices and translates them to an
+address set, a copy of the `Hints.forZones` field is made from each endpoint
+slice if one is present. This field is only present if it's set by the
+endpoint slice controller, and there are several
+[safeguards][topology-aware-routing-safeguards] that Kubernetes checks before
+setting it. To have the endpoint slice controller set the `forZones` field
+users will have to add the `service.kubernetes.io/topology-aware-hints=auto`
+annotation to the service.
+
+After the endpoints have been translated into an address set and the endpoint
+translator's available endpoints have been updated, filtering is applied to
+ensure only the relevant sets of addresses are returned when a request is
+made.
+
+For each potential address in the available endpoint set Linkerd returns a set
+of addresses whose consumption zone (zones in `forZones` field) matches that
+of the node's zone. By doing so Linkerd ensures communication is limited to
+endpoints that have been labeled by the endpoint slice controller for the same
+node the client is on and limits cross-node and cross-zone communication.
+
+## Constraints
+
+Kubernetes places some [constraints][topology-aware-routing-constraints] on
+topology aware routing that you should review before trying to enable topology
+aware routing on Linkerd.
+
+The main things to be aware of are:
+
+- Topology aware routing assumes that traffic to a given zone will be roughly
+ proportional to the capacity of the nodes in the zone. This can be a concern
+ when using horizontal pod autoscaling, as HPA may start nodes in the "wrong"
+ zone.
+
+- Services with `internalTrafficPolicy` set to `Local` ignore topology aware
+ routing, by design.
+
+- If you have workloads running on Nodes labeled with `control-plane` or
+ `master` role, topology aware routing will not route to endpoints on these
+ Nodes.
+
+## Configuring Topology Aware Routing
+
+Successful topology aware routing can be confirmed by looking at the Linkerd
+proxy logs for the relevant service. The logs should show a stream of messages
+similar to the ones below:
+
+```text
+time="2021-08-27T14:04:35Z" level=info msg="Establishing watch on endpoint [default/nginx-deploy-svc:80]" addr=":8086" component=endpoints-watcher
+time="2021-08-27T14:04:35Z" level=debug msg="Filtering through addresses that should be consumed by zone zone-b" addr=":8086" component=endpoint-translator remote="127.0.0.1:49846" service="nginx-deploy-svc.default.svc.cluster.local:80"
+```
+
+[topology-aware-routing-safeguards]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#safeguards
+[topology-aware-routing-constraints]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#constraints
diff --git a/linkerd.io/content/2.13/features/topology-aware-routing.md b/linkerd.io/content/2.13/features/topology-aware-routing.md
new file mode 100644
index 0000000000..245c39100d
--- /dev/null
+++ b/linkerd.io/content/2.13/features/topology-aware-routing.md
@@ -0,0 +1,47 @@
+---
+title: Topology Aware Routing
+description: |-
+ Linkerd's implementation of Kubernetes topology aware routing enables endpoint consumption based on a node's zone label.
+---
+
+Kubernetes clusters are increasingly deployed in multi-zone environments with
+network traffic often relying on obscure endpoint matching and routing for a
+given service. Linkerd's implementation of Kubernetes ([Topology Aware
+Routing][topology aware routing]) provides users with a mechanism for
+asserting more control over endpoint selection and routing within a cluster
+that spans multiple zones. Users can now implement routing constraints and
+prefer endpoints in a specific zone in order to limit cross-zone networking
+costs or improve performance through lowered cross-zone latency and bandwidth
+constraints.
+
+The goal of topology aware routing is to to provide a simpler way for users to
+prefer endpoints by basing decisions solely off the node's
+`topology.kubernetes.io/zone` label. If a client is in `zone-a`, then it
+should prefer endpoints marked for use by clients in `zone-a`. When the
+feature is enabled and the label set, Linkerd's destination controller will
+attempt to find endpoints whose `routing.ForZones` field matches the client's
+zone.
+
+To get started with topology aware routing take a look at the [enabling
+topology aware routing](../../tasks/enabling-topology-aware-routing/) task
+documentation.
+
+[topology aware routing]:
+ https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/
+
+{{< note >}}
+
+Topology aware routing requires that the cluster have the `TopologyAwareHints`
+feature gate enabled (which is the default starting with Kubernetes 1.24), and
+that Linkerd's `endpointSlice` feature be turned on (this is the default
+starting with Linkerd stable-2.12).
+
+{{< /note >}}
+
+{{< note >}}
+
+Starting in Kubernetes 1.31, Kubernetes also has the `trafficDistribution`
+feature available as an alternative to topology aware routing.
+`trafficDistribution` is not yet supported by Linkerd.
+
+{{< /note >}}
diff --git a/linkerd.io/content/2.13/tasks/enabling-topology-aware-routing.md b/linkerd.io/content/2.13/tasks/enabling-topology-aware-routing.md
new file mode 100644
index 0000000000..fd5f8d5f0b
--- /dev/null
+++ b/linkerd.io/content/2.13/tasks/enabling-topology-aware-routing.md
@@ -0,0 +1,77 @@
+---
+title: "Enabling Topology Aware Routing"
+description: |-
+ Enable topology aware routing to allow Linkerd to intelligently choose same-zone endpoints
+---
+
+[Topology aware routing](../../features/topology-aware-routing/) allows
+Linkerd users to specify endpoint selection boundaries when a request is made
+against a service, making it possible to limit cross-zone endpoint selection
+and lower the associated costs and latency.
+
+There are three requirements to successfully enabling topology aware routing
+with Linkerd:
+
+1. The `TopologyAwareHints` feature gate MUST be enabled on the Kubernetes
+ cluster. (This feature gate is enabled by default in Kubernetes 1.24 and
+ later.)
+
+2. Each Kubernetes node needs to be assigned to a zone, using
+ `"topology.kubernetes.io/zone` label.
+
+3. Relevant Kubernetes services will need to be modified with the
+ `service.kubernetes.io/topology-aware-hints=auto` annotation.
+
+When Linkerd receives a set of endpoint slices and translates them to an
+address set, a copy of the `Hints.forZones` field is made from each endpoint
+slice if one is present. This field is only present if it's set by the
+endpoint slice controller, and there are several
+[safeguards][topology-aware-routing-safeguards] that Kubernetes checks before
+setting it. To have the endpoint slice controller set the `forZones` field
+users will have to add the `service.kubernetes.io/topology-aware-hints=auto`
+annotation to the service.
+
+After the endpoints have been translated into an address set and the endpoint
+translator's available endpoints have been updated, filtering is applied to
+ensure only the relevant sets of addresses are returned when a request is
+made.
+
+For each potential address in the available endpoint set Linkerd returns a set
+of addresses whose consumption zone (zones in `forZones` field) matches that
+of the node's zone. By doing so Linkerd ensures communication is limited to
+endpoints that have been labeled by the endpoint slice controller for the same
+node the client is on and limits cross-node and cross-zone communication.
+
+## Constraints
+
+Kubernetes places some [constraints][topology-aware-routing-constraints] on
+topology aware routing that you should review before trying to enable topology
+aware routing on Linkerd.
+
+The main things to be aware of are:
+
+- Topology aware routing assumes that traffic to a given zone will be roughly
+ proportional to the capacity of the nodes in the zone. This can be a concern
+ when using horizontal pod autoscaling, as HPA may start nodes in the "wrong"
+ zone.
+
+- Services with `internalTrafficPolicy` set to `Local` ignore topology aware
+ routing, by design.
+
+- If you have workloads running on Nodes labeled with `control-plane` or
+ `master` role, topology aware routing will not route to endpoints on these
+ Nodes.
+
+## Configuring Topology Aware Routing
+
+Successful topology aware routing can be confirmed by looking at the Linkerd
+proxy logs for the relevant service. The logs should show a stream of messages
+similar to the ones below:
+
+```text
+time="2021-08-27T14:04:35Z" level=info msg="Establishing watch on endpoint [default/nginx-deploy-svc:80]" addr=":8086" component=endpoints-watcher
+time="2021-08-27T14:04:35Z" level=debug msg="Filtering through addresses that should be consumed by zone zone-b" addr=":8086" component=endpoint-translator remote="127.0.0.1:49846" service="nginx-deploy-svc.default.svc.cluster.local:80"
+```
+
+[topology-aware-routing-safeguards]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#safeguards
+[topology-aware-routing-constraints]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#constraints
diff --git a/linkerd.io/content/2.14/features/topology-aware-routing.md b/linkerd.io/content/2.14/features/topology-aware-routing.md
new file mode 100644
index 0000000000..245c39100d
--- /dev/null
+++ b/linkerd.io/content/2.14/features/topology-aware-routing.md
@@ -0,0 +1,47 @@
+---
+title: Topology Aware Routing
+description: |-
+ Linkerd's implementation of Kubernetes topology aware routing enables endpoint consumption based on a node's zone label.
+---
+
+Kubernetes clusters are increasingly deployed in multi-zone environments with
+network traffic often relying on obscure endpoint matching and routing for a
+given service. Linkerd's implementation of Kubernetes ([Topology Aware
+Routing][topology aware routing]) provides users with a mechanism for
+asserting more control over endpoint selection and routing within a cluster
+that spans multiple zones. Users can now implement routing constraints and
+prefer endpoints in a specific zone in order to limit cross-zone networking
+costs or improve performance through lowered cross-zone latency and bandwidth
+constraints.
+
+The goal of topology aware routing is to to provide a simpler way for users to
+prefer endpoints by basing decisions solely off the node's
+`topology.kubernetes.io/zone` label. If a client is in `zone-a`, then it
+should prefer endpoints marked for use by clients in `zone-a`. When the
+feature is enabled and the label set, Linkerd's destination controller will
+attempt to find endpoints whose `routing.ForZones` field matches the client's
+zone.
+
+To get started with topology aware routing take a look at the [enabling
+topology aware routing](../../tasks/enabling-topology-aware-routing/) task
+documentation.
+
+[topology aware routing]:
+ https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/
+
+{{< note >}}
+
+Topology aware routing requires that the cluster have the `TopologyAwareHints`
+feature gate enabled (which is the default starting with Kubernetes 1.24), and
+that Linkerd's `endpointSlice` feature be turned on (this is the default
+starting with Linkerd stable-2.12).
+
+{{< /note >}}
+
+{{< note >}}
+
+Starting in Kubernetes 1.31, Kubernetes also has the `trafficDistribution`
+feature available as an alternative to topology aware routing.
+`trafficDistribution` is not yet supported by Linkerd.
+
+{{< /note >}}
diff --git a/linkerd.io/content/2.14/tasks/enabling-topology-aware-routing.md b/linkerd.io/content/2.14/tasks/enabling-topology-aware-routing.md
new file mode 100644
index 0000000000..fd5f8d5f0b
--- /dev/null
+++ b/linkerd.io/content/2.14/tasks/enabling-topology-aware-routing.md
@@ -0,0 +1,77 @@
+---
+title: "Enabling Topology Aware Routing"
+description: |-
+ Enable topology aware routing to allow Linkerd to intelligently choose same-zone endpoints
+---
+
+[Topology aware routing](../../features/topology-aware-routing/) allows
+Linkerd users to specify endpoint selection boundaries when a request is made
+against a service, making it possible to limit cross-zone endpoint selection
+and lower the associated costs and latency.
+
+There are three requirements to successfully enabling topology aware routing
+with Linkerd:
+
+1. The `TopologyAwareHints` feature gate MUST be enabled on the Kubernetes
+ cluster. (This feature gate is enabled by default in Kubernetes 1.24 and
+ later.)
+
+2. Each Kubernetes node needs to be assigned to a zone, using
+ `"topology.kubernetes.io/zone` label.
+
+3. Relevant Kubernetes services will need to be modified with the
+ `service.kubernetes.io/topology-aware-hints=auto` annotation.
+
+When Linkerd receives a set of endpoint slices and translates them to an
+address set, a copy of the `Hints.forZones` field is made from each endpoint
+slice if one is present. This field is only present if it's set by the
+endpoint slice controller, and there are several
+[safeguards][topology-aware-routing-safeguards] that Kubernetes checks before
+setting it. To have the endpoint slice controller set the `forZones` field
+users will have to add the `service.kubernetes.io/topology-aware-hints=auto`
+annotation to the service.
+
+After the endpoints have been translated into an address set and the endpoint
+translator's available endpoints have been updated, filtering is applied to
+ensure only the relevant sets of addresses are returned when a request is
+made.
+
+For each potential address in the available endpoint set Linkerd returns a set
+of addresses whose consumption zone (zones in `forZones` field) matches that
+of the node's zone. By doing so Linkerd ensures communication is limited to
+endpoints that have been labeled by the endpoint slice controller for the same
+node the client is on and limits cross-node and cross-zone communication.
+
+## Constraints
+
+Kubernetes places some [constraints][topology-aware-routing-constraints] on
+topology aware routing that you should review before trying to enable topology
+aware routing on Linkerd.
+
+The main things to be aware of are:
+
+- Topology aware routing assumes that traffic to a given zone will be roughly
+ proportional to the capacity of the nodes in the zone. This can be a concern
+ when using horizontal pod autoscaling, as HPA may start nodes in the "wrong"
+ zone.
+
+- Services with `internalTrafficPolicy` set to `Local` ignore topology aware
+ routing, by design.
+
+- If you have workloads running on Nodes labeled with `control-plane` or
+ `master` role, topology aware routing will not route to endpoints on these
+ Nodes.
+
+## Configuring Topology Aware Routing
+
+Successful topology aware routing can be confirmed by looking at the Linkerd
+proxy logs for the relevant service. The logs should show a stream of messages
+similar to the ones below:
+
+```text
+time="2021-08-27T14:04:35Z" level=info msg="Establishing watch on endpoint [default/nginx-deploy-svc:80]" addr=":8086" component=endpoints-watcher
+time="2021-08-27T14:04:35Z" level=debug msg="Filtering through addresses that should be consumed by zone zone-b" addr=":8086" component=endpoint-translator remote="127.0.0.1:49846" service="nginx-deploy-svc.default.svc.cluster.local:80"
+```
+
+[topology-aware-routing-safeguards]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#safeguards
+[topology-aware-routing-constraints]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#constraints
diff --git a/linkerd.io/content/2.15/features/topology-aware-routing.md b/linkerd.io/content/2.15/features/topology-aware-routing.md
new file mode 100644
index 0000000000..245c39100d
--- /dev/null
+++ b/linkerd.io/content/2.15/features/topology-aware-routing.md
@@ -0,0 +1,47 @@
+---
+title: Topology Aware Routing
+description: |-
+ Linkerd's implementation of Kubernetes topology aware routing enables endpoint consumption based on a node's zone label.
+---
+
+Kubernetes clusters are increasingly deployed in multi-zone environments with
+network traffic often relying on obscure endpoint matching and routing for a
+given service. Linkerd's implementation of Kubernetes ([Topology Aware
+Routing][topology aware routing]) provides users with a mechanism for
+asserting more control over endpoint selection and routing within a cluster
+that spans multiple zones. Users can now implement routing constraints and
+prefer endpoints in a specific zone in order to limit cross-zone networking
+costs or improve performance through lowered cross-zone latency and bandwidth
+constraints.
+
+The goal of topology aware routing is to to provide a simpler way for users to
+prefer endpoints by basing decisions solely off the node's
+`topology.kubernetes.io/zone` label. If a client is in `zone-a`, then it
+should prefer endpoints marked for use by clients in `zone-a`. When the
+feature is enabled and the label set, Linkerd's destination controller will
+attempt to find endpoints whose `routing.ForZones` field matches the client's
+zone.
+
+To get started with topology aware routing take a look at the [enabling
+topology aware routing](../../tasks/enabling-topology-aware-routing/) task
+documentation.
+
+[topology aware routing]:
+ https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/
+
+{{< note >}}
+
+Topology aware routing requires that the cluster have the `TopologyAwareHints`
+feature gate enabled (which is the default starting with Kubernetes 1.24), and
+that Linkerd's `endpointSlice` feature be turned on (this is the default
+starting with Linkerd stable-2.12).
+
+{{< /note >}}
+
+{{< note >}}
+
+Starting in Kubernetes 1.31, Kubernetes also has the `trafficDistribution`
+feature available as an alternative to topology aware routing.
+`trafficDistribution` is not yet supported by Linkerd.
+
+{{< /note >}}
diff --git a/linkerd.io/content/2.15/tasks/enabling-topology-aware-routing.md b/linkerd.io/content/2.15/tasks/enabling-topology-aware-routing.md
new file mode 100644
index 0000000000..fd5f8d5f0b
--- /dev/null
+++ b/linkerd.io/content/2.15/tasks/enabling-topology-aware-routing.md
@@ -0,0 +1,77 @@
+---
+title: "Enabling Topology Aware Routing"
+description: |-
+ Enable topology aware routing to allow Linkerd to intelligently choose same-zone endpoints
+---
+
+[Topology aware routing](../../features/topology-aware-routing/) allows
+Linkerd users to specify endpoint selection boundaries when a request is made
+against a service, making it possible to limit cross-zone endpoint selection
+and lower the associated costs and latency.
+
+There are three requirements to successfully enabling topology aware routing
+with Linkerd:
+
+1. The `TopologyAwareHints` feature gate MUST be enabled on the Kubernetes
+ cluster. (This feature gate is enabled by default in Kubernetes 1.24 and
+ later.)
+
+2. Each Kubernetes node needs to be assigned to a zone, using
+ `"topology.kubernetes.io/zone` label.
+
+3. Relevant Kubernetes services will need to be modified with the
+ `service.kubernetes.io/topology-aware-hints=auto` annotation.
+
+When Linkerd receives a set of endpoint slices and translates them to an
+address set, a copy of the `Hints.forZones` field is made from each endpoint
+slice if one is present. This field is only present if it's set by the
+endpoint slice controller, and there are several
+[safeguards][topology-aware-routing-safeguards] that Kubernetes checks before
+setting it. To have the endpoint slice controller set the `forZones` field
+users will have to add the `service.kubernetes.io/topology-aware-hints=auto`
+annotation to the service.
+
+After the endpoints have been translated into an address set and the endpoint
+translator's available endpoints have been updated, filtering is applied to
+ensure only the relevant sets of addresses are returned when a request is
+made.
+
+For each potential address in the available endpoint set Linkerd returns a set
+of addresses whose consumption zone (zones in `forZones` field) matches that
+of the node's zone. By doing so Linkerd ensures communication is limited to
+endpoints that have been labeled by the endpoint slice controller for the same
+node the client is on and limits cross-node and cross-zone communication.
+
+## Constraints
+
+Kubernetes places some [constraints][topology-aware-routing-constraints] on
+topology aware routing that you should review before trying to enable topology
+aware routing on Linkerd.
+
+The main things to be aware of are:
+
+- Topology aware routing assumes that traffic to a given zone will be roughly
+ proportional to the capacity of the nodes in the zone. This can be a concern
+ when using horizontal pod autoscaling, as HPA may start nodes in the "wrong"
+ zone.
+
+- Services with `internalTrafficPolicy` set to `Local` ignore topology aware
+ routing, by design.
+
+- If you have workloads running on Nodes labeled with `control-plane` or
+ `master` role, topology aware routing will not route to endpoints on these
+ Nodes.
+
+## Configuring Topology Aware Routing
+
+Successful topology aware routing can be confirmed by looking at the Linkerd
+proxy logs for the relevant service. The logs should show a stream of messages
+similar to the ones below:
+
+```text
+time="2021-08-27T14:04:35Z" level=info msg="Establishing watch on endpoint [default/nginx-deploy-svc:80]" addr=":8086" component=endpoints-watcher
+time="2021-08-27T14:04:35Z" level=debug msg="Filtering through addresses that should be consumed by zone zone-b" addr=":8086" component=endpoint-translator remote="127.0.0.1:49846" service="nginx-deploy-svc.default.svc.cluster.local:80"
+```
+
+[topology-aware-routing-safeguards]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#safeguards
+[topology-aware-routing-constraints]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#constraints
diff --git a/linkerd.io/content/2.16/features/topology-aware-routing.md b/linkerd.io/content/2.16/features/topology-aware-routing.md
new file mode 100644
index 0000000000..3d826eaaac
--- /dev/null
+++ b/linkerd.io/content/2.16/features/topology-aware-routing.md
@@ -0,0 +1,59 @@
+---
+title: Topology Aware Routing
+description: |-
+ Linkerd's implementation of Kubernetes topology aware routing enables endpoint consumption based on a node's zone label.
+---
+
+Kubernetes clusters are increasingly deployed in multi-zone environments with
+network traffic often relying on obscure endpoint matching and routing for a
+given service. Linkerd's implementation of Kubernetes ([Topology Aware
+Routing][topology aware routing]) provides users with a mechanism for
+asserting more control over endpoint selection and routing within a cluster
+that spans multiple zones. Users can now implement routing constraints and
+prefer endpoints in a specific zone in order to limit cross-zone networking
+costs or improve performance through lowered cross-zone latency and bandwidth
+constraints.
+
+The goal of topology aware routing is to to provide a simpler way for users to
+prefer endpoints by basing decisions solely off the node's
+`topology.kubernetes.io/zone` label. If a client is in `zone-a`, then it
+should prefer endpoints marked for use by clients in `zone-a`. When the
+feature is enabled and the label set, Linkerd's destination controller will
+attempt to find endpoints whose `routing.ForZones` field matches the client's
+zone.
+
+{{< note >}}
+
+If you're using a [stable distribution](/releases/) of Linkerd, it may have
+additional features related to topology-aware routing (for example, Buoyant Enterprise for
+Linkerd and its HAZL
+feature). You can find more information about the different kinds of Linkerd
+releases on the [Releases and Versions](/releases/) page.
+
+{{< /note >}}
+
+To get started with topology aware routing take a look at the [enabling
+topology aware routing](../../tasks/enabling-topology-aware-routing/) task
+documentation.
+
+[topology aware routing]:
+ https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/
+
+{{< note >}}
+
+Topology aware routing requires that the cluster have the `TopologyAwareHints`
+feature gate enabled (which is the default starting with Kubernetes 1.24), and
+that Linkerd's `endpointSlice` feature be turned on (this is the default
+starting with Linkerd stable-2.12).
+
+{{< /note >}}
+
+{{< note >}}
+
+Starting in Kubernetes 1.31, Kubernetes also has the `trafficDistribution`
+feature available as an alternative to topology aware routing.
+`trafficDistribution` is not yet supported by Linkerd.
+
+{{< /note >}}
diff --git a/linkerd.io/content/2.16/tasks/enabling-topology-aware-routing.md b/linkerd.io/content/2.16/tasks/enabling-topology-aware-routing.md
new file mode 100644
index 0000000000..0d1b786d40
--- /dev/null
+++ b/linkerd.io/content/2.16/tasks/enabling-topology-aware-routing.md
@@ -0,0 +1,89 @@
+---
+title: "Enabling Topology Aware Routing"
+description: |-
+ Enable topology aware routing to allow Linkerd to intelligently choose same-zone endpoints
+---
+
+[Topology aware routing](../../features/topology-aware-routing/) allows
+Linkerd users to specify endpoint selection boundaries when a request is made
+against a service, making it possible to limit cross-zone endpoint selection
+and lower the associated costs and latency.
+
+{{< note >}}
+
+If you're using a [stable distribution](/releases/) of Linkerd, it may have
+additional features related to topology-aware routing (for example, Buoyant Enterprise for
+Linkerd and its HAZL
+feature). You can find more information about the different kinds of Linkerd
+releases on the [Releases and Versions](/releases/) page.
+
+{{< /note >}}
+
+There are three requirements to successfully enabling topology aware routing
+with Linkerd:
+
+1. The `TopologyAwareHints` feature gate MUST be enabled on the Kubernetes
+ cluster. (This feature gate is enabled by default in Kubernetes 1.24 and
+ later.)
+
+2. Each Kubernetes node needs to be assigned to a zone, using
+ `"topology.kubernetes.io/zone` label.
+
+3. Relevant Kubernetes services will need to be modified with the
+ `service.kubernetes.io/topology-aware-hints=auto` annotation.
+
+When Linkerd receives a set of endpoint slices and translates them to an
+address set, a copy of the `Hints.forZones` field is made from each endpoint
+slice if one is present. This field is only present if it's set by the
+endpoint slice controller, and there are several
+[safeguards][topology-aware-routing-safeguards] that Kubernetes checks before
+setting it. To have the endpoint slice controller set the `forZones` field
+users will have to add the `service.kubernetes.io/topology-aware-hints=auto`
+annotation to the service.
+
+After the endpoints have been translated into an address set and the endpoint
+translator's available endpoints have been updated, filtering is applied to
+ensure only the relevant sets of addresses are returned when a request is
+made.
+
+For each potential address in the available endpoint set Linkerd returns a set
+of addresses whose consumption zone (zones in `forZones` field) matches that
+of the node's zone. By doing so Linkerd ensures communication is limited to
+endpoints that have been labeled by the endpoint slice controller for the same
+node the client is on and limits cross-node and cross-zone communication.
+
+## Constraints
+
+Kubernetes places some [constraints][topology-aware-routing-constraints] on
+topology aware routing that you should review before trying to enable topology
+aware routing on Linkerd.
+
+The main things to be aware of are:
+
+- Topology aware routing assumes that traffic to a given zone will be roughly
+ proportional to the capacity of the nodes in the zone. This can be a concern
+ when using horizontal pod autoscaling, as HPA may start nodes in the "wrong"
+ zone.
+
+- Services with `internalTrafficPolicy` set to `Local` ignore topology aware
+ routing, by design.
+
+- If you have workloads running on Nodes labeled with `control-plane` or
+ `master` role, topology aware routing will not route to endpoints on these
+ Nodes.
+
+## Configuring Topology Aware Routing
+
+Successful topology aware routing can be confirmed by looking at the Linkerd
+proxy logs for the relevant service. The logs should show a stream of messages
+similar to the ones below:
+
+```text
+time="2021-08-27T14:04:35Z" level=info msg="Establishing watch on endpoint [default/nginx-deploy-svc:80]" addr=":8086" component=endpoints-watcher
+time="2021-08-27T14:04:35Z" level=debug msg="Filtering through addresses that should be consumed by zone zone-b" addr=":8086" component=endpoint-translator remote="127.0.0.1:49846" service="nginx-deploy-svc.default.svc.cluster.local:80"
+```
+
+[topology-aware-routing-safeguards]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#safeguards
+[topology-aware-routing-constraints]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#constraints
diff --git a/linkerd.io/content/2.17/features/topology-aware-routing.md b/linkerd.io/content/2.17/features/topology-aware-routing.md
new file mode 100644
index 0000000000..3d826eaaac
--- /dev/null
+++ b/linkerd.io/content/2.17/features/topology-aware-routing.md
@@ -0,0 +1,59 @@
+---
+title: Topology Aware Routing
+description: |-
+ Linkerd's implementation of Kubernetes topology aware routing enables endpoint consumption based on a node's zone label.
+---
+
+Kubernetes clusters are increasingly deployed in multi-zone environments with
+network traffic often relying on obscure endpoint matching and routing for a
+given service. Linkerd's implementation of Kubernetes ([Topology Aware
+Routing][topology aware routing]) provides users with a mechanism for
+asserting more control over endpoint selection and routing within a cluster
+that spans multiple zones. Users can now implement routing constraints and
+prefer endpoints in a specific zone in order to limit cross-zone networking
+costs or improve performance through lowered cross-zone latency and bandwidth
+constraints.
+
+The goal of topology aware routing is to to provide a simpler way for users to
+prefer endpoints by basing decisions solely off the node's
+`topology.kubernetes.io/zone` label. If a client is in `zone-a`, then it
+should prefer endpoints marked for use by clients in `zone-a`. When the
+feature is enabled and the label set, Linkerd's destination controller will
+attempt to find endpoints whose `routing.ForZones` field matches the client's
+zone.
+
+{{< note >}}
+
+If you're using a [stable distribution](/releases/) of Linkerd, it may have
+additional features related to topology-aware routing (for example, Buoyant Enterprise for
+Linkerd and its HAZL
+feature). You can find more information about the different kinds of Linkerd
+releases on the [Releases and Versions](/releases/) page.
+
+{{< /note >}}
+
+To get started with topology aware routing take a look at the [enabling
+topology aware routing](../../tasks/enabling-topology-aware-routing/) task
+documentation.
+
+[topology aware routing]:
+ https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/
+
+{{< note >}}
+
+Topology aware routing requires that the cluster have the `TopologyAwareHints`
+feature gate enabled (which is the default starting with Kubernetes 1.24), and
+that Linkerd's `endpointSlice` feature be turned on (this is the default
+starting with Linkerd stable-2.12).
+
+{{< /note >}}
+
+{{< note >}}
+
+Starting in Kubernetes 1.31, Kubernetes also has the `trafficDistribution`
+feature available as an alternative to topology aware routing.
+`trafficDistribution` is not yet supported by Linkerd.
+
+{{< /note >}}
diff --git a/linkerd.io/content/2.17/tasks/enabling-topology-aware-routing.md b/linkerd.io/content/2.17/tasks/enabling-topology-aware-routing.md
new file mode 100644
index 0000000000..0d1b786d40
--- /dev/null
+++ b/linkerd.io/content/2.17/tasks/enabling-topology-aware-routing.md
@@ -0,0 +1,89 @@
+---
+title: "Enabling Topology Aware Routing"
+description: |-
+ Enable topology aware routing to allow Linkerd to intelligently choose same-zone endpoints
+---
+
+[Topology aware routing](../../features/topology-aware-routing/) allows
+Linkerd users to specify endpoint selection boundaries when a request is made
+against a service, making it possible to limit cross-zone endpoint selection
+and lower the associated costs and latency.
+
+{{< note >}}
+
+If you're using a [stable distribution](/releases/) of Linkerd, it may have
+additional features related to topology-aware routing (for example, Buoyant Enterprise for
+Linkerd and its HAZL
+feature). You can find more information about the different kinds of Linkerd
+releases on the [Releases and Versions](/releases/) page.
+
+{{< /note >}}
+
+There are three requirements to successfully enabling topology aware routing
+with Linkerd:
+
+1. The `TopologyAwareHints` feature gate MUST be enabled on the Kubernetes
+ cluster. (This feature gate is enabled by default in Kubernetes 1.24 and
+ later.)
+
+2. Each Kubernetes node needs to be assigned to a zone, using
+ `"topology.kubernetes.io/zone` label.
+
+3. Relevant Kubernetes services will need to be modified with the
+ `service.kubernetes.io/topology-aware-hints=auto` annotation.
+
+When Linkerd receives a set of endpoint slices and translates them to an
+address set, a copy of the `Hints.forZones` field is made from each endpoint
+slice if one is present. This field is only present if it's set by the
+endpoint slice controller, and there are several
+[safeguards][topology-aware-routing-safeguards] that Kubernetes checks before
+setting it. To have the endpoint slice controller set the `forZones` field
+users will have to add the `service.kubernetes.io/topology-aware-hints=auto`
+annotation to the service.
+
+After the endpoints have been translated into an address set and the endpoint
+translator's available endpoints have been updated, filtering is applied to
+ensure only the relevant sets of addresses are returned when a request is
+made.
+
+For each potential address in the available endpoint set Linkerd returns a set
+of addresses whose consumption zone (zones in `forZones` field) matches that
+of the node's zone. By doing so Linkerd ensures communication is limited to
+endpoints that have been labeled by the endpoint slice controller for the same
+node the client is on and limits cross-node and cross-zone communication.
+
+## Constraints
+
+Kubernetes places some [constraints][topology-aware-routing-constraints] on
+topology aware routing that you should review before trying to enable topology
+aware routing on Linkerd.
+
+The main things to be aware of are:
+
+- Topology aware routing assumes that traffic to a given zone will be roughly
+ proportional to the capacity of the nodes in the zone. This can be a concern
+ when using horizontal pod autoscaling, as HPA may start nodes in the "wrong"
+ zone.
+
+- Services with `internalTrafficPolicy` set to `Local` ignore topology aware
+ routing, by design.
+
+- If you have workloads running on Nodes labeled with `control-plane` or
+ `master` role, topology aware routing will not route to endpoints on these
+ Nodes.
+
+## Configuring Topology Aware Routing
+
+Successful topology aware routing can be confirmed by looking at the Linkerd
+proxy logs for the relevant service. The logs should show a stream of messages
+similar to the ones below:
+
+```text
+time="2021-08-27T14:04:35Z" level=info msg="Establishing watch on endpoint [default/nginx-deploy-svc:80]" addr=":8086" component=endpoints-watcher
+time="2021-08-27T14:04:35Z" level=debug msg="Filtering through addresses that should be consumed by zone zone-b" addr=":8086" component=endpoint-translator remote="127.0.0.1:49846" service="nginx-deploy-svc.default.svc.cluster.local:80"
+```
+
+[topology-aware-routing-safeguards]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#safeguards
+[topology-aware-routing-constraints]: https://kubernetes.io/docs/concepts/services-networking/topology-aware-hints/#constraints