Repository: knative/serving
Pull request #10816 (2021-02-19 13:10:43)

Add HA test for DomainMapping controller
This patch adds HA test for domain-mapping controller.

The test is basically same with conformance test for domain-mapping,
but it verifies after changing the leader.

Fix https://github.com/knative/serving/issues/10805

**Release Note**

```release-note
NONE
```


knative-prow-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **nak3** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @nak3` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=knative%2Fserving).

<details open>
Needs approval from an approver in each of these files:

- **[test/OWNERS](https://github.com/knative/serving/blob/master/test/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["nak3"]} -->
codecov[bot]: # [Codecov](https://codecov.io/gh/knative/serving/pull/10816?src=pr&el=h1) Report
> Merging [#10816](https://codecov.io/gh/knative/serving/pull/10816?src=pr&el=desc) (b84edc2) into [master](https://codecov.io/gh/knative/serving/commit/2516dae3d46ee652840bd7351c9b3a10556a7e05?el=desc) (2516dae) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/knative/serving/pull/10816/graphs/tree.svg?width=650&height=150&src=pr&token=MPpDfAj4Ui)](https://codecov.io/gh/knative/serving/pull/10816?src=pr&el=tree)

```diff
@@           Coverage Diff           @@
##           master   #10816   +/-   ##
=======================================
  Coverage   88.01%   88.01%           
=======================================
  Files         188      188           
  Lines        9043     9043           
=======================================
  Hits         7959     7959           
- Misses        830      831    +1     
+ Partials      254      253    -1     
```


| [Impacted Files](https://codecov.io/gh/knative/serving/pull/10816?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pkg/activator/net/revision\_backends.go](https://codecov.io/gh/knative/serving/pull/10816/diff?src=pr&el=tree#diff-cGtnL2FjdGl2YXRvci9uZXQvcmV2aXNpb25fYmFja2VuZHMuZ28=) | `90.41% <0.00%> (-0.92%)` | :arrow_down: |
| [pkg/reconciler/configuration/configuration.go](https://codecov.io/gh/knative/serving/pull/10816/diff?src=pr&el=tree#diff-cGtnL3JlY29uY2lsZXIvY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmdv) | `88.28% <0.00%> (+1.56%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/knative/serving/pull/10816?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/knative/serving/pull/10816?src=pr&el=footer). Last update [2516dae...eed6244](https://codecov.io/gh/knative/serving/pull/10816?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

knative-prow-robot: @nak3: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-istio-stable-no-mesh | eed6244531c15bb7ddf78fd6b2ae693ce57c1121 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/10816/pull-knative-serving-istio-stable-no-mesh/1362751485523267584) | `/test pull-knative-serving-istio-stable-no-mesh`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/10816). [Your PR dashboard](https://gubernator.knative.dev/pr/nak3).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
nak3: /retest

Failed on unrelated test `TestAutoscalerHA`.
nak3: /cc @julz @mgencur 

Could you please take a look? Is it not necessary :sweat_smile: ?
markusthoemmes: /retest
knative-prow-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **nak3** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @nak3` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=knative%2Fserving).

<details open>
Needs approval from an approver in each of these files:

- **[test/OWNERS](https://github.com/knative/serving/blob/main/test/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["nak3"]} -->
knative-prow-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **nak3** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @nak3` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=knative%2Fserving).

<details open>
Needs approval from an approver in each of these files:

- **[pkg/testing/OWNERS](https://github.com/knative/serving/blob/main/pkg/testing/OWNERS)**
- **[test/OWNERS](https://github.com/knative/serving/blob/main/test/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["nak3"]} -->
knative-prow-robot: @nak3: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-build-tests | ba6275573f814a611605f4d09e87b78de552b97e | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/10816/pull-knative-serving-build-tests/1370309355248816128) | `/test pull-knative-serving-build-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/10816). [Your PR dashboard](https://gubernator.knative.dev/pr/nak3).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
julz: will have to remember to fix this up when we GA domain mappings and merge the controllers back together, but nice to have coverage till then 👍 
mgencur: /lgtm
knative-prow-robot: @nak3: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-upgrade-tests | 06f4c16f0703f79321bd4bd25435a3d4877f26e3 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/10816/pull-knative-serving-upgrade-tests/1370361283215364096) | `/test pull-knative-serving-upgrade-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/10816). [Your PR dashboard](https://gubernator.knative.dev/pr/nak3).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
knative-prow-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/knative/serving/pull/10816#pullrequestreview-610808064" title="LGTM">julz</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **nak3** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @nak3` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=knative%2Fserving).

<details open>
Needs approval from an approver in each of these files:

- ~~[pkg/testing/OWNERS](https://github.com/knative/serving/blob/main/pkg/testing/OWNERS)~~ [julz]
- **[test/OWNERS](https://github.com/knative/serving/blob/main/test/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["nak3"]} -->

Patch:
diff --git a/.github/workflows/knative-security.yaml b/.github/workflows/knative-security.yaml
index 00fa9fccf..fbfe531d9 100644
--- a/.github/workflows/knative-security.yaml
+++ b/.github/workflows/knative-security.yaml
@@ -37,11 +37,6 @@ jobs:
         # a pull request then we can checkout the head.
         fetch-depth: 2
 
-    # If this run was triggered by a pull request event, then checkout
-    # the head of the pull request instead of the merge commit.
-    - run: git checkout HEAD^2
-      if: ${{ github.event_name == 'pull_request' }}
-
     # Initializes the CodeQL tools for scanning.
     - name: Initialize CodeQL
       uses: github/codeql-action/init@v1
diff --git a/.github/workflows/knative-style.yaml b/.github/workflows/knative-style.yaml
index 877f48501..c5770a4b0 100644
--- a/.github/workflows/knative-style.yaml
+++ b/.github/workflows/knative-style.yaml
@@ -147,7 +147,7 @@ jobs:
           git check-attr --stdin linguist-generated | grep -Ev ': (set|true)$' | cut -d: -f1 |
           git check-attr --stdin linguist-vendored | grep -Ev ': (set|true)$' | cut -d: -f1 |
           grep -Ev '^(vendor/|third_party/|.git)' |
-          xargs misspell -error |
+          xargs misspell -i importas -error |
           reviewdog -efm="%f:%l:%c: %m" \
                 -name="github.com/client9/misspell" \
                 -reporter="github-pr-check" \
diff --git a/.golangci.yaml b/.golangci.yaml
index 224116026..3e8a61e4f 100644
--- a/.golangci.yaml
+++ b/.golangci.yaml
@@ -23,6 +23,7 @@ linters:
     - errorlint
     - golint
     - gosec
+    - importas
     - prealloc
     - stylecheck
     - tparallel
@@ -38,6 +39,8 @@ linters-settings:
       - sync/atomic
     packages-with-error-message:
       - sync/atomic: "please use type-safe atomics from go.uber.org/atomic"
+  importas:
+    autoscalingv1alpha1: knative.dev/serving/pkg/apis/autoscaling/v1alpha1
 
 issues:
   include:
diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES
index e249ce782..2d5c10381 100644
--- a/OWNERS_ALIASES
+++ b/OWNERS_ALIASES
@@ -53,6 +53,7 @@ aliases:
   monitoring-reviewers:
   - mdemirhan
   - yanweiguo
+  - skonto
 
   productivity-approvers:
   - chaodaiG
diff --git a/cmd/activator/main.go b/cmd/activator/main.go
index 98d09740e..44b301214 100644
--- a/cmd/activator/main.go
+++ b/cmd/activator/main.go
@@ -175,7 +175,7 @@ func main() {
 
 	// Create activation handler chain
 	// Note: innermost handlers are specified first, ie. the last handler in the chain will be executed first
-	var ah http.Handler = activatorhandler.New(ctx, throttler, transport)
+	ah := activatorhandler.New(ctx, throttler, transport, logger)
 	ah = concurrencyReporter.Handler(ah)
 	ah = tracing.HTTPSpanMiddleware(ah)
 	ah = configStore.HTTPMiddleware(ah)
diff --git a/docs/runtime-contract.md b/docs/runtime-contract.md
index 39a9171af..befa8a1c8 100644
--- a/docs/runtime-contract.md
+++ b/docs/runtime-contract.md
@@ -1,539 +1,4 @@
 # Knative Runtime Contract
 
-## Abstract
-
-The Knative serverless compute infrastructure extends the
-[Open Container Initiative Runtime Specification](https://github.com/opencontainers/runtime-spec/blob/master/spec.md)
-to describe the functionality and requirements for serverless execution
-workloads. In contrast to general-purpose containers, stateless
-request-triggered (i.e. on-demand) autoscaled containers have the following
-properties:
-
-- Little or no long-term runtime state (especially in cases where code might be
-  scaled to zero in the absence of request traffic).
-- Logging and monitoring aggregation (telemetry) is important for understanding
-  and debugging the system, as containers might be created or deleted at any
-  time in response to autoscaling.
-- Multitenancy is highly desirable to allow cost sharing for bursty applications
-  on relatively stable underlying hardware resources.
-
-This contract does not define the control surfaces over the runtime environment
-except by [reference to the Knative Kubernetes resources](spec/spec.md).
-Similarly, this contract does not define the implementation of metrics or
-logging aggregation, except to provide a contract for the collection of logging
-data. It is expected that access to the aggregated telemetry will be provided by
-the platform operator.
-
-## Background
-
-The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
-"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" are to be
-interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119).
-
-The
-[OCI specification](https://github.com/opencontainers/runtime-spec/blob/master/spec.md)
-([v1.0.1](https://github.com/opencontainers/runtime-spec/blob/v1.0.1/spec.md))
-is the basis for this document. When this document and the OCI specification
-conflict, this document is assumed to override the general OCI recommendations.
-Where this document does not specify behavior, runtime implementations SHOULD be
-OCI compliant with respect to those features. Additionally, the core Knative
-definition assumes the
-[Linux Container Configuration](https://github.com/opencontainers/runtime-spec/blob/master/config-linux.md).
-
-In particular, the default Knative implementation relies on Kubernetes behavior
-to implement container operation. In some cases, current Kubernetes behavior in
-2018 is not as performant as envisioned in this documentation. The goal of the
-Knative authors is to push as much of the needed functionality into Kubernetes
-and/or HTTP routers as possible, rather than implementing reach-around layers.
-
-This document considers two users of a given Knative environment, and is
-particularly concerned with the expectations of _developers_ (and _language and
-tooling developers_, by extension) running code in the environment.
-
-- **Developers** write code which is packaged into a container which is run on
-  the Knative cluster.
-  - **Language and tooling developers** typically write tools used by
-    _developers_ to package code into containers. As such, they are concerned
-    that tooling which wraps developer code complies with this runtime contract.
-- **Operators** (also known as **platform providers**) provision the compute
-  resources and manage the software configuration of Knative and the underlying
-  abstractions (for example, Linux, Kubernetes, etc).
-
-## Runtime and Lifecycle
-
-Knative aims to minimize the amount of tuning and production configuration
-needed to run a service. Some of these production-friendly features include:
-
-1.  Stateless computation at request-scale or event-scale granularity.
-1.  Automatic scaling between 0 and many instances (the process scale-out
-    model).
-1.  Automatic adjustment of resource requirements based on observed behavior,
-    where possible.
-
-In order to achieve these properties, containers which are operated as part of a
-serverless platform are expected to observe the following properties:
-
-- Fast startup time (<1s until a request or event can be processed, given
-  container image layer caching),
-- Minimize local state (in support of autoscaling and scale to zero),
-- CPU usage only while requests are active (see
-  [this issue](https://github.com/knative/serving/issues/848) for reasons an
-  operator might want to de-allocate CPU between requests).
-
-### State
-
-In a highly-shared environment, containers might experience the following:
-
-- Containers with `status` of `stopped` MAY be immediately reclaimed by the
-  system.
-- The container process MAY be started as pid 0, through the use of PID
-  namespaces or other processes.
-
-### Lifecycle
-
-- The container MAY be killed when the container is inactive. Containers MUST be
-  considered "active" while they are handling at least one request, but other
-  conditions MAY also be used to determine that a container is active. The
-  container is sent a `SIGTERM` signal when it is killed via the
-  [OCI specification's `kill`](https://github.com/opencontainers/runtime-spec/blob/master/runtime.md#kill)
-  command to allow for a graceful shutdown of existing resources and
-  connections. If the container has not shut down after a defined grace period,
-  the container is forcibly killed via a `SIGKILL` signal.
-- The environment MAY restrict the use of `prestart`, `poststart`, and
-  `poststop` hooks to platform operators rather than developers. All of these
-  hooks are defined in the context of the runtime namespace, rather than the
-  container namespace, and might expose system-level information (and are
-  non-portable).
-- Failures of the developer-specified process MUST be logged to a
-  developer-visible logging system.
-
-In addition, some serverless environments MAY use an execution model other than
-docker in linux (for example, [runv](https://github.com/hyperhq/runv) or
-[Kata Containers](https://katacontainers.io/)). Implementations using an
-execution model beyond docker in linux MAY alter the lifecycle contract beyond
-the OCI specification as long as:
-
-1.  An OCI-compliant lifecycle contract is the default, regardless of how many
-    extensions are provided.
-1.  The implementation of an extended execution model or lifecycle MUST provide
-    documentation about the extended model or lifecycle **and** documentation
-    about how to opt in to the extended lifecycle contract.
-
-### Errors
-
-- Platforms MAY provide mechanisms for post-mortem viewing of filesystem
-  contents from a particular execution. Because containers (particularly failing
-  containers) can experience frequent starts, operators or platform providers
-  SHOULD limit the total space consumed by these failures.
-
-### Warnings
-
-As specified by OCI.
-
-### Operations
-
-It is expected that containers do not have direct access to the
-[OCI interface](https://github.com/opencontainers/runtime-spec/blob/v1.0.0-rc3/runtime.md#operations)
-as providing access allows containers to circumvent runtime restrictions that
-are enforced by the Knative control plane. The operator or platform provider MAY
-have the ability to directly interact with the OCI interface, but that is beyond
-the scope of this specification.
-
-An OPTIONAL method of invoking the `kill` operation MAY be exposed to developers
-to provide signalling to the container.
-
-### Hooks
-
-Operation hooks
-[SHOULD NOT](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-be configurable by the Knative developer. Operators or platform providers MAY
-use hooks to implement their own lifecycle controls.
-
-### Linux Runtime
-
-#### File descriptors
-
-A read from the `stdin` file descriptor on the container
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/file_descriptor_test.go)
-always result in `EOF`. The `stdout` and `stderr` file descriptors on the
-container SHOULD be collected and retained in a developer-accessible logging
-repository. (TODO:[docs#902](https://github.com/knative/docs/issues/902)).
-
-Within the container, pipes and file descriptors can be used to communicate
-between processes running in the same container.
-
-#### Dev symbolic links
-
-As specified by OCI.
-
-## Network Environment
-
-For request-response functions, 0->many scaling is enabled by control of the
-inbound request path to enable capturing and stalling inbound requests until an
-autoscaled container is available to serve that request.
-
-### Inbound network connectivity
-
-Inbound network connectivity is assumed to use HTTP/1.1 compatible transport.
-
-#### Protocols and Ports
-
-The container MUST accept HTTP/1.1 requests from the environment. The
-environment SHOULD
-[offer an HTTP/2.0 upgrade option](https://httpwg.org/specs/rfc7540.html#discover-http)
-(`Upgrade: h2c` on either the initial request or an `OPTIONS` request) on the
-same port as HTTP/1.1. The developer MAY specify this port at deployment; if the
-developer does not specify a port, the platform provider MUST provide a default.
-Only one inbound `containerPort`
-[SHALL](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-be specified in the
-[`core.v1.Container`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#containerport-v1-core)
-specification. The `hostPort` parameter
-[SHOULD NOT](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-be set by the developer or the platform provider, as it can interfere with
-ingress autoscaling. Regardless of its source, the selected port will be made
-available in the `PORT` environment variable.
-
-The platform provider SHOULD configure the platform to perform HTTPS termination
-and protocol transformation e.g. between QUIC or HTTP/2 and HTTP/1.1. Developers
-ought not need to implement multiple transports between the platform and their
-code. Unless overridden by setting the
-[`name`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#containerport-v1-core)
-field on the inbound port, the platform will perform automatic detection as
-described above. If the
-[`core.v1.Container.ports[0].name`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#containerport-v1-core)
-is set to one of the following values, HTTP negotiation will be disabled and the
-following protocol will be used:
-
-- `http1`: HTTP/1.1 transport and will not attempt to upgrade to h2c..
-- `h2c`: HTTP/2 transport, as described in
-  [section 3.4 of the HTTP2 spec (Starting HTTP/2 with Prior Knowledge)](https://httpwg.org/specs/rfc7540.html#known-http)
-
-Developers ought to use automatic content negotiation where available, and MUST
-NOT set the `name` field to arbitrary values, as additional transports might be
-defined in the future. Developers can assume all traffic is intermediated by an
-L7 proxy. Developers can not assume a direct network connection between their
-server process and client processes.
-
-#### Headers
-
-As requests to the container will be proxied by the platform, all inbound
-request headers
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/header_test.go)
-be set to the same values as the incoming request. Some implementations MAY
-strip certain HTTP headers for security or other reasons; such implementations
-SHOULD document the set of stripped headers. Because the full set of HTTP
-headers is constantly evolving, it is RECOMMENDED that platforms which strip
-headers define a common prefix which covers all headers removed by the platform.
-
-In addition, the following base set of HTTP/1.1 headers
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/header_test.go)
-be set on the request:
-
-- `Host` - As specified by
-  [RFC 7230 Section 5.4](https://tools.ietf.org/html/rfc7230#section-5.4)
-
-Also, the following proxy-specific request headers
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/header_test.go)
-be set:
-
-- `Forwarded` - As specified by [RFC 7239](https://tools.ietf.org/html/rfc7239).
-
-Additionally, the following legacy headers
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/header_test.go)
-be set for compatibility with client software:
-
-- `X-Forwarded-For`
-- `X-Forwarded-Proto`
-
-In addition, the following headers
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/header_test.go)
-be set to enable tracing and observability features:
-
-- Trace headers - Platform providers SHOULD provide and document headers needed
-  to propagate trace contexts,
-  [in the absence of w3c standardization](https://www.w3.org/2018/04/distributed-tracing-wg-charter.html).
-
-Operators and platform providers MAY provide additional headers to provide
-environment specific information.
-
-#### Meta Requests
-
-The
-[`core.v1.Container`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#container-v1-core)
-object allows specifying both a
-[`readinessProbe`](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-readiness-probes)
-and a
-[`livenessProbe`](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-a-liveness-http-request).
-If not provided, container startup and listening on the declared HTTP socket is
-considered sufficient to declare the container "ready" and "live" (see the probe
-definition below). If specified, liveness and readiness probes are REQUIRED to
-be of the `httpGet` or `tcpSocket` types, and
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-target the inbound container port; platform providers SHOULD disallow other
-probe methods.
-
-Because serverless platforms automatically scale instances based on inbound
-requests, and because noncompliant (or even failing) containers might be
-provided by developers, the following defaults SHOULD be applied by the platform
-provider if not set by the developer. The probes are intended to be trivially
-supportable by naive conforming containers while preventing interference with
-developer code. These settings apply to both `livenessProbe` and
-`readinessProbe`:
-
-- `tcpSocket` set to the container's port
-- `initialDelaySeconds` set to 0
-- `periodSeconds` set to platform-specific value
-
-Setting `initialDelaySeconds` to a value greater than 0 impacts container
-startup time (aka cold start time) as a container will not serve traffic until
-the probe succeeds.
-
-##### Deployment probe
-
-On the initial deployment, platform providers
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/readiness_probe_test.go)
-start an instance of the container to validate that the container is valid and
-will become ready. This startup
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/readiness_probe_test.go)
-occur even if the container would not serve any user requests. If a container
-cannot satisfy the `readinessProbe` during deployment startup, the Revision
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/readiness_probe_test.go)
-be marked as failed.
-
-Initial readiness probes allow the platform to avoid attempting to later
-provision or scale deployments (Revisions) which cannot become healthy, and act
-as a backstop to developer testing (via CI/CD or otherwise) which has been
-performed on the supplied container. Common causes of these failures can
-include: malformed dynamic code not tested in the container, environment
-differences between testing and deployment environment, and missing or
-misconfigured backends. This also provides an opportunity for the container to
-be run at least once despite scale-to-zero guarantees.
-
-### Outbound network connectivity
-
-OCI does not specify any properties of the network environment in which a
-container runs. The following items are OPTIONAL additions to the runtime
-contract which describe services which might be of particular value to platform
-providers.
-
-#### DNS
-
-Platform providers SHOULD override the DNS related configuration files under
-`/etc` to enable local DNS lookups in the target environment (see
-[Default Filesystems](#default-filesystems)).
-
-#### Metadata Services
-
-Platform providers MAY provide a network service to provide introspection and
-environment information to the running process. Such a network service SHOULD be
-an HTTP server with an operator- or provider-defined URL schema. If a metadata
-service is provided, the schema MUST be documented. Sample use cases for such
-metadata include:
-
-- Container information or control interfaces.
-- Host information, including maintenance or capability information.
-- Access to external configuration stores (such as the Kubernetes ConfigMap
-  APIs).
-- Access to secrets or identity tokens, to enable key rotation.
-
-## Configuration
-
-### Root
-
-Platform providers MAY set the `readonly` bit on the container to `true` in
-order to reduce the possible disk space provisioning and management of
-serverless workloads. Containers MUST use the provided temporary storage areas
-(see [Default Filesystems](#default-filesystems)) for working files and caches.
-
-### Mounts
-
-In general, stateless applications package their dependencies within the
-container and do not rely on mutable external state for templates, logging
-configuration, etc. In some cases, it might be necessary for certain application
-settings to be overridden at deploy time (for example, database backends or
-authentication credentials). When these settings need to be loaded via a file,
-read-only mounts of application configuration and secrets are supported by
-`ConfigMap` and `Secrets` volumes. Platform providers MAY apply updates to
-`Secrets` and `ConfigMaps` while the application is running; these updates could
-complicate rollout and rollback. It is up to the developer to choose appropriate
-policies for mounting and updating `ConfigMap` and `Secrets` which are mounted
-as volumes.
-
-As serverless applications are expected to scale horizontally and statelessly,
-per-container volumes are likely to introduce state and scaling bottlenecks and
-are NOT RECOMMENDED.
-
-### Process
-
-Serverless applications which scale horizontally are expected to be managed in a
-declarative fashion, and individual instances SHOULD NOT be interacted with or
-connected directly.
-
-- The `terminal` property
-  [SHOULD NOT](https://github.com/knative/serving/blob/main/test/conformance/runtime/filesystem_test.go)
-  be set to `true`.
-- The linux process specific properties MUST NOT be configurable by the
-  developer, and MAY set by the operator or platform provider.
-
-The following environment variables
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/envvars_test.go)
-be set:
-
-| Name   | Meaning                                                                                                                                             |
-| ------ | --------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `PORT` | Ingress `containerPort` for ingress requests and health checks. See [Inbound network connectivity](#inbound-network-connectivity) for more details. |
-
-The following environment variables
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/envvars_test.go)
-be set:
-
-| Name              | Meaning                                                                                                          |
-| ----------------- | ---------------------------------------------------------------------------------------------------------------- |
-| `K_REVISION`      | Name of the current Revision.                                                                                    |
-| `K_CONFIGURATION` | Name of the Configuration that created the current Revision.                                                     |
-| `K_SERVICE`       | If the current Revision has been created by manipulating a Knative Service object, name of this Knative Service. |
-
-Platform providers MAY set additional environment variables. Standardization of
-such variables will follow demonstrated usage and utility.
-
-### User
-
-Developers MAY specify that containers be run as a specific user or group ID
-using the `runAsUser` container property. If specified, the runtime
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/user_test.go)
-run the container as the specified user ID if allowed by the platform (see
-below). If no `runAsUser` is specified, a platform-specific default SHALL be
-used. Platform Providers SHOULD document this default behavior.
-
-Operators and Platform Providers MAY prohibit certain user IDs, such as `root`,
-from executing code. In this case, if the identity selected by the developer is
-invalid, the container execution
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-be failed.
-
-### Default Filesystems
-
-The OCI specification describes a default container environment which can be
-used for many different purposes, including containerization of existing legacy
-or stateful processes which might store substantial amounts of on-disk state. In
-a scaled-out, stateless environment, container startup and teardown is
-accelerated when on-disk resources are kept to a minimum. Additionally,
-developers might not have access to the container's filesystems (or the
-containers might be rapidly recycled), so log aggregation SHOULD be provided.
-
-In addition to the filesystems recommended in the OCI, the following filesystems
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/filesystem_test.go)
-be provided:
-
-| Mount      | Description                                                                                                                                                     |
-| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `/tmp`     | MUST be Read-write.<p>SHOULD be backed by tmpfs if disk load is a concern.                                                                                      |
-| `/var/log` | MAY be a directory with write permissions for logs storage. Implementations MAY permit the creation of additional subdirectories and log rotation and renaming. |
-
-To enable DNS resolution, the following files might be overwritten at runtime:
-
-| File               | Description                                                                                                                                                          |
-| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `/etc/hosts`       | MAY be overridden to provide host mappings for well-known or provider-specific resources.                                                                            |
-| `/etc/hostname`    | some environments MAY set this to a different value for each container, but other environments might use the same value for all containers.                          |
-| `/etc/resolv.conf` | SHOULD be set to a valid cluster-specific recursive resolver. Providers MAY provide additional default search domains to improve customer experience in the cluster. |
-
-Platform providers MAY provide additional platform-specific mount points
-(example: shared read-only object stores or DB connection brokers). If provided,
-the location and contents of the mount points SHOULD be documented by the
-platform provider.
-
-### Namespaces
-
-The namespace configuration MUST be provided by the operator or platform
-provider; developers or container providers MUST NOT set or assume a particular
-namespace configuration.
-
-### Devices
-
-Developers MUST NOT use OCI `devices` to request additional devices beyond the
-[OCI specification "Default Devices"](https://github.com/opencontainers/runtime-spec/blob/master/config-linux.md#default-devices).
-
-### Control Groups
-
-Control group (cgroups) controllers
-[MUST](https://github.com/knative/serving/blob/main/test/conformance/runtime/cgroup_test.go)
-be selected and configured by the operator or platform provider. The cgroup
-devices
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/cgroup_test.go)
-be mounted as read-only.
-
-#### Memory and CPU limits
-
-The serverless platform MAY automatically adjust the resource limits (e.g. CPU)
-based on observed resource usage. The limits enforced to a container
-[SHOULD](https://github.com/knative/serving/blob/main/test/conformance/runtime/cgroup_test.go)
-be exposed in
-
-- `/sys/fs/cgroup/memory/memory.limit_in_bytes`
-- `/sys/fs/cgroup/cpu/cpu.cfs_period_us`
-- `/sys/fs/cgroup/cpu/cpu.cfs_quota_us`
-
-Additionally, operators or the platform MAY restrict or prevent CPU scheduling
-for instances when no requests are active,
-[where this capability is available](https://github.com/knative/serving/issues/848).
-The Knative authors are currently discussing the best implementations options
-for this feature with the Kubernetes SIG-Node team.
-
-### Sysctl
-
-The sysctl parameter applies system-wide kernel parameter tuning, which could
-interfere with other workloads on the host system. This is not appropriate for a
-shared environment, and
-[SHOULD NOT](https://github.com/knative/serving/blob/main/test/conformance/runtime/sysctl_test.go)
-be exposed for developer tuning.
-
-### Seccomp
-
-Seccomp provides a mechanism for further restricting the set of linux syscalls
-permitted to the processes running inside the container environment. A seccomp
-sandbox MAY be enforced by the platform operator; any such application profiles
-SHOULD be configured and applied in a consistent mechanism outside of the
-container specification. A seccomp policy MAY be part of the platform security
-configuration that operators can tune over time as the threat environment
-changes.
-
-### Rootfs Mount Propagation
-
-From the OCI spec:
-
-> `rootfsPropagation` (string, OPTIONAL) sets the rootfs's mount propagation.
-> Its value is either slave,<!-- wokeignore:rule=slave --> private, shared or
-> unbindable. The
-> [Shared Subtrees](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt)
-> article in the kernel documentation has more information about mount
-> propagation.
-
-This option MAY be set by the operator or platform provider, and MUST NOT be
-configurable by the developer. Mount propagation MAY be part of the platform
-security configuration that operators can tune over time as the threat
-environment changes.
-
-### Masked Paths
-
-This option MAY be set by the operator or platform provider, and MUST NOT be
-configurable by the developer. Masked paths MAY be part of the platform security
-configuration that operators can tune over time as the threat environment
-changes.
-
-### Readonly Paths
-
-This option MAY only be set by the operator or platform provider, and MUST NOT
-be configurable by the developer.
-
-### Posix-platform Hooks
-
-Operation hooks
-[SHOULD NOT](https://github.com/knative/serving/blob/main/test/conformance/runtime/container_test.go)
-be configurable by the developer. Operators or platform providers MAY use hooks
-to implement their own lifecycle controls.
-
-### Annotations
-
-As specified by OCI.
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/runtime-contract.md)
diff --git a/docs/spec/README.md b/docs/spec/README.md
index 13d641c6c..7b687428f 100644
--- a/docs/spec/README.md
+++ b/docs/spec/README.md
@@ -1,13 +1,4 @@
 # Knative Serving Specification
 
-The Knative Serving specifications have been moved. See the links below for
-document locations:
-
-- [Knative Serving API Specification](https://github.com/knative/docs/blob/main/docs/serving/spec/).
-- [Knative Serving Runtime Specification](https://github.com/knative/serving/blob/main/docs/runtime-contract.md)
-- [Knative Serving Conformance Tests](/test/conformance)
-
-Docs in this directory:
-
-- [Motivation and goals](motivation.md)
-- [Resource type overview](overview.md)
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/README.md)
diff --git a/docs/spec/errors.md b/docs/spec/errors.md
index 9a3e676b9..7fcbef571 100644
--- a/docs/spec/errors.md
+++ b/docs/spec/errors.md
@@ -1,9 +1,4 @@
 # Error Conditions and Reporting
 
-This document has been replaced by the
-[Error Signalling](https://github.com/knative/docs/blob/main/docs/serving/spec/knative-api-specification-1.0.md#error-signalling)
-section of the
-[Knative API Specification](https://github.com/knative/docs/blob/main/docs/serving/spec/knative-api-specification-1.0.md).
-
-Specification documents can be found in the
-[Knative Docs Repository](https://github.com/knative/docs/tree/main/docs/serving/spec).
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/errors.md)
diff --git a/docs/spec/motivation.md b/docs/spec/motivation.md
index d1ba87050..4e235ccf2 100644
--- a/docs/spec/motivation.md
+++ b/docs/spec/motivation.md
@@ -1,19 +1,4 @@
 # Motivation
 
-The goal of the Knative Serving project is to provide a common toolkit and API
-framework for serverless workloads.
-
-We define serverless workloads as computing workloads that are:
-
-- Stateless
-- Amenable to the process scale-out model
-- Primarily driven by application level (L7 -- HTTP, for example) request
-  traffic
-
-While Kubernetes provides basic primitives like Deployment, and Service in
-support of this model, our experience suggests that a more compact and richer
-opinionated model has substantial benefit for developers. In particular, by
-standardizing on higher-level primitives which perform substantial amounts of
-automation of common infrastructure, it should be possible to build consistent
-toolkits that provide a richer experience than updating yaml files with
-`kubectl`.
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/motivation.md)
diff --git a/docs/spec/normative_examples.md b/docs/spec/normative_examples.md
index b4f11c05d..becc54bc8 100644
--- a/docs/spec/normative_examples.md
+++ b/docs/spec/normative_examples.md
@@ -1,4 +1,4 @@
 # Sample API Usage
 
-Serving client documentation can now be found in the
-[Knative Client Repository](https://github.com/knative/client).
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/normative_examples.md)
diff --git a/docs/spec/overview.md b/docs/spec/overview.md
index ebdf6e17c..90e1b79bd 100644
--- a/docs/spec/overview.md
+++ b/docs/spec/overview.md
@@ -1,89 +1,4 @@
 # Resource Types
 
-The primary resources in the Knative Serving API are Routes, Revisions,
-Configurations, and Services:
-
-- A **Route** provides a named endpoint and a mechanism for routing traffic to
-
-- **Revisions**, which are immutable snapshots of code + config, created by a
-
-- **Configuration**, which acts as a stream of environments for Revisions.
-
-- **Service** acts as a top-level container for managing a Route and
-  Configuration which implement a network service.
-
-![Object model](images/object_model.png)
-
-## Route
-
-**Route** provides a network endpoint for a user's service (which consists of a
-series of software and configuration Revisions over time). A kubernetes
-namespace can have multiple routes. The route provides a long-lived, stable,
-named, HTTP-addressable endpoint that is backed by one or more **Revisions**.
-The default configuration is for the route to automatically route traffic to the
-latest revision created by a **Configuration**. For more complex scenarios, the
-API supports splitting traffic on a percentage basis, and CI tools could
-maintain multiple configurations for a single route (e.g. "golden path" and
-“experiments”) or reference multiple revisions directly to pin revisions during
-an incremental rollout and n-way traffic split. The route can optionally assign
-addressable subdomains to any or all backing revisions.
-
-## Revision
-
-**Revision** is an immutable snapshot of code and configuration. A revision
-references a container image. Revisions are created by updates to a
-**Configuration**.
-
-Revisions that are not addressable via a Route may be garbage collected and all
-underlying K8s resources will be deleted. Revisions that are addressable via a
-Route will have resource utilization proportional to the load they are under.
-
-## Configuration
-
-A **Configuration** describes the desired latest Revision state, and creates and
-tracks the status of Revisions as the desired state is updated. A configuration
-will reference a container image and associated execution metadata needed by the
-Revision. On updates to a Configuration's spec, a new Revision will be created;
-the Configuration's controller will track the status of created Revisions and
-makes the most recently created and most recently _ready_ Revisions available in
-the status section.
-
-## Service
-
-A **Service** encapsulates a **Route** and **Configuration** which together
-provide a software component. Service exists to provide a singular abstraction
-which can be access controlled, reasoned about, and which encapsulates software
-lifecycle decisions such as rollout policy and team resource ownership. Service
-acts only as an orchestrator of the underlying Route and Configuration (much as
-a kubernetes Deployment orchestrates ReplicaSets). Its usage is optional but
-recommended.
-
-The Service's controller will track the statuses of its owned Configuration and
-Route, reflecting their statuses and conditions as its own.
-
-The owned Configuration's Ready conditions are surfaced as the Service's
-ConfigurationsReady condition. The owned Routes' Ready conditions are surfaced
-as the Service's RoutesReady condition.
-
-## Orchestration
-
-Revisions are created indirectly when a Configuration is created or updated.
-This provides:
-
-- a single referenceable resource for the route to perform automated rollouts
-- a single resource that can be watched to see a history of all the revisions
-  created
-- PATCH semantics for revisions implemented server-side, minimizing
-  read-modify-write implemented across multiple clients, which could result in
-  optimistic concurrency errors
-- the ability to rollback to a known good configuration
-
-Update operations on the service enable scenarios such as:
-
-- _"Push image, keep config":_ Specifying a new revision with updated image,
-  inheriting configuration such as env vars from the configuration.
-- _"Update config, keep image"_: Specifying a new revision as just a change to
-  configuration, such as updating an env variable, inheriting all other
-  configuration and image.
-- _"Execute a controlled rollout"_: Updating the service's traffic spec allows
-  testing of revisions before making them live, and controlled rollouts.
+This file has been moved to the
+[Knative Specs Repository](https://github.com/knative/specs/blob/main/specs/serving/overview.md)
diff --git a/go.mod b/go.mod
index 7b93f3455..cf666aea2 100644
--- a/go.mod
+++ b/go.mod
@@ -15,7 +15,7 @@ require (
 	github.com/emicklei/go-restful v2.15.0+incompatible // indirect
 	github.com/go-openapi/spec v0.20.2 // indirect
 	github.com/gogo/protobuf v1.3.2
-	github.com/google/go-cmp v0.5.4
+	github.com/google/go-cmp v0.5.5
 	github.com/google/go-containerregistry v0.4.1-0.20210128200529-19c2b639fab1
 	github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20210129212729-5c4818de4025
 	github.com/google/gofuzz v1.2.0
@@ -28,7 +28,7 @@ require (
 	github.com/prometheus/client_model v0.2.0
 	github.com/sirupsen/logrus v1.7.0 // indirect
 	github.com/tsenart/vegeta/v12 v12.8.4
-	go.opencensus.io v0.22.6
+	go.opencensus.io v0.23.0
 	go.uber.org/atomic v1.7.0
 	go.uber.org/automaxprocs v1.4.0
 	go.uber.org/goleak v1.1.10
@@ -43,7 +43,7 @@ require (
 	golang.org/x/tools v0.1.0 // indirect
 	gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e // indirect
 	google.golang.org/api v0.36.0
-	google.golang.org/grpc v1.35.0
+	google.golang.org/grpc v1.36.0
 	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
 	k8s.io/api v0.19.7
 	k8s.io/apimachinery v0.19.7
@@ -52,9 +52,9 @@ require (
 	k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027 // indirect
 	k8s.io/kube-openapi v0.0.0-20210113233702-8566a335510f
 	k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 // indirect
-	knative.dev/caching v0.0.0-20210311181225-4b366c7a9f99
-	knative.dev/hack v0.0.0-20210309141825-9b73a256fd9a
-	knative.dev/networking v0.0.0-20210311182125-f51c10d6fcf0
-	knative.dev/pkg v0.0.0-20210311174826-40488532be3f
+	knative.dev/caching v0.0.0-20210315185901-a31ce171642b
+	knative.dev/hack v0.0.0-20210317214554-58edbdc42966
+	knative.dev/networking v0.0.0-20210316192342-33105c61ff74
+	knative.dev/pkg v0.0.0-20210315160101-6a33a1ab29ac
 	sigs.k8s.io/yaml v1.2.0
 )
diff --git a/go.sum b/go.sum
index d826184d3..8e82096f7 100644
--- a/go.sum
+++ b/go.sum
@@ -379,6 +379,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-containerregistry v0.4.1-0.20210128200529-19c2b639fab1 h1:o2ykCuuhHeUwtzNg89pH2hi+821aqjLWkaREVR3ziTQ=
 github.com/google/go-containerregistry v0.4.1-0.20210128200529-19c2b639fab1/go.mod h1:GU9FUA/X9rd2cV3ZoUNaWihp27tki6/38EsVzL2Dyzc=
 github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20210129212729-5c4818de4025 h1:3o5qj2tOnL5eMB9b8YbcJ25sJI8oLrfy6Z0YYZl6lGY=
@@ -654,6 +656,8 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2
 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
 github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM=
 github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
+github.com/prometheus/common v0.19.0 h1:Itb4+NjG9wRdkAWgVucbM/adyIXxEhbw0866e0uZE6A=
+github.com/prometheus/common v0.19.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@@ -764,8 +768,8 @@ go.opencensus.io v0.22.4-0.20200608061201-1901b56b9515/go.mod h1:yxeiOL68Rb0Xd1d
 go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0=
 go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
-go.opencensus.io v0.22.6 h1:BdkrbWrzDlV9dnbzoP7sfN+dHheJ4J9JOaYxcUDL+ok=
-go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
@@ -1172,8 +1176,8 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM
 google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
 google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8=
-google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.0 h1:o1bcQ6imQMIOpdrO3SWf2z5RV72WbDwdXuK0MDlc8As=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -1282,14 +1286,16 @@ k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K
 k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 h1:0T5IaWHO3sJTEmCP6mUlBvMukxPKUQWqiI/YuiBNMiQ=
 k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-knative.dev/caching v0.0.0-20210311181225-4b366c7a9f99 h1:9Vk10+Eu7oXH+aZ4pVfeYo6A+N3tfKIU8n31tWDTFZk=
-knative.dev/caching v0.0.0-20210311181225-4b366c7a9f99/go.mod h1:OlAEAfCSUjHVetZp/hpMw3lzAGHfTEQyu2a5dgf/7Qo=
+knative.dev/caching v0.0.0-20210315185901-a31ce171642b h1:E6uZ2Xih+NBmuibPuO7r+9wMoUlXS9/jUpopGPQgr8o=
+knative.dev/caching v0.0.0-20210315185901-a31ce171642b/go.mod h1:JExFIO3iGOray3B4woPTLpzt8GKYevG9WYh0FSRNFLA=
 knative.dev/hack v0.0.0-20210309141825-9b73a256fd9a h1:0UGKyvFzY1Czu0lP9+0IrJhwtKe2oNLI2GYa7MIQ5c0=
 knative.dev/hack v0.0.0-20210309141825-9b73a256fd9a/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
-knative.dev/networking v0.0.0-20210311182125-f51c10d6fcf0 h1:TSc8t5E5UIjSqMltmPXIwuTqzx/NqzWhy286izs8I2I=
-knative.dev/networking v0.0.0-20210311182125-f51c10d6fcf0/go.mod h1:dBcp0JBxATXsbCKK43cA6LxTricz4Ur3dPHataW5J64=
-knative.dev/pkg v0.0.0-20210311174826-40488532be3f h1:WBgC84Ldkyvt+25osB1pfrNXH9LKoXvr3BptANZWvIE=
-knative.dev/pkg v0.0.0-20210311174826-40488532be3f/go.mod h1:pn/vClSL/iCW40TlFR91EhtmMmsyPQR2V2LavDAOOMs=
+knative.dev/hack v0.0.0-20210317214554-58edbdc42966 h1:qSnMQkq4gnhD5Hb8Mpfn7IrpkiQFhXXFPOA7uIl2lAc=
+knative.dev/hack v0.0.0-20210317214554-58edbdc42966/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
+knative.dev/networking v0.0.0-20210316192342-33105c61ff74 h1:6Ixdq/laiSkhpq46yba2R/sQXiFoBe5Hhj8oVGx2I/c=
+knative.dev/networking v0.0.0-20210316192342-33105c61ff74/go.mod h1:+sMDbs4w95CF/3sIXaOpHdLpdtEuhWmy/qfybQDt2ZA=
+knative.dev/pkg v0.0.0-20210315160101-6a33a1ab29ac h1:aGbaOcyNqxnvvujRtSMfkwehPER3TTsAw5mgCVqYZ08=
+knative.dev/pkg v0.0.0-20210315160101-6a33a1ab29ac/go.mod h1:7swdJzGy7U6iq8538vt2yFsZJqmnSAxMFexWK9Ktyes=
 modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
 modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
 modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
diff --git a/pkg/activator/handler/concurrency_reporter.go b/pkg/activator/handler/concurrency_reporter.go
index 3fe7a3dc5..0335cb05b 100644
--- a/pkg/activator/handler/concurrency_reporter.go
+++ b/pkg/activator/handler/concurrency_reporter.go
@@ -28,6 +28,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	network "knative.dev/networking/pkg"
 	"knative.dev/pkg/logging"
+	"knative.dev/pkg/logging/logkey"
 	pkgmetrics "knative.dev/pkg/metrics"
 	"knative.dev/serving/pkg/activator"
 	"knative.dev/serving/pkg/apis/serving"
@@ -204,7 +205,7 @@ func (cr *ConcurrencyReporter) reportToMetricsBackend(key types.NamespacedName,
 	revName := key.Name
 	revision, err := cr.rl.Revisions(ns).Get(revName)
 	if err != nil {
-		cr.logger.Errorw("Error while getting revision", zap.Any("revID", key), zap.Error(err))
+		cr.logger.Errorw("Error while getting revision", zap.String(logkey.Key, key.String()), zap.Error(err))
 		return
 	}
 	configurationName := revision.Labels[serving.ConfigurationLabelKey]
diff --git a/pkg/activator/handler/context.go b/pkg/activator/handler/context.go
index 6cee2d3b8..508214223 100644
--- a/pkg/activator/handler/context.go
+++ b/pkg/activator/handler/context.go
@@ -29,26 +29,28 @@ import (
 )
 
 type (
-	revisionKey struct{}
-	revIDKey    struct{}
+	revCtxKey struct{}
 )
 
-// WithRevision attaches the Revision object to the context.
-func WithRevision(ctx context.Context, rev *v1.Revision) context.Context {
-	return context.WithValue(ctx, revisionKey{}, rev)
+type revCtx struct {
+	revision *v1.Revision
+	revID    types.NamespacedName
 }
 
-// RevisionFrom retrieves the Revision object from the context.
-func RevisionFrom(ctx context.Context) *v1.Revision {
-	return ctx.Value(revisionKey{}).(*v1.Revision)
+// WithRevisionAndID attaches the Revision and the ID to the context.
+func WithRevisionAndID(ctx context.Context, rev *v1.Revision, revID types.NamespacedName) context.Context {
+	return context.WithValue(ctx, revCtxKey{}, &revCtx{
+		revision: rev,
+		revID:    revID,
+	})
 }
 
-// WithRevID attaches the the revisionID to the context.
-func WithRevID(ctx context.Context, revID types.NamespacedName) context.Context {
-	return context.WithValue(ctx, revIDKey{}, revID)
+// RevisionFrom retrieves the Revision object from the context.
+func RevisionFrom(ctx context.Context) *v1.Revision {
+	return ctx.Value(revCtxKey{}).(*revCtx).revision
 }
 
 // RevIDFrom retrieves the the revisionID from the context.
 func RevIDFrom(ctx context.Context) types.NamespacedName {
-	return ctx.Value(revIDKey{}).(types.NamespacedName)
+	return ctx.Value(revCtxKey{}).(*revCtx).revID
 }
diff --git a/pkg/activator/handler/context_handler.go b/pkg/activator/handler/context_handler.go
index e49676927..f15cf3853 100644
--- a/pkg/activator/handler/context_handler.go
+++ b/pkg/activator/handler/context_handler.go
@@ -65,19 +65,16 @@ func (h *contextHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	}
 
 	revID := types.NamespacedName{Namespace: namespace, Name: name}
-	logger := h.logger.With(zap.String(logkey.Key, revID.String()))
 
 	revision, err := h.revisionLister.Revisions(namespace).Get(name)
 	if err != nil {
-		logger.Errorw("Error while getting revision", zap.Error(err))
+		h.logger.Errorw("Error while getting revision", zap.String(logkey.Key, revID.String()), zap.Error(err))
 		sendError(err, w)
 		return
 	}
 
 	ctx := r.Context()
-	ctx = logging.WithLogger(ctx, logger)
-	ctx = WithRevision(ctx, revision)
-	ctx = WithRevID(ctx, revID)
+	ctx = WithRevisionAndID(ctx, revision, revID)
 
 	h.nextHandler.ServeHTTP(w, r.WithContext(ctx))
 }
diff --git a/pkg/activator/handler/handler.go b/pkg/activator/handler/handler.go
index 5cf085767..4e39a17e9 100644
--- a/pkg/activator/handler/handler.go
+++ b/pkg/activator/handler/handler.go
@@ -28,7 +28,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 
 	network "knative.dev/networking/pkg"
-	"knative.dev/pkg/logging"
+	"knative.dev/pkg/logging/logkey"
 	pkgnet "knative.dev/pkg/network"
 	tracingconfig "knative.dev/pkg/tracing/config"
 	"knative.dev/pkg/tracing/propagation/tracecontextb3"
@@ -50,10 +50,11 @@ type activationHandler struct {
 	tracingTransport http.RoundTripper
 	throttler        Throttler
 	bufferPool       httputil.BufferPool
+	logger           *zap.SugaredLogger
 }
 
 // New constructs a new http.Handler that deals with revision activation.
-func New(_ context.Context, t Throttler, transport http.RoundTripper) http.Handler {
+func New(_ context.Context, t Throttler, transport http.RoundTripper, logger *zap.SugaredLogger) http.Handler {
 	return &activationHandler{
 		transport: transport,
 		tracingTransport: &ochttp.Transport{
@@ -62,11 +63,11 @@ func New(_ context.Context, t Throttler, transport http.RoundTripper) http.Handl
 		},
 		throttler:  t,
 		bufferPool: network.NewBufferPool(),
+		logger:     logger,
 	}
 }
 
 func (a *activationHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-	logger := logging.FromContext(r.Context())
 	tracingEnabled := activatorconfig.FromContext(r.Context()).Tracing.Backend != tracingconfig.None
 
 	tryContext, trySpan := r.Context(), (*trace.Span)(nil)
@@ -74,14 +75,15 @@ func (a *activationHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		tryContext, trySpan = trace.StartSpan(r.Context(), "throttler_try")
 	}
 
-	if err := a.throttler.Try(tryContext, RevIDFrom(r.Context()), func(dest string) error {
+	revID := RevIDFrom(r.Context())
+	if err := a.throttler.Try(tryContext, revID, func(dest string) error {
 		trySpan.End()
 
 		proxyCtx, proxySpan := r.Context(), (*trace.Span)(nil)
 		if tracingEnabled {
 			proxyCtx, proxySpan = trace.StartSpan(r.Context(), "activator_proxy")
 		}
-		a.proxyRequest(logger, w, r.WithContext(proxyCtx), dest, tracingEnabled)
+		a.proxyRequest(revID, w, r.WithContext(proxyCtx), dest, tracingEnabled)
 		proxySpan.End()
 
 		return nil
@@ -90,7 +92,7 @@ func (a *activationHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		trySpan.Annotate([]trace.Attribute{trace.StringAttribute("activator.throttler.error", err.Error())}, "ThrottlerTry")
 		trySpan.End()
 
-		logger.Errorw("Throttler try error", zap.Error(err))
+		a.logger.Errorw("Throttler try error", zap.String(logkey.Key, revID.String()), zap.Error(err))
 
 		if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, queue.ErrRequestQueueFull) {
 			http.Error(w, err.Error(), http.StatusServiceUnavailable)
@@ -100,7 +102,7 @@ func (a *activationHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	}
 }
 
-func (a *activationHandler) proxyRequest(logger *zap.SugaredLogger, w http.ResponseWriter, r *http.Request, target string, tracingEnabled bool) {
+func (a *activationHandler) proxyRequest(revID types.NamespacedName, w http.ResponseWriter, r *http.Request, target string, tracingEnabled bool) {
 	network.RewriteHostIn(r)
 	r.Header.Set(network.ProxyHeaderName, activator.Name)
 
@@ -112,7 +114,9 @@ func (a *activationHandler) proxyRequest(logger *zap.SugaredLogger, w http.Respo
 		proxy.Transport = a.tracingTransport
 	}
 	proxy.FlushInterval = network.FlushInterval
-	proxy.ErrorHandler = pkgnet.ErrorHandler(logger)
+	proxy.ErrorHandler = func(w http.ResponseWriter, req *http.Request, err error) {
+		pkgnet.ErrorHandler(a.logger.With(zap.String(logkey.Key, revID.String())))(w, req, err)
+	}
 
 	proxy.ServeHTTP(w, r)
 }
diff --git a/pkg/apis/serving/v1/revision_lifecycle.go b/pkg/apis/serving/v1/revision_lifecycle.go
index 8335d5f5e..bc71421e4 100644
--- a/pkg/apis/serving/v1/revision_lifecycle.go
+++ b/pkg/apis/serving/v1/revision_lifecycle.go
@@ -24,7 +24,7 @@ import (
 	"k8s.io/apimachinery/pkg/runtime/schema"
 
 	"knative.dev/pkg/apis"
-	av1alpha1 "knative.dev/serving/pkg/apis/autoscaling/v1alpha1"
+	autoscalingv1alpha1 "knative.dev/serving/pkg/apis/autoscaling/v1alpha1"
 	"knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/apis/serving"
 )
@@ -168,9 +168,9 @@ func (rs *RevisionStatus) PropagateDeploymentStatus(original *appsv1.DeploymentS
 }
 
 // PropagateAutoscalerStatus propagates autoscaler's status to the revision's status.
-func (rs *RevisionStatus) PropagateAutoscalerStatus(ps *av1alpha1.PodAutoscalerStatus) {
+func (rs *RevisionStatus) PropagateAutoscalerStatus(ps *autoscalingv1alpha1.PodAutoscalerStatus) {
 	// Reflect the PA status in our own.
-	cond := ps.GetCondition(av1alpha1.PodAutoscalerConditionReady)
+	cond := ps.GetCondition(autoscalingv1alpha1.PodAutoscalerConditionReady)
 	if cond == nil {
 		rs.MarkActiveUnknown("Deploying", "")
 		return
diff --git a/pkg/reconciler/revision/resources/queue.go b/pkg/reconciler/revision/resources/queue.go
index 78b12b6b9..89aedfced 100644
--- a/pkg/reconciler/revision/resources/queue.go
+++ b/pkg/reconciler/revision/resources/queue.go
@@ -249,8 +249,8 @@ func makeQueueContainer(rev *v1.Revision, cfg *config.Config) (*corev1.Container
 
 	// After startup we'll directly use the same http health check endpoint the
 	// execprobe would have used (which will then check the user container).
-	// Unlike the StartupProbe, we don't need to override any of the
-	// timeouts/periods/thresholds here.
+	// Unlike the StartupProbe, we don't need to override any of the other settings
+	// except period here. See below.
 	httpProbe := container.ReadinessProbe.DeepCopy()
 	httpProbe.Handler = corev1.Handler{
 		HTTPGet: &corev1.HTTPGetAction{
@@ -262,6 +262,13 @@ func makeQueueContainer(rev *v1.Revision, cfg *config.Config) (*corev1.Container
 		},
 	}
 
+	// Default PeriodSeconds to 1 if not set to make for the quickest possible startup
+	// time.
+	// TODO(#10973): Remove this once we're on K8s 1.21
+	if httpProbe.PeriodSeconds == 0 {
+		httpProbe.PeriodSeconds = 1
+	}
+
 	return &corev1.Container{
 		Name:            QueueContainerName,
 		Image:           cfg.Deployment.QueueSidecarImage,
diff --git a/pkg/reconciler/route/resources/ingress.go b/pkg/reconciler/route/resources/ingress.go
index ae82e4856..532a4a19f 100644
--- a/pkg/reconciler/route/resources/ingress.go
+++ b/pkg/reconciler/route/resources/ingress.go
@@ -193,9 +193,22 @@ func makeIngressSpec(
 		}
 	}
 
+	var httpOption netv1alpha1.HTTPOption
+
+	switch config.FromContext(ctx).Network.HTTPProtocol {
+	case network.HTTPEnabled:
+		httpOption = netv1alpha1.HTTPOptionEnabled
+	case network.HTTPRedirected:
+		httpOption = netv1alpha1.HTTPOptionRedirected
+	// This will be deprecated soon
+	case network.HTTPDisabled:
+		httpOption = ""
+	}
+
 	return netv1alpha1.IngressSpec{
-		Rules: rules,
-		TLS:   tls,
+		Rules:      rules,
+		TLS:        tls,
+		HTTPOption: httpOption,
 	}, nil
 }
 
diff --git a/pkg/reconciler/route/route.go b/pkg/reconciler/route/route.go
index b0aefd33e..e5d5ce919 100644
--- a/pkg/reconciler/route/route.go
+++ b/pkg/reconciler/route/route.go
@@ -148,7 +148,6 @@ func (c *Reconciler) ReconcileKind(ctx context.Context, r *v1.Route) pkgreconcil
 	if err != nil {
 		return err
 	}
-
 	// Reconcile ingress and its children resources.
 	ingress, effectiveRO, err := c.reconcileIngress(ctx, r, traffic, tls, ingressClassForRoute(ctx, r), acmeChallenges...)
 	if err != nil {
diff --git a/support/COMMUNITY_CONTACTS.md b/support/COMMUNITY_CONTACTS.md
index 0702c633d..3db76c8f4 100644
--- a/support/COMMUNITY_CONTACTS.md
+++ b/support/COMMUNITY_CONTACTS.md
@@ -33,12 +33,22 @@ community contact's duty (subject to change) is as followed:
   reporter to yourself so that others won't pick the same test to fix.
 - Check the
   [knative-users@](https://groups.google.com/forum/#!forum/knative-users)
-  mailing list and `@serving-help` on Slack for unanswered questions.
-- Check Serving
-  [unassigned issues / untriaged issues](https://github.com/knative/serving/issues?q=is%3Aopen+is%3Aissue+no%3Aassignee+no%3Amilestone)
-  for unanswered questions.
+  mailing list.
+- Add your self as a member of Slack user group `@serving-help`
+- Check Slack channel
+  [#serving-questions](https://knative.slack.com/archives/C0186KU7STW) for
+  unanswered questions. Any questions that relates to usability please instruct
+  user to
+  [open an usablity issue](https://github.com/knative/ux/issues/new?assignees=&labels=kind%2Ffriction-point&template=friction-point-template.md&title=)
+  and to join the channel
+  [#user-experience](https://knative.slack.com/archives/C01JBD1LSF3) to capture
+  user feedback.
+- [Triage issues in the serving repo](./TRIAGE.md). Quick links:
+  - [Untriaged issues](https://github.com/knative/serving/issues?q=is%3Aissue+is%3Aopen+-label%3Atriage%2Faccepted+-label%3Atriage%2Fneeds-user-input)
+  - [User feedback issues updated more than 3 days ago](https://github.com/knative/serving/issues?q=is%3Aissue+is%3Aopen+label%3Atriage%2Fneeds-user-input+updated%3A%3C%3D2021-03-13)
+    -- **YOU NEED TO UPDATE THE DATE IN THE QUERY**
 - Check Docs
-  [unassigned issues / untriaged issues](https://github.com/knative/docs/issues?q=is%3Aopen+is%3Aissue+no%3Aassignee+no%3Amilestone)
+  [unassigned issues / untriaged issues](https://github.com/knative/docs/issues?q=is%3Aopen+is%3Aissue+label%3Akind%2Fserving+label%3Atriage%2Fneeds-eng-input)
   for unanswered questions.
 - Answer relevant
   [Stack Overflow Questions](https://stackoverflow.com/questions/tagged/knative-serving?tab=Newest)
@@ -67,21 +77,13 @@ rotation, feel free to send a PR to remove yourself.
 
 # Schedule
 
-| week       | contact                                             |
-| ---------- | --------------------------------------------------- |
-| 2020-12-14 | [tcnghia](https://github.com/tcnghia)               |
-| 2020-12-21 | [nak3](https://github.com/nak3)                     |
-| 2020-12-28 | [vagababov](https://github.com/vagababov)           |
-| 2021-01-04 | [mattmoor](https://github.com/mattmoor)             |
-| 2021-01-11 | [vagababov](https://github.com/vagababov)           |
-| 2021-01-18 | [markusthoemmes](https://github.com/markusthoemmes) |
-| 2021-01-25 | [julz](https://github.com/julz)                     |
-| 2021-02-01 | [ZhiminXiang](https://github.com/ZhiminXiang)       |
-| 2021-02-08 | [JRBANCEL](https://github.com/JRBANCEL)             |
-| 2021-02-15 | [nak3](https://github.com/nak3)                     |
-| 2021-02-22 | [yanweiguo](https://github.com/yanweiguo)           |
-| 2021-03-01 | [dprotaso](https://github.com/dprotaso)             |
-| 2021-03-08 | [tcnghia](https://github.com/tcnghia)               |
-| 2021-03-15 | [evankanderson](https://github.com/evankanderson)   |
-| 2021-03-22 | [ZhiminXiang](https://github.com/ZhiminXiang)       |
-| 2021-03-29 | [yanweiguo](https://github.com/yanweiguo)           |
+See [a machine-readable schedule here](schedule.rotation). The format is:
+
+```
+# comment lines are okay
+#@ metadata: value of the metadata
+RFC3339-date  |  username
+```
+
+You can see the current oncall at https://knative.party/ (which reads the
+machine-readable file).
diff --git a/support/TRIAGE.md b/support/TRIAGE.md
new file mode 100644
index 000000000..b7372ad6e
--- /dev/null
+++ b/support/TRIAGE.md
@@ -0,0 +1,54 @@
+# Triage process
+
+This is heavily inspired by [this blog post](https://apenwarr.ca/log/20171213),
+but that's a long read, so here's the short version.
+
+The goal of triage is to make sure that the following are handled quickly:
+
+- New bugs or issues, some of which might be high priority
+- Consumer (developer or administrator) updates to an issue which might not be
+  on the immediate radar of a contributor
+
+The goal is for the project to be responsive to outside requests, while
+shielding most of the team from the interrupt-y work of watching the triage
+queue. An additional goal is to protect and respect the time of the triager /
+support user.
+
+For triage, the goal is to handle _all_ the bugs on the following lists
+(searches):
+
+- [Untriaged issues](https://github.com/knative/serving/issues?q=is%3Aissue+is%3Aopen+-label%3Atriage%2Faccepted+-label%3Atriage%2Fneeds-user-input)
+- [User feedback issues updated more than 3 days ago](https://github.com/knative/serving/issues?q=is%3Aissue+is%3Aopen+label%3Atriage%2Fneeds-user-input+updated%3A%3C%3D2021-03-13)
+  -- **YOU NEED TO UPDATE THE DATE IN THE QUERY**
+
+When doing triage, the goal is to quickly process issues, getting them into the
+right "bin". For small issues and user questions, it's reasonable to reply in
+the issue with documentation or a reference to another issue, but you should
+avoid _fixing_ anything when triaging -- if you're making PRs during triage,
+you're doing it wrong.
+
+At the end of reading an issue, you should do one of the following:
+
+1. If the issue is clear and applies to serving, ensure it has the correct
+   `/kind` and `/area` assigned. If you know enough, feel free to `/assign` to
+   an individual, but area assignments should be sufficient for triage. Also
+   consider if it is a `/good-first-issue`. After this, also mark the issue as
+   `/triage accepted`, so it drops out of the list above.
+
+1. Move it to the correct repo (for example, Istio-specific questions should
+   probably go to `net-istio`). In some cases, you may need to create a new
+   issue in the new repo and link / copy the current issue. If you do this, be
+   sure to `@mention` the requestor and others on the old issue, and then
+   `/close` the issue is serving with a link to the other repo.
+
+1. If it's not clear what the problem or issue is, add a note for the requestor
+   (or occasionally some other user on the thread), make sure that there is a
+   reasonable `/kind` on the issue and mark it as `/triage needs-user-input` so
+   that it's off the list for a few days. If a `needs-user-input` issue persists
+   for longer than a week or so (past a second followup), it's reasonable to
+   `/close` the issue and encourage the requester to reopen if they have more
+   detail.
+
+1. If the request can be resolved with documentation, is infeasable, or
+   complete, follow up directly in the issue with the information, and `/close`
+   the issue.
diff --git a/support/support.rotation b/support/support.rotation
new file mode 100644
index 000000000..94abf28f8
--- /dev/null
+++ b/support/support.rotation
@@ -0,0 +1,23 @@
+# Serving community contacts
+#
+# Begin metadata
+#@ title: Serving
+#@ slack: #serving-questions
+#@ slacklink: https://knative.slack.com/archives/C0186KU7STW
+
+2020-12-14T01:00:00Z | tcnghia
+2020-12-21T01:00:00Z | nak3
+2020-12-28T01:00:00Z | vagababov
+2021-01-04T01:00:00Z | mattmoor
+2021-01-11T01:00:00Z | vagababov
+2021-01-18T01:00:00Z | markusthoemmes
+2021-01-25T01:00:00Z | julz
+2021-02-01T01:00:00Z | ZhiminXiang
+2021-02-08T01:00:00Z | JRBANCEL
+2021-02-15T01:00:00Z | nak3
+2021-02-22T01:00:00Z | yanweiguo
+2021-03-01T01:00:00Z | dprotaso
+2021-03-08T01:00:00Z | tcnghia
+2021-03-15T01:00:00Z | evankanderson
+2021-03-22T01:00:00Z | ZhiminXiang
+2021-03-29T01:00:00Z | yanweiguo
diff --git a/third_party/VENDOR-LICENSE/golang.org/x/xerrors/LICENSE b/third_party/VENDOR-LICENSE/golang.org/x/xerrors/LICENSE
deleted file mode 100644
index e4a47e17f..000000000
--- a/third_party/VENDOR-LICENSE/golang.org/x/xerrors/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2019 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-   * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-   * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-   * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go
index 51ce36fb6..e4ffca838 100644
--- a/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go
+++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go
@@ -11,7 +11,6 @@ import (
 	"time"
 
 	"github.com/google/go-cmp/cmp"
-	"golang.org/x/xerrors"
 )
 
 func equateAlways(_, _ interface{}) bool { return true }
@@ -147,10 +146,3 @@ func areConcreteErrors(x, y interface{}) bool {
 	_, ok2 := y.(error)
 	return ok1 && ok2
 }
-
-func compareErrors(x, y interface{}) bool {
-	xe := x.(error)
-	ye := y.(error)
-	// TODO(≥go1.13): Use standard definition of errors.Is.
-	return xerrors.Is(xe, ye) || xerrors.Is(ye, xe)
-}
diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_go113.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_go113.go
new file mode 100644
index 000000000..26fe25d6a
--- /dev/null
+++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_go113.go
@@ -0,0 +1,15 @@
+// Copyright 2021, The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.13
+
+package cmpopts
+
+import "errors"
+
+func compareErrors(x, y interface{}) bool {
+	xe := x.(error)
+	ye := y.(error)
+	return errors.Is(xe, ye) || errors.Is(ye, xe)
+}
diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_xerrors.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_xerrors.go
new file mode 100644
index 000000000..6eeb8d6e6
--- /dev/null
+++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/errors_xerrors.go
@@ -0,0 +1,18 @@
+// Copyright 2021, The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.13
+
+// TODO(≥go1.13): For support on <go1.13, we use the xerrors package.
+// Drop this file when we no longer support older Go versions.
+
+package cmpopts
+
+import "golang.org/x/xerrors"
+
+func compareErrors(x, y interface{}) bool {
+	xe := x.(error)
+	ye := y.(error)
+	return xerrors.Is(xe, ye) || xerrors.Is(ye, xe)
+}
diff --git a/vendor/github.com/google/go-cmp/cmp/report_compare.go b/vendor/github.com/google/go-cmp/cmp/report_compare.go
index a6c070cfc..104bb3053 100644
--- a/vendor/github.com/google/go-cmp/cmp/report_compare.go
+++ b/vendor/github.com/google/go-cmp/cmp/report_compare.go
@@ -79,7 +79,7 @@ func (opts formatOptions) verbosity() uint {
 	}
 }
 
-const maxVerbosityPreset = 3
+const maxVerbosityPreset = 6
 
 // verbosityPreset modifies the verbosity settings given an index
 // between 0 and maxVerbosityPreset, inclusive.
@@ -100,7 +100,7 @@ func verbosityPreset(opts formatOptions, i int) formatOptions {
 func (opts formatOptions) FormatDiff(v *valueNode, ptrs *pointerReferences) (out textNode) {
 	if opts.DiffMode == diffIdentical {
 		opts = opts.WithVerbosity(1)
-	} else {
+	} else if opts.verbosity() < 3 {
 		opts = opts.WithVerbosity(3)
 	}
 
diff --git a/vendor/github.com/google/go-cmp/cmp/report_slices.go b/vendor/github.com/google/go-cmp/cmp/report_slices.go
index da04caf16..168f92f3c 100644
--- a/vendor/github.com/google/go-cmp/cmp/report_slices.go
+++ b/vendor/github.com/google/go-cmp/cmp/report_slices.go
@@ -26,8 +26,6 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
 		return false // No differences detected
 	case !v.ValueX.IsValid() || !v.ValueY.IsValid():
 		return false // Both values must be valid
-	case v.Type.Kind() == reflect.Slice && (v.ValueX.Len() == 0 || v.ValueY.Len() == 0):
-		return false // Both slice values have to be non-empty
 	case v.NumIgnored > 0:
 		return false // Some ignore option was used
 	case v.NumTransformed > 0:
@@ -45,7 +43,16 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
 		return false
 	}
 
-	switch t := v.Type; t.Kind() {
+	// Check whether this is an interface with the same concrete types.
+	t := v.Type
+	vx, vy := v.ValueX, v.ValueY
+	if t.Kind() == reflect.Interface && !vx.IsNil() && !vy.IsNil() && vx.Elem().Type() == vy.Elem().Type() {
+		vx, vy = vx.Elem(), vy.Elem()
+		t = vx.Type()
+	}
+
+	// Check whether we provide specialized diffing for this type.
+	switch t.Kind() {
 	case reflect.String:
 	case reflect.Array, reflect.Slice:
 		// Only slices of primitive types have specialized handling.
@@ -57,6 +64,11 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
 			return false
 		}
 
+		// Both slice values have to be non-empty.
+		if t.Kind() == reflect.Slice && (vx.Len() == 0 || vy.Len() == 0) {
+			return false
+		}
+
 		// If a sufficient number of elements already differ,
 		// use specialized formatting even if length requirement is not met.
 		if v.NumDiff > v.NumSame {
@@ -68,7 +80,7 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
 
 	// Use specialized string diffing for longer slices or strings.
 	const minLength = 64
-	return v.ValueX.Len() >= minLength && v.ValueY.Len() >= minLength
+	return vx.Len() >= minLength && vy.Len() >= minLength
 }
 
 // FormatDiffSlice prints a diff for the slices (or strings) represented by v.
@@ -77,6 +89,11 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
 func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode {
 	assert(opts.DiffMode == diffUnknown)
 	t, vx, vy := v.Type, v.ValueX, v.ValueY
+	if t.Kind() == reflect.Interface {
+		vx, vy = vx.Elem(), vy.Elem()
+		t = vx.Type()
+		opts = opts.WithTypeMode(emitType)
+	}
 
 	// Auto-detect the type of the data.
 	var isLinedText, isText, isBinary bool
diff --git a/vendor/github.com/prometheus/common/model/time.go b/vendor/github.com/prometheus/common/model/time.go
index c40e6403c..e684ebd11 100644
--- a/vendor/github.com/prometheus/common/model/time.go
+++ b/vendor/github.com/prometheus/common/model/time.go
@@ -14,6 +14,7 @@
 package model
 
 import (
+	"encoding/json"
 	"fmt"
 	"math"
 	"regexp"
@@ -254,6 +255,37 @@ func (d Duration) String() string {
 	return r
 }
 
+// MarshalJSON implements the json.Marshaler interface.
+func (d Duration) MarshalJSON() ([]byte, error) {
+	return json.Marshal(d.String())
+}
+
+// UnmarshalJSON implements the json.Unmarshaler interface.
+func (d *Duration) UnmarshalJSON(bytes []byte) error {
+	var s string
+	if err := json.Unmarshal(bytes, &s); err != nil {
+		return err
+	}
+	dur, err := ParseDuration(s)
+	if err != nil {
+		return err
+	}
+	*d = dur
+	return nil
+}
+
+// MarshalText implements the encoding.TextMarshaler interface.
+func (d *Duration) MarshalText() ([]byte, error) {
+	return []byte(d.String()), nil
+}
+
+// UnmarshalText implements the encoding.TextUnmarshaler interface.
+func (d *Duration) UnmarshalText(text []byte) error {
+	var err error
+	*d, err = ParseDuration(string(text))
+	return err
+}
+
 // MarshalYAML implements the yaml.Marshaler interface.
 func (d Duration) MarshalYAML() (interface{}, error) {
 	return d.String(), nil
diff --git a/vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer_grpc.pb.go b/vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer_grpc.pb.go
index 41e7274a0..d56b77cca 100644
--- a/vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer_grpc.pb.go
+++ b/vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer_grpc.pb.go
@@ -11,6 +11,7 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
 // LoadBalancerClient is the client API for LoadBalancer service.
diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go
index 75bbf87dd..efdbd13fa 100644
--- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go
+++ b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go
@@ -11,6 +11,7 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
 // HandshakerServiceClient is the client API for HandshakerService service.
diff --git a/vendor/google.golang.org/grpc/encoding/proto/proto.go b/vendor/google.golang.org/grpc/encoding/proto/proto.go
index e1230fdd3..3009b35af 100644
--- a/vendor/google.golang.org/grpc/encoding/proto/proto.go
+++ b/vendor/google.golang.org/grpc/encoding/proto/proto.go
@@ -21,6 +21,8 @@
 package proto
 
 import (
+	"fmt"
+
 	"github.com/golang/protobuf/proto"
 	"google.golang.org/grpc/encoding"
 )
@@ -36,11 +38,19 @@ func init() {
 type codec struct{}
 
 func (codec) Marshal(v interface{}) ([]byte, error) {
-	return proto.Marshal(v.(proto.Message))
+	vv, ok := v.(proto.Message)
+	if !ok {
+		return nil, fmt.Errorf("failed to marshal, message is %T, want proto.Message", v)
+	}
+	return proto.Marshal(vv)
 }
 
 func (codec) Unmarshal(data []byte, v interface{}) error {
-	return proto.Unmarshal(data, v.(proto.Message))
+	vv, ok := v.(proto.Message)
+	if !ok {
+		return fmt.Errorf("failed to unmarshal, message is %T, want proto.Message", v)
+	}
+	return proto.Unmarshal(data, vv)
 }
 
 func (codec) Name() string {
diff --git a/vendor/google.golang.org/grpc/regenerate.sh b/vendor/google.golang.org/grpc/regenerate.sh
index ed52187df..fc6725b89 100644
--- a/vendor/google.golang.org/grpc/regenerate.sh
+++ b/vendor/google.golang.org/grpc/regenerate.sh
@@ -40,6 +40,9 @@ echo "go install cmd/protoc-gen-go-grpc"
 echo "git clone https://github.com/grpc/grpc-proto"
 git clone --quiet https://github.com/grpc/grpc-proto ${WORKDIR}/grpc-proto
 
+echo "git clone https://github.com/protocolbuffers/protobuf"
+git clone --quiet https://github.com/protocolbuffers/protobuf ${WORKDIR}/protobuf
+
 # Pull in code.proto as a proto dependency
 mkdir -p ${WORKDIR}/googleapis/google/rpc
 echo "curl https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/code.proto"
@@ -87,6 +90,7 @@ for src in ${SOURCES[@]}; do
     -I"." \
     -I${WORKDIR}/grpc-proto \
     -I${WORKDIR}/googleapis \
+    -I${WORKDIR}/protobuf/src \
     -I${WORKDIR}/istio \
     ${src}
 done
@@ -97,6 +101,7 @@ for src in ${LEGACY_SOURCES[@]}; do
     -I"." \
     -I${WORKDIR}/grpc-proto \
     -I${WORKDIR}/googleapis \
+    -I${WORKDIR}/protobuf/src \
     -I${WORKDIR}/istio \
     ${src}
 done
diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go
index ea5bb8d0c..c0a1208f2 100644
--- a/vendor/google.golang.org/grpc/rpc_util.go
+++ b/vendor/google.golang.org/grpc/rpc_util.go
@@ -888,8 +888,7 @@ type channelzData struct {
 // buffer files to ensure compatibility with the gRPC version used.  The latest
 // support package version is 7.
 //
-// Older versions are kept for compatibility. They may be removed if
-// compatibility cannot be maintained.
+// Older versions are kept for compatibility.
 //
 // These constants should not be referenced from any other code.
 const (
diff --git a/vendor/google.golang.org/grpc/status/status.go b/vendor/google.golang.org/grpc/status/status.go
index 01e182c30..54d187186 100644
--- a/vendor/google.golang.org/grpc/status/status.go
+++ b/vendor/google.golang.org/grpc/status/status.go
@@ -73,9 +73,11 @@ func FromProto(s *spb.Status) *Status {
 	return status.FromProto(s)
 }
 
-// FromError returns a Status representing err if it was produced from this
-// package or has a method `GRPCStatus() *Status`. Otherwise, ok is false and a
-// Status is returned with codes.Unknown and the original error message.
+// FromError returns a Status representing err if it was produced by this
+// package or has a method `GRPCStatus() *Status`.
+// If err is nil, a Status is returned with codes.OK and no message.
+// Otherwise, ok is false and a Status is returned with codes.Unknown and
+// the original error message.
 func FromError(err error) (s *Status, ok bool) {
 	if err == nil {
 		return nil, true
diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go
index 685b91c70..51024d6b3 100644
--- a/vendor/google.golang.org/grpc/version.go
+++ b/vendor/google.golang.org/grpc/version.go
@@ -19,4 +19,4 @@
 package grpc
 
 // Version is the current grpc version.
-const Version = "1.35.0"
+const Version = "1.36.0"
diff --git a/vendor/knative.dev/hack/library.sh b/vendor/knative.dev/hack/library.sh
index f8f8b629c..d72bfe6b7 100644
--- a/vendor/knative.dev/hack/library.sh
+++ b/vendor/knative.dev/hack/library.sh
@@ -163,7 +163,7 @@ function wait_until_pods_running() {
   for i in {1..150}; do  # timeout after 5 minutes
     # List all pods. Ignore Terminating pods as those have either been replaced through
     # a deployment or terminated on purpose (through chaosduck for example).
-    local pods="$(kubectl get pods --no-headers -n $1 2>/dev/null | grep -v Terminating)"
+    local pods="$(kubectl get pods --no-headers -n $1 | grep -v Terminating)"
     # All pods must be running (ignore ImagePull error to allow the pod to retry)
     local not_running_pods=$(echo "${pods}" | grep -v Running | grep -v Completed | grep -v ErrImagePull | grep -v ImagePullBackOff)
     if [[ -n "${pods}" ]] && [[ -z "${not_running_pods}" ]]; then
diff --git a/vendor/modules.txt b/vendor/modules.txt
index bdc3dab65..e686947a1 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -167,7 +167,7 @@ github.com/golang/protobuf/ptypes/any
 github.com/golang/protobuf/ptypes/duration
 github.com/golang/protobuf/ptypes/timestamp
 github.com/golang/protobuf/ptypes/wrappers
-# github.com/google/go-cmp v0.5.4
+# github.com/google/go-cmp v0.5.5
 ## explicit
 github.com/google/go-cmp/cmp
 github.com/google/go-cmp/cmp/cmpopts
@@ -287,7 +287,7 @@ github.com/prometheus/client_golang/prometheus/promhttp
 # github.com/prometheus/client_model v0.2.0
 ## explicit
 github.com/prometheus/client_model/go
-# github.com/prometheus/common v0.15.0
+# github.com/prometheus/common v0.19.0
 github.com/prometheus/common/expfmt
 github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg
 github.com/prometheus/common/log
@@ -320,7 +320,7 @@ github.com/vdemeester/k8s-pkg-credentialprovider/aws
 github.com/vdemeester/k8s-pkg-credentialprovider/azure
 github.com/vdemeester/k8s-pkg-credentialprovider/gcp
 github.com/vdemeester/k8s-pkg-credentialprovider/secrets
-# go.opencensus.io v0.22.6
+# go.opencensus.io v0.23.0
 ## explicit
 go.opencensus.io
 go.opencensus.io/internal
@@ -498,7 +498,7 @@ google.golang.org/genproto/googleapis/monitoring/v3
 google.golang.org/genproto/googleapis/rpc/status
 google.golang.org/genproto/googleapis/type/calendarperiod
 google.golang.org/genproto/protobuf/field_mask
-# google.golang.org/grpc v1.35.0
+# google.golang.org/grpc v1.36.0
 ## explicit
 google.golang.org/grpc
 google.golang.org/grpc/attributes
@@ -997,7 +997,7 @@ k8s.io/utils/buffer
 k8s.io/utils/integer
 k8s.io/utils/pointer
 k8s.io/utils/trace
-# knative.dev/caching v0.0.0-20210311181225-4b366c7a9f99
+# knative.dev/caching v0.0.0-20210315185901-a31ce171642b
 ## explicit
 knative.dev/caching/config
 knative.dev/caching/pkg/apis/caching
@@ -1018,11 +1018,11 @@ knative.dev/caching/pkg/client/injection/informers/caching/v1alpha1/image/fake
 knative.dev/caching/pkg/client/injection/informers/factory
 knative.dev/caching/pkg/client/injection/informers/factory/fake
 knative.dev/caching/pkg/client/listers/caching/v1alpha1
-# knative.dev/hack v0.0.0-20210309141825-9b73a256fd9a
+# knative.dev/hack v0.0.0-20210317214554-58edbdc42966
 ## explicit
 knative.dev/hack
 knative.dev/hack/shell
-# knative.dev/networking v0.0.0-20210311182125-f51c10d6fcf0
+# knative.dev/networking v0.0.0-20210316192342-33105c61ff74
 ## explicit
 knative.dev/networking/config
 knative.dev/networking/pkg
@@ -1057,7 +1057,7 @@ knative.dev/networking/test/conformance/ingress
 knative.dev/networking/test/defaultsystem
 knative.dev/networking/test/test_images/grpc-ping/proto
 knative.dev/networking/test/types
-# knative.dev/pkg v0.0.0-20210311174826-40488532be3f
+# knative.dev/pkg v0.0.0-20210315160101-6a33a1ab29ac
 ## explicit
 knative.dev/pkg/apiextensions/storageversion
 knative.dev/pkg/apiextensions/storageversion/cmd/migrate


Test patch:
diff --git a/cmd/activator/request_log_test.go b/cmd/activator/request_log_test.go
index e3dd0ecc5..cf38d736d 100644
--- a/cmd/activator/request_log_test.go
+++ b/cmd/activator/request_log_test.go
@@ -25,6 +25,7 @@ import (
 	"github.com/google/go-cmp/cmp"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/apimachinery/pkg/util/uuid"
 	ltesting "knative.dev/pkg/logging/testing"
 	"knative.dev/pkg/metrics"
@@ -126,7 +127,10 @@ func TestUpdateRequestLogFromConfigMap(t *testing.T) {
 			resp := httptest.NewRecorder()
 			rs := string(uuid.NewUUID())
 			req := httptest.NewRequest(http.MethodPost, test.url, bytes.NewBufferString(rs))
-			ctx := activatorhandler.WithRevision(req.Context(), revision(true))
+
+			rev := revision(true)
+			revID := types.NamespacedName{Namespace: rev.Namespace, Name: rev.Name}
+			ctx := activatorhandler.WithRevisionAndID(req.Context(), rev, revID)
 			handler.ServeHTTP(resp, req.WithContext(ctx))
 
 			if got := buf.String(); got != test.want {
@@ -173,7 +177,8 @@ func TestRequestLogTemplateInputGetter(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
-			ctx := activatorhandler.WithRevision(test.request.Context(), test.revision)
+			revID := types.NamespacedName{Namespace: test.revision.Namespace, Name: test.revision.Name}
+			ctx := activatorhandler.WithRevisionAndID(test.request.Context(), test.revision, revID)
 			request := test.request.WithContext(ctx)
 
 			got := requestLogTemplateInputGetter(request, test.response)
diff --git a/pkg/activator/handler/concurrency_reporter_test.go b/pkg/activator/handler/concurrency_reporter_test.go
index 1db6d3f9f..002fbd153 100644
--- a/pkg/activator/handler/concurrency_reporter_test.go
+++ b/pkg/activator/handler/concurrency_reporter_test.go
@@ -437,7 +437,7 @@ func TestConcurrencyReporterHandler(t *testing.T) {
 
 	resp := httptest.NewRecorder()
 	req := httptest.NewRequest(http.MethodPost, "http://example.com", nil)
-	rCtx := WithRevID(context.Background(), rev1)
+	rCtx := WithRevisionAndID(context.Background(), nil, rev1)
 
 	// Send a few requests.
 	handler.ServeHTTP(resp, req.WithContext(rCtx))
@@ -644,7 +644,7 @@ func BenchmarkConcurrencyReporterHandler(b *testing.B) {
 			Name:      testRevName + strconv.Itoa(i),
 		}
 		req := httptest.NewRequest(http.MethodGet, "http://example.com", nil)
-		reqs = append(reqs, req.WithContext(WithRevID(context.Background(), key)))
+		reqs = append(reqs, req.WithContext(WithRevisionAndID(context.Background(), nil, key)))
 
 		// Create revisions in the fake clients to trigger report logic.
 		rev := revision(key.Namespace, key.Name)
diff --git a/pkg/activator/handler/handler_test.go b/pkg/activator/handler/handler_test.go
index a706b4b4e..8c24c02e5 100644
--- a/pkg/activator/handler/handler_test.go
+++ b/pkg/activator/handler/handler_test.go
@@ -125,7 +125,7 @@ func TestActivationHandler(t *testing.T) {
 
 			ctx, cancel, _ := rtesting.SetupFakeContextWithCancel(t)
 			defer cancel()
-			handler := New(ctx, test.throttler, rt)
+			handler := New(ctx, test.throttler, rt, logging.FromContext(ctx))
 
 			resp := httptest.NewRecorder()
 			req := httptest.NewRequest(http.MethodPost, "http://example.com", nil)
@@ -134,7 +134,7 @@ func TestActivationHandler(t *testing.T) {
 			// Set up config store to populate context.
 			configStore := setupConfigStore(t, logging.FromContext(ctx))
 			ctx = configStore.ToContext(ctx)
-			ctx = WithRevID(ctx, types.NamespacedName{Namespace: testNamespace, Name: testRevName})
+			ctx = WithRevisionAndID(ctx, nil, types.NamespacedName{Namespace: testNamespace, Name: testRevName})
 
 			handler.ServeHTTP(resp, req.WithContext(ctx))
 
@@ -164,7 +164,7 @@ func TestActivationHandlerProxyHeader(t *testing.T) {
 	ctx, cancel, _ := rtesting.SetupFakeContextWithCancel(t)
 	defer cancel()
 
-	handler := New(ctx, fakeThrottler{}, rt)
+	handler := New(ctx, fakeThrottler{}, rt, logging.FromContext(ctx))
 
 	writer := httptest.NewRecorder()
 	req := httptest.NewRequest(http.MethodPost, "http://example.com", nil)
@@ -172,7 +172,7 @@ func TestActivationHandlerProxyHeader(t *testing.T) {
 	// Set up config store to populate context.
 	configStore := setupConfigStore(t, logging.FromContext(ctx))
 	ctx = configStore.ToContext(req.Context())
-	ctx = WithRevID(ctx, types.NamespacedName{Namespace: testNamespace, Name: testRevName})
+	ctx = WithRevisionAndID(ctx, nil, types.NamespacedName{Namespace: testNamespace, Name: testRevName})
 
 	handler.ServeHTTP(writer, req.WithContext(ctx))
 
@@ -241,7 +241,7 @@ func TestActivationHandlerTraceSpans(t *testing.T) {
 				oct.Finish()
 			}()
 
-			handler := New(ctx, fakeThrottler{}, rt)
+			handler := New(ctx, fakeThrottler{}, rt, logging.FromContext(ctx))
 
 			// Set up config store to populate context.
 			configStore := setupConfigStore(t, logging.FromContext(ctx))
@@ -267,7 +267,7 @@ func sendRequest(namespace, revName string, handler http.Handler, store *activat
 	resp := httptest.NewRecorder()
 	req := httptest.NewRequest(http.MethodPost, "http://example.com/", nil)
 	ctx := store.ToContext(req.Context())
-	ctx = WithRevID(ctx, types.NamespacedName{Namespace: namespace, Name: revName})
+	ctx = WithRevisionAndID(ctx, nil, types.NamespacedName{Namespace: namespace, Name: revName})
 	handler.ServeHTTP(resp, req.WithContext(ctx))
 	return resp
 }
@@ -311,14 +311,14 @@ func BenchmarkHandler(b *testing.B) {
 			}, nil
 		})
 
-		handler := New(ctx, fakeThrottler{}, rt)
+		handler := New(ctx, fakeThrottler{}, rt, logging.FromContext(ctx))
 
 		request := func() *http.Request {
 			req := httptest.NewRequest(http.MethodGet, "http://example.com", nil)
 			req.Host = "test-host"
 
 			reqCtx := configStore.ToContext(context.Background())
-			reqCtx = WithRevID(reqCtx, types.NamespacedName{Namespace: testNamespace, Name: testRevName})
+			reqCtx = WithRevisionAndID(reqCtx, nil, types.NamespacedName{Namespace: testNamespace, Name: testRevName})
 			return req.WithContext(reqCtx)
 		}
 
diff --git a/pkg/activator/handler/main_test.go b/pkg/activator/handler/main_test.go
new file mode 100644
index 000000000..c7dbbf019
--- /dev/null
+++ b/pkg/activator/handler/main_test.go
@@ -0,0 +1,118 @@
+/*
+Copyright 2021 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package handler
+
+import (
+	"bytes"
+	"io/ioutil"
+	"net/http"
+	"net/http/httptest"
+	"testing"
+
+	network "knative.dev/networking/pkg"
+	"knative.dev/pkg/logging"
+	pkgnet "knative.dev/pkg/network"
+	rtesting "knative.dev/pkg/reconciler/testing"
+	"knative.dev/pkg/tracing"
+	"knative.dev/serving/pkg/activator"
+	asmetrics "knative.dev/serving/pkg/autoscaler/metrics"
+	pkghttp "knative.dev/serving/pkg/http"
+)
+
+// BenchmarkHandlerChain is supposed to try to project the entire handler chain of the
+// activator to enable us to see improvements that span handlers and to judge some of
+// the handlers that are not developed here.
+func BenchmarkHandlerChain(b *testing.B) {
+	ctx, cancel, _ := rtesting.SetupFakeContextWithCancel(&testing.T{})
+	b.Cleanup(cancel)
+
+	logger := logging.FromContext(ctx)
+	configStore := setupConfigStore(&testing.T{}, logger)
+	revision := revision(testNamespace, testRevName)
+	revisionInformer(ctx, revision)
+
+	// Buffer equal to the activator.
+	statCh := make(chan []asmetrics.StatMessage)
+	concurrencyReporter := NewConcurrencyReporter(ctx, activatorPodName, statCh)
+	go concurrencyReporter.Run(ctx.Done())
+
+	// Just read and ignore all stat messages.
+	go func() {
+		for {
+			select {
+			case <-statCh:
+			case <-ctx.Done():
+				return
+			}
+		}
+	}()
+
+	body := []byte(randomString(1024))
+	rt := pkgnet.RoundTripperFunc(func(*http.Request) (*http.Response, error) {
+		return &http.Response{
+			Body:       ioutil.NopCloser(bytes.NewReader(body)),
+			StatusCode: http.StatusOK,
+		}, nil
+	})
+
+	// Make sure to update this if the activator's main file changes.
+	ah := New(ctx, fakeThrottler{}, rt, logger)
+	ah = concurrencyReporter.Handler(ah)
+	ah = tracing.HTTPSpanMiddleware(ah)
+	ah = configStore.HTTPMiddleware(ah)
+	ah, _ = pkghttp.NewRequestLogHandler(ah, ioutil.Discard, "", nil, false)
+	ah = NewMetricHandler(activatorPodName, ah)
+	ah = NewContextHandler(ctx, ah)
+	ah = &ProbeHandler{NextHandler: ah}
+	ah = network.NewProbeHandler(ah)
+	ah = &HealthHandler{HealthCheck: func() error { return nil }, NextHandler: ah, Logger: logger}
+
+	request := func() *http.Request {
+		req := httptest.NewRequest(http.MethodGet, "http://example.com", nil)
+		req.Host = "test-host"
+		req.Header.Set(activator.RevisionHeaderNamespace, testNamespace)
+		req.Header.Set(activator.RevisionHeaderName, testRevName)
+		return req
+	}
+
+	test := func(req *http.Request, b *testing.B) {
+		resp := &responseRecorder{}
+		ah.ServeHTTP(resp, req)
+		if resp.code != http.StatusOK {
+			b.Fatalf("resp.Code = %d, want: StatusOK(200)", resp.code)
+		}
+		if got, want := resp.size.Load(), int32(len(body)); got != want {
+			b.Fatalf("|body| = %d, want = %d", got, want)
+		}
+	}
+
+	b.Run("sequential", func(b *testing.B) {
+		req := request()
+		for j := 0; j < b.N; j++ {
+			test(req, b)
+		}
+	})
+
+	b.Run("parallel", func(b *testing.B) {
+		b.RunParallel(func(pb *testing.PB) {
+			req := request()
+			for pb.Next() {
+				test(req, b)
+			}
+		})
+	})
+}
diff --git a/pkg/activator/handler/metric_handler_test.go b/pkg/activator/handler/metric_handler_test.go
index 0c6a4421c..b7fe5d77a 100644
--- a/pkg/activator/handler/metric_handler_test.go
+++ b/pkg/activator/handler/metric_handler_test.go
@@ -114,8 +114,7 @@ func TestRequestMetricHandler(t *testing.T) {
 				metricstest.AssertMetricExists(t, responseTimeInMsecM.Name())
 			}()
 
-			reqCtx := WithRevision(context.Background(), rev)
-			reqCtx = WithRevID(reqCtx, types.NamespacedName{Namespace: testNamespace, Name: testRevName})
+			reqCtx := WithRevisionAndID(context.Background(), rev, types.NamespacedName{Namespace: testNamespace, Name: testRevName})
 			handler.ServeHTTP(resp, req.WithContext(reqCtx))
 		})
 	}
@@ -128,7 +127,7 @@ func reset() {
 
 func BenchmarkMetricHandler(b *testing.B) {
 	baseHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})
-	reqCtx := WithRevision(context.Background(), revision(testNamespace, testRevName))
+	reqCtx := WithRevisionAndID(context.Background(), revision(testNamespace, testRevName), types.NamespacedName{Namespace: testNamespace, Name: testRevName})
 
 	handler := NewMetricHandler("benchPod", baseHandler)
 
diff --git a/pkg/apis/serving/v1/revision_lifecycle_test.go b/pkg/apis/serving/v1/revision_lifecycle_test.go
index d6f90e915..5f7410937 100644
--- a/pkg/apis/serving/v1/revision_lifecycle_test.go
+++ b/pkg/apis/serving/v1/revision_lifecycle_test.go
@@ -31,7 +31,7 @@ import (
 	duckv1 "knative.dev/pkg/apis/duck/v1"
 	apistest "knative.dev/pkg/apis/testing"
 	"knative.dev/pkg/ptr"
-	av1alpha1 "knative.dev/serving/pkg/apis/autoscaling/v1alpha1"
+	autoscalingv1alpha1 "knative.dev/serving/pkg/apis/autoscaling/v1alpha1"
 	"knative.dev/serving/pkg/apis/config"
 )
 
@@ -529,19 +529,19 @@ func TestPropagateAutoscalerStatus(t *testing.T) {
 	apistest.CheckConditionOngoing(r, RevisionConditionReady, t)
 
 	// PodAutoscaler has no active condition, so we are just coming up.
-	r.PropagateAutoscalerStatus(&av1alpha1.PodAutoscalerStatus{
+	r.PropagateAutoscalerStatus(&autoscalingv1alpha1.PodAutoscalerStatus{
 		Status: duckv1.Status{},
 	})
 	apistest.CheckConditionOngoing(r, RevisionConditionActive, t)
 
 	// PodAutoscaler becomes ready, making us active.
-	r.PropagateAutoscalerStatus(&av1alpha1.PodAutoscalerStatus{
+	r.PropagateAutoscalerStatus(&autoscalingv1alpha1.PodAutoscalerStatus{
 		Status: duckv1.Status{
 			Conditions: duckv1.Conditions{{
-				Type:   av1alpha1.PodAutoscalerConditionReady,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionReady,
 				Status: corev1.ConditionTrue,
 			}, {
-				Type:   av1alpha1.PodAutoscalerConditionScaleTargetInitialized,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionScaleTargetInitialized,
 				Status: corev1.ConditionTrue,
 			}},
 		},
@@ -550,13 +550,13 @@ func TestPropagateAutoscalerStatus(t *testing.T) {
 	apistest.CheckConditionSucceeded(r, RevisionConditionReady, t)
 
 	// PodAutoscaler flipping back to Unknown causes Active become ongoing immediately.
-	r.PropagateAutoscalerStatus(&av1alpha1.PodAutoscalerStatus{
+	r.PropagateAutoscalerStatus(&autoscalingv1alpha1.PodAutoscalerStatus{
 		Status: duckv1.Status{
 			Conditions: duckv1.Conditions{{
-				Type:   av1alpha1.PodAutoscalerConditionReady,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionReady,
 				Status: corev1.ConditionUnknown,
 			}, {
-				Type:   av1alpha1.PodAutoscalerConditionScaleTargetInitialized,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionScaleTargetInitialized,
 				Status: corev1.ConditionTrue,
 			}},
 		},
@@ -565,13 +565,13 @@ func TestPropagateAutoscalerStatus(t *testing.T) {
 	apistest.CheckConditionSucceeded(r, RevisionConditionReady, t)
 
 	// PodAutoscaler becoming unready makes Active false, but doesn't affect readiness.
-	r.PropagateAutoscalerStatus(&av1alpha1.PodAutoscalerStatus{
+	r.PropagateAutoscalerStatus(&autoscalingv1alpha1.PodAutoscalerStatus{
 		Status: duckv1.Status{
 			Conditions: duckv1.Conditions{{
-				Type:   av1alpha1.PodAutoscalerConditionReady,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionReady,
 				Status: corev1.ConditionFalse,
 			}, {
-				Type:   av1alpha1.PodAutoscalerConditionScaleTargetInitialized,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionScaleTargetInitialized,
 				Status: corev1.ConditionTrue,
 			}},
 		},
@@ -592,13 +592,13 @@ func TestPAResAvailableNoOverride(t *testing.T) {
 	r.MarkResourcesAvailableFalse("somehow", "somewhere")
 
 	// PodAutoscaler achieved initial scale.
-	r.PropagateAutoscalerStatus(&av1alpha1.PodAutoscalerStatus{
+	r.PropagateAutoscalerStatus(&autoscalingv1alpha1.PodAutoscalerStatus{
 		Status: duckv1.Status{
 			Conditions: duckv1.Conditions{{
-				Type:   av1alpha1.PodAutoscalerConditionReady,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionReady,
 				Status: corev1.ConditionUnknown,
 			}, {
-				Type:   av1alpha1.PodAutoscalerConditionScaleTargetInitialized,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionScaleTargetInitialized,
 				Status: corev1.ConditionTrue,
 			}},
 		},
@@ -617,14 +617,14 @@ func TestPropagateAutoscalerStatusNoProgress(t *testing.T) {
 	apistest.CheckConditionOngoing(r, RevisionConditionReady, t)
 
 	// PodAutoscaler is not ready and initial scale was never attained.
-	r.PropagateAutoscalerStatus(&av1alpha1.PodAutoscalerStatus{
+	r.PropagateAutoscalerStatus(&autoscalingv1alpha1.PodAutoscalerStatus{
 		ServiceName: "testRevision",
 		Status: duckv1.Status{
 			Conditions: duckv1.Conditions{{
-				Type:   av1alpha1.PodAutoscalerConditionReady,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionReady,
 				Status: corev1.ConditionFalse,
 			}, {
-				Type:   av1alpha1.PodAutoscalerConditionScaleTargetInitialized,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionScaleTargetInitialized,
 				Status: corev1.ConditionUnknown,
 			}},
 		},
@@ -640,13 +640,13 @@ func TestPropagateAutoscalerStatusNoProgress(t *testing.T) {
 	r.MarkResourcesAvailableFalse("another-one", "bit-the-dust")
 
 	// And apply the status.
-	r.PropagateAutoscalerStatus(&av1alpha1.PodAutoscalerStatus{
+	r.PropagateAutoscalerStatus(&autoscalingv1alpha1.PodAutoscalerStatus{
 		Status: duckv1.Status{
 			Conditions: duckv1.Conditions{{
-				Type:   av1alpha1.PodAutoscalerConditionReady,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionReady,
 				Status: corev1.ConditionFalse,
 			}, {
-				Type:   av1alpha1.PodAutoscalerConditionScaleTargetInitialized,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionScaleTargetInitialized,
 				Status: corev1.ConditionUnknown,
 			}},
 		},
@@ -664,19 +664,19 @@ func TestPropagateAutoscalerStatusRace(t *testing.T) {
 	apistest.CheckConditionOngoing(r, RevisionConditionReady, t)
 
 	// PodAutoscaler has no active condition, so we are just coming up.
-	r.PropagateAutoscalerStatus(&av1alpha1.PodAutoscalerStatus{
+	r.PropagateAutoscalerStatus(&autoscalingv1alpha1.PodAutoscalerStatus{
 		Status: duckv1.Status{},
 	})
 	apistest.CheckConditionOngoing(r, RevisionConditionActive, t)
 
 	// The PodAutoscaler might have been ready but it's scaled down already.
-	r.PropagateAutoscalerStatus(&av1alpha1.PodAutoscalerStatus{
+	r.PropagateAutoscalerStatus(&autoscalingv1alpha1.PodAutoscalerStatus{
 		Status: duckv1.Status{
 			Conditions: duckv1.Conditions{{
-				Type:   av1alpha1.PodAutoscalerConditionReady,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionReady,
 				Status: corev1.ConditionFalse,
 			}, {
-				Type:   av1alpha1.PodAutoscalerConditionScaleTargetInitialized,
+				Type:   autoscalingv1alpha1.PodAutoscalerConditionScaleTargetInitialized,
 				Status: corev1.ConditionTrue,
 			}},
 		},
diff --git a/pkg/reconciler/revision/resources/deploy_test.go b/pkg/reconciler/revision/resources/deploy_test.go
index ccc964aff..19c70120c 100644
--- a/pkg/reconciler/revision/resources/deploy_test.go
+++ b/pkg/reconciler/revision/resources/deploy_test.go
@@ -98,6 +98,7 @@ var (
 					}},
 				},
 			},
+			PeriodSeconds: 1,
 		},
 		SecurityContext: queueSecurityContext,
 		Env: []corev1.EnvVar{{
diff --git a/pkg/reconciler/revision/resources/queue_test.go b/pkg/reconciler/revision/resources/queue_test.go
index 1644d722c..5dfb83de6 100644
--- a/pkg/reconciler/revision/resources/queue_test.go
+++ b/pkg/reconciler/revision/resources/queue_test.go
@@ -735,10 +735,7 @@ func TestTCPProbeGeneration(t *testing.T) {
 						}},
 					},
 				},
-				// The ReadinessProbe does not override the user's probe parameters.
-				// (The aggressive probing will have happened on startup, now
-				// we can probe at the user-requested/default interval).
-				PeriodSeconds:    0,
+				PeriodSeconds:    1,
 				TimeoutSeconds:   0,
 				SuccessThreshold: 3,
 			}
diff --git a/pkg/reconciler/route/route_test.go b/pkg/reconciler/route/route_test.go
index aea375ad4..d86e7d966 100644
--- a/pkg/reconciler/route/route_test.go
+++ b/pkg/reconciler/route/route_test.go
@@ -213,7 +213,8 @@ func TestCreateRouteForOneReserveRevision(t *testing.T) {
 
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
@@ -342,7 +343,8 @@ func TestCreateRouteWithMultipleTargets(t *testing.T) {
 	ci := getRouteIngressFromClient(ctx, t, route)
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
@@ -459,7 +461,8 @@ func TestCreateRouteWithOneTargetReserve(t *testing.T) {
 	ci := getRouteIngressFromClient(ctx, t, route)
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
@@ -590,7 +593,8 @@ func TestCreateRouteWithDuplicateTargets(t *testing.T) {
 	ci := getRouteIngressFromClient(ctx, t, route)
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
@@ -795,7 +799,8 @@ func TestCreateRouteWithNamedTargets(t *testing.T) {
 	ci := getRouteIngressFromClient(ctx, t, route)
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
@@ -1003,7 +1008,8 @@ func TestCreateRouteWithNamedTargetsAndTagBasedRouting(t *testing.T) {
 	ci := getRouteIngressFromClient(ctx, t, route)
 	domain := strings.Join([]string{route.Name, route.Namespace, defaultDomainSuffix}, ".")
 	expectedSpec := v1alpha1.IngressSpec{
-		TLS: []v1alpha1.IngressTLS{},
+		HTTPOption: v1alpha1.HTTPOptionEnabled,
+		TLS:        []v1alpha1.IngressTLS{},
 		Rules: []v1alpha1.IngressRule{{
 			Hosts: []string{
 				"test-route.test",
diff --git a/pkg/reconciler/route/table_test.go b/pkg/reconciler/route/table_test.go
index 6637c273f..7d815d006 100644
--- a/pkg/reconciler/route/table_test.go
+++ b/pkg/reconciler/route/table_test.go
@@ -2553,103 +2553,6 @@ func wildcardCert(namespace string, domain string) *netv1alpha1.Certificate {
 	return cert
 }
 
-func TestReconcileEnableAutoTLSHTTPDisabled(t *testing.T) {
-	table := TableTest{{
-		Name: "check that Route is correctly updated when Certificate is not ready",
-		Objects: []runtime.Object{
-			Route("default", "becomes-ready", WithConfigTarget("config"), WithRouteUID("12-34")),
-			cfg("default", "config",
-				WithConfigGeneration(1), WithLatestCreated("config-00001"), WithLatestReady("config-00001")),
-			rev("default", "config", 1, MarkRevisionReady, WithRevName("config-00001"), WithK8sServiceName),
-			// MakeCertificates will create a certificate with DNS name "*.test-ns.example.com" which is not the host name
-			// needed by the input Route.
-			&netv1alpha1.Certificate{
-				ObjectMeta: metav1.ObjectMeta{
-					Name:      "route-12-34",
-					Namespace: "default",
-					Labels: map[string]string{
-						serving.RouteLabelKey: "becomes-ready",
-					},
-					OwnerReferences: []metav1.OwnerReference{*kmeta.NewControllerRef(
-						Route("default", "becomes-ready", WithConfigTarget("config"), WithRouteUID("12-34")))},
-					Annotations: map[string]string{
-						networking.CertificateClassAnnotationKey: network.CertManagerCertificateClassName,
-					},
-				},
-				Spec: netv1alpha1.CertificateSpec{
-					DNSNames: []string{"abc.test.example.com"},
-				},
-				Status: notReadyCertStatus(),
-			},
-		},
-		WantCreates: []runtime.Object{
-			ingressWithTLS(
-				Route("default", "becomes-ready", WithConfigTarget("config"), WithURL,
-					WithRouteUID("12-34")),
-				&traffic.Config{
-					Targets: map[string]traffic.RevisionTargets{
-						traffic.DefaultTarget: {{
-							TrafficTarget: v1.TrafficTarget{
-								LatestRevision:    ptr.Bool(true),
-								ConfigurationName: "config",
-								RevisionName:      "config-00001",
-								Percent:           ptr.Int64(100),
-							},
-						}},
-					},
-				}, nil, nil),
-			simpleK8sService(
-				Route("default", "becomes-ready", WithConfigTarget("config"), WithRouteUID("12-34")),
-				WithExternalName("becomes-ready.default.example.com"),
-			),
-		},
-		WantUpdates: []clientgotesting.UpdateActionImpl{{
-			Object: certificateWithStatus(resources.MakeCertificates(Route("default", "becomes-ready", WithConfigTarget("config"), WithURL, WithRouteUID("12-34")),
-				map[string]string{"becomes-ready.default.example.com": ""}, network.CertManagerCertificateClassName)[0], notReadyCertStatus()),
-		}},
-		WantStatusUpdates: []clientgotesting.UpdateActionImpl{{
-			Object: Route("default", "becomes-ready", WithConfigTarget("config"),
-				WithRouteUID("12-34"),
-				// Populated by reconciliation when all traffic has been assigned.
-				WithAddress, WithInitRouteConditions,
-				MarkTrafficAssigned, MarkIngressNotConfigured, WithStatusTraffic(
-					v1.TrafficTarget{
-						RevisionName:   "config-00001",
-						Percent:        ptr.Int64(100),
-						LatestRevision: ptr.Bool(true),
-					}), MarkCertificateNotReady, MarkIngressNotConfigured,
-				// The certificate is not ready. But we still want to have HTTPS URL.
-				WithHTTPSDomain),
-		}},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeNormal, "Created", "Created placeholder service %q", "becomes-ready"),
-			Eventf(corev1.EventTypeNormal, "Updated", "Updated Spec for Certificate %s/%s", "default", "route-12-34"),
-			Eventf(corev1.EventTypeNormal, "Created", "Created Ingress %q", "becomes-ready"),
-		},
-		Key: "default/becomes-ready",
-	}}
-	table.Test(t, MakeFactory(func(ctx context.Context, listers *Listers, cmw configmap.Watcher) controller.Reconciler {
-		cfg := reconcilerTestConfig(true)
-		cfg.Network.HTTPProtocol = network.HTTPDisabled
-		r := &Reconciler{
-			kubeclient:          kubeclient.Get(ctx),
-			client:              servingclient.Get(ctx),
-			netclient:           networkingclient.Get(ctx),
-			configurationLister: listers.GetConfigurationLister(),
-			revisionLister:      listers.GetRevisionLister(),
-			serviceLister:       listers.GetK8sServiceLister(),
-			ingressLister:       listers.GetIngressLister(),
-			certificateLister:   listers.GetCertificateLister(),
-			tracker:             &NullTracker{},
-			clock:               clock.NewFakePassiveClock(fakeCurTime),
-		}
-
-		return routereconciler.NewReconciler(ctx, logging.FromContext(ctx), servingclient.Get(ctx),
-			listers.GetRouteLister(), controller.GetEventRecorder(ctx), r,
-			controller.Options{ConfigStore: &testConfigStore{config: cfg}})
-	}))
-}
-
 func cfg(namespace, name string, co ...ConfigOption) *v1.Configuration {
 	cfg := &v1.Configuration{
 		ObjectMeta: metav1.ObjectMeta{
diff --git a/pkg/testing/v1alpha1/domainmapping.go b/pkg/testing/v1alpha1/domainmapping.go
new file mode 100644
index 000000000..91800829d
--- /dev/null
+++ b/pkg/testing/v1alpha1/domainmapping.go
@@ -0,0 +1,47 @@
+/*
+Copyright 2021 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1alpha1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	duckv1 "knative.dev/pkg/apis/duck/v1"
+	"knative.dev/serving/pkg/apis/serving/v1alpha1"
+)
+
+// KReference creates a KReference which points to KService.
+func KReference(namespace, name string) *duckv1.KReference {
+	return &duckv1.KReference{
+		Namespace:  namespace,
+		Name:       name,
+		APIVersion: "serving.knative.dev/v1",
+		Kind:       "Service",
+	}
+}
+
+// DomainMapping creates a domainmapping with KReference.
+func DomainMapping(namespace, name string, kref *duckv1.KReference) *v1alpha1.DomainMapping {
+	dm := &v1alpha1.DomainMapping{
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: namespace,
+			Name:      name,
+		},
+		Spec: v1alpha1.DomainMappingSpec{
+			Ref: *kref,
+		},
+	}
+	return dm
+}
diff --git a/test/e2e-common.sh b/test/e2e-common.sh
index f3a8302fe..8d0d61efa 100644
--- a/test/e2e-common.sh
+++ b/test/e2e-common.sh
@@ -284,7 +284,7 @@ function install_knative_serving_standard() {
   UNINSTALL_LIST+=( "${CERT_YAML_NAME}" )
 
   echo ">> Installing Knative serving"
-  HA_COMPONENTS+=( "controller" "webhook" "autoscaler-hpa" "autoscaler" "domainmapping-webhook" )
+  HA_COMPONENTS+=( "controller" "webhook" "autoscaler-hpa" "autoscaler" "domain-mapping" "domainmapping-webhook" )
   if [[ "$1" == "HEAD" ]]; then
     local CORE_YAML_NAME=${TMP_DIR}/${SERVING_CORE_YAML##*/}
     sed "s/namespace: ${KNATIVE_DEFAULT_NAMESPACE}/namespace: ${SYSTEM_NAMESPACE}/g" ${SERVING_CORE_YAML} > ${CORE_YAML_NAME}
diff --git a/test/e2e-tests.sh b/test/e2e-tests.sh
index 4710d8bb8..81072515c 100755
--- a/test/e2e-tests.sh
+++ b/test/e2e-tests.sh
@@ -138,6 +138,8 @@ go_test_e2e -timeout=20m -parallel=300 ./test/scale || failed=1
 # Run HA tests separately as they're stopping core Knative Serving pods.
 # Define short -spoofinterval to ensure frequent probing while stopping pods.
 go_test_e2e -timeout=25m -failfast -parallel=1 ./test/ha \
+            ${alpha} \
+            --enable-beta \
 	    -replicas="${REPLICAS:-1}" -buckets="${BUCKETS:-1}" -spoofinterval="10ms" || failed=1
 
 (( failed )) && fail_test
diff --git a/test/ha/activator_test.go b/test/ha/activator_test.go
index b463834e7..fb1965bf7 100644
--- a/test/ha/activator_test.go
+++ b/test/ha/activator_test.go
@@ -116,7 +116,7 @@ func testActivatorHA(t *testing.T, gracePeriod *int64, slo float64) {
 		}
 
 		t.Log("Test if service still works")
-		assertServiceEventuallyWorks(t, clients, namesScaleToZero, resourcesScaleToZero.Service.Status.URL.URL(), test.PizzaPlanetText1)
+		assertServiceEventuallyWorks(t, clients, namesScaleToZero, resourcesScaleToZero.Service.Status.URL.URL(), test.PizzaPlanetText1, test.ServingFlags.ResolvableDomain)
 
 		t.Logf("Wait for activator%d (%s) to vanish", i, activator.Name)
 		if err := pkgTest.WaitForPodDeleted(context.Background(), clients.KubeClient, activator.Name, system.Namespace()); err != nil {
diff --git a/test/ha/autoscalerhpa_test.go b/test/ha/autoscalerhpa_test.go
index cf18ecb10..3962556ce 100644
--- a/test/ha/autoscalerhpa_test.go
+++ b/test/ha/autoscalerhpa_test.go
@@ -78,7 +78,7 @@ func TestAutoscalerHPAHANewRevision(t *testing.T) {
 	}
 
 	url := resources.Service.Status.URL.URL()
-	assertServiceEventuallyWorks(t, clients, names, url, test.PizzaPlanetText1)
+	assertServiceEventuallyWorks(t, clients, names, url, test.PizzaPlanetText1, test.ServingFlags.ResolvableDomain)
 
 	t.Log("Updating the Service after selecting new leader controller in order to generate a new revision")
 	names.Image = test.PizzaPlanet2
@@ -93,5 +93,5 @@ func TestAutoscalerHPAHANewRevision(t *testing.T) {
 		t.Fatal("New image not reflected in Service:", err)
 	}
 
-	assertServiceEventuallyWorks(t, clients, names, url, test.PizzaPlanetText2)
+	assertServiceEventuallyWorks(t, clients, names, url, test.PizzaPlanetText2, test.ServingFlags.ResolvableDomain)
 }
diff --git a/test/ha/domainmapping_test.go b/test/ha/domainmapping_test.go
new file mode 100644
index 000000000..5187ed5dc
--- /dev/null
+++ b/test/ha/domainmapping_test.go
@@ -0,0 +1,190 @@
+// +build e2e
+
+/*
+Copyright 2021 The Knative Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package ha
+
+import (
+	"context"
+	"net/url"
+	"testing"
+
+	apierrs "k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apimachinery/pkg/util/wait"
+	"knative.dev/pkg/reconciler"
+	"knative.dev/pkg/system"
+	pkgTest "knative.dev/pkg/test"
+	pkgHa "knative.dev/pkg/test/ha"
+	"knative.dev/serving/pkg/apis/serving/v1alpha1"
+	v1alpha1test "knative.dev/serving/pkg/testing/v1alpha1"
+	"knative.dev/serving/test"
+	"knative.dev/serving/test/e2e"
+	v1test "knative.dev/serving/test/v1"
+)
+
+const (
+	domainmappingDeploymentName = "domain-mapping"
+)
+
+func TestDomainMappingHA(t *testing.T) {
+	if !test.ServingFlags.EnableAlphaFeatures {
+		t.Skip("Alpha features not enabled")
+	}
+
+	ctx, clients := context.Background(), test.Setup(t)
+
+	if err := pkgTest.WaitForDeploymentScale(ctx, clients.KubeClient, domainmappingDeploymentName, system.Namespace(), test.ServingFlags.Replicas); err != nil {
+		t.Fatalf("Deployment %s not scaled to %d: %v", domainmappingDeploymentName, test.ServingFlags.Replicas, err)
+	}
+
+	leaders, err := pkgHa.WaitForNewLeaders(ctx, t, clients.KubeClient, domainmappingDeploymentName, system.Namespace(), sets.NewString(), test.ServingFlags.Buckets)
+	if err != nil {
+		t.Fatal("Failed to get leader:", err)
+	}
+	t.Log("Got initial leader set:", leaders)
+
+	names := test.ResourceNames{
+		Service: test.ObjectNameForTest(t),
+		Image:   test.PizzaPlanet1,
+	}
+
+	// Clean up on test failure or interrupt.
+	test.EnsureTearDown(t, clients, &names)
+
+	// Set up initial Service.
+	svc, err := v1test.CreateServiceReady(t, clients, &names)
+	if err != nil {
+		t.Fatalf("Failed to create initial Service %v: %v", names.Service, err)
+	}
+
+	// Using fixed hostnames can lead to conflicts when multiple tests run at
+	// once, so include the svc name to avoid collisions.
+	host := svc.Service.Name + ".example.org"
+	// Set resolvabledomain for custom domain to false by default.
+	resolvableCustomDomain := false
+
+	if test.ServingFlags.CustomDomain != "" {
+		host = svc.Service.Name + "." + test.ServingFlags.CustomDomain
+		resolvableCustomDomain = true
+	}
+	// Point DomainMapping at our service.
+	var dm *v1alpha1.DomainMapping
+	if err := reconciler.RetryTestErrors(func(int) error {
+		dm, err = clients.ServingAlphaClient.DomainMappings.Create(ctx,
+			v1alpha1test.DomainMapping(svc.Service.Namespace, host, v1alpha1test.KReference(svc.Service.Namespace, svc.Service.Name)),
+			metav1.CreateOptions{})
+		return err
+	}); err != nil {
+		t.Fatalf("Create(DomainMapping) = %v, expected no error", err)
+	}
+
+	t.Cleanup(func() {
+		clients.ServingAlphaClient.DomainMappings.Delete(ctx, dm.Name, metav1.DeleteOptions{})
+	})
+
+	// Wait for DomainMapping to go Ready.
+	waitErr := wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
+		state, err := clients.ServingAlphaClient.DomainMappings.Get(ctx, dm.Name, metav1.GetOptions{})
+		return state.IsReady(), err
+	})
+	if waitErr != nil {
+		t.Fatalf("The DomainMapping %s was not marked as Ready: %v", dm.Name, waitErr)
+	}
+
+	assertServiceEventuallyWorks(t, clients, names, &url.URL{Scheme: "http", Host: host}, test.PizzaPlanetText1, resolvableCustomDomain)
+
+	for _, leader := range leaders.List() {
+		if err := clients.KubeClient.CoreV1().Pods(system.Namespace()).Delete(ctx, leader,
+			metav1.DeleteOptions{}); err != nil && !apierrs.IsNotFound(err) {
+			t.Fatalf("Failed to delete pod %s: %v", leader, err)
+		}
+		if err := pkgTest.WaitForPodDeleted(ctx, clients.KubeClient, leader, system.Namespace()); err != nil {
+			t.Fatalf("Did not observe %s to actually be deleted: %v", leader, err)
+		}
+	}
+
+	// Wait for all of the old leaders to go away, and then for the right number to be back.
+	if _, err := pkgHa.WaitForNewLeaders(ctx, t, clients.KubeClient, domainmappingDeploymentName, system.Namespace(), leaders, test.ServingFlags.Buckets); err != nil {
+		t.Fatal("Failed to find new leader:", err)
+	}
+
+	// Verify that after changing the leader we can still create a new domainmapping and the second DomainMapping collided with the first.
+
+	altClients := e2e.SetupAlternativeNamespace(t)
+	altNames := test.ResourceNames{
+		Service: test.ObjectNameForTest(t),
+		Image:   test.PizzaPlanet2,
+	}
+	test.EnsureTearDown(t, altClients, &altNames)
+
+	// Set up second Service in alt namespace.
+	altSvc, err := v1test.CreateServiceReady(t, altClients, &altNames)
+	if err != nil {
+		t.Fatalf("Failed to create initial Service %v: %v", altNames.Service, err)
+	}
+
+	// Create second domain mapping with same name in alt namespace - this will collide with the existing mapping.
+	var altDm *v1alpha1.DomainMapping
+	if err := reconciler.RetryTestErrors(func(int) error {
+		altDm, err = altClients.ServingAlphaClient.DomainMappings.Create(ctx,
+			v1alpha1test.DomainMapping(altSvc.Service.Namespace, host, v1alpha1test.KReference(altSvc.Service.Namespace, altSvc.Service.Name)),
+			metav1.CreateOptions{})
+		return err
+	}); err != nil {
+		t.Fatalf("Create(DomainMapping) = %v, expected no error", err)
+	}
+
+	t.Cleanup(func() {
+		altClients.ServingAlphaClient.DomainMappings.Delete(ctx, altDm.Name, metav1.DeleteOptions{})
+	})
+
+	// Second domain mapping should go to DomainMappingConditionDomainClaimed=false state.
+	waitErr = wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
+		state, err := altClients.ServingAlphaClient.DomainMappings.Get(ctx, dm.Name, metav1.GetOptions{})
+		if err != nil {
+			return false, err
+		}
+
+		return state.Generation == state.Status.ObservedGeneration &&
+			state.Status.GetCondition(v1alpha1.DomainMappingConditionDomainClaimed).IsFalse(), nil
+	})
+	if waitErr != nil {
+		t.Fatalf("The second DomainMapping %s did not enter DomainMappingConditionDomainClaimed=false state: %v", altDm.Name, waitErr)
+	}
+
+	// Because the second DomainMapping collided with the first, it should not have taken effect.
+	assertServiceEventuallyWorks(t, clients, names, &url.URL{Scheme: "http", Host: host}, test.PizzaPlanetText1, resolvableCustomDomain)
+
+	// Delete the first DomainMapping.
+	if err := clients.ServingAlphaClient.DomainMappings.Delete(ctx, dm.Name, metav1.DeleteOptions{}); err != nil {
+		t.Fatalf("Delete=%v, expected no error", err)
+	}
+
+	// The second DomainMapping should now be able to claim the domain.
+	waitErr = wait.PollImmediate(test.PollInterval, test.PollTimeout, func() (bool, error) {
+		state, err := altClients.ServingAlphaClient.DomainMappings.Get(ctx, altDm.Name, metav1.GetOptions{})
+		return state.IsReady(), err
+	})
+	if waitErr != nil {
+		t.Fatalf("The second DomainMapping %s was not marked as Ready: %v", dm.Name, waitErr)
+	}
+
+	// The domain name should now point to the second service.
+	assertServiceEventuallyWorks(t, clients, names, &url.URL{Scheme: "http", Host: host}, test.PizzaPlanetText2, resolvableCustomDomain)
+}
diff --git a/test/ha/ha.go b/test/ha/ha.go
index bcd34f7ae..74dd937c1 100644
--- a/test/ha/ha.go
+++ b/test/ha/ha.go
@@ -51,11 +51,11 @@ func createPizzaPlanetService(t *testing.T, fopt ...rtesting.ServiceOption) (tes
 		t.Fatal("Failed to create Service:", err)
 	}
 
-	assertServiceEventuallyWorks(t, clients, names, resources.Service.Status.URL.URL(), test.PizzaPlanetText1)
+	assertServiceEventuallyWorks(t, clients, names, resources.Service.Status.URL.URL(), test.PizzaPlanetText1, test.ServingFlags.ResolvableDomain)
 	return names, resources
 }
 
-func assertServiceEventuallyWorks(t *testing.T, clients *test.Clients, names test.ResourceNames, url *url.URL, expectedText string) {
+func assertServiceEventuallyWorks(t *testing.T, clients *test.Clients, names test.ResourceNames, url *url.URL, expectedText string, resolvabledomain bool) {
 	t.Helper()
 	// Wait for the Service to be ready.
 	if err := v1test.WaitForServiceState(clients.ServingClient, names.Service, v1test.IsServiceReady, "ServiceIsReady"); err != nil {
@@ -69,7 +69,7 @@ func assertServiceEventuallyWorks(t *testing.T, clients *test.Clients, names tes
 		url,
 		v1test.RetryingRouteInconsistency(spoof.MatchesAllOf(spoof.IsStatusOK, pkgTest.EventuallyMatchesBody(expectedText))),
 		"WaitForEndpointToServeText",
-		test.ServingFlags.ResolvableDomain); err != nil {
+		resolvabledomain); err != nil {
 		t.Fatalf("The endpoint for Route %s at %s didn't serve the expected text %q: %v", names.Route, url, expectedText, err)
 	}
 }
diff --git a/third_party/cert-manager-latest/net-certmanager.yaml b/third_party/cert-manager-latest/net-certmanager.yaml
index a2636f33e..70f99daa8 100644
--- a/third_party/cert-manager-latest/net-certmanager.yaml
+++ b/third_party/cert-manager-latest/net-certmanager.yaml
@@ -18,7 +18,7 @@ metadata:
   # These are the permissions needed by the `cert-manager` `Certificate` implementation.
   name: knative-serving-certmanager
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210318-88c14df8"
     serving.knative.dev/controller: "true"
     networking.knative.dev/certificate-provider: cert-manager
 rules:
@@ -49,7 +49,7 @@ kind: ValidatingWebhookConfiguration
 metadata:
   name: config.webhook.net-certmanager.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210318-88c14df8"
 webhooks:
   - admissionReviewVersions:
       - v1beta1
@@ -86,7 +86,7 @@ metadata:
   name: net-certmanager-webhook-certs
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210318-88c14df8"
 
 ---
 # Copyright 2020 The Knative Authors
@@ -109,7 +109,7 @@ metadata:
   name: config-certmanager
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210318-88c14df8"
     networking.knative.dev/certificate-provider: cert-manager
 data:
   _example: |
@@ -156,7 +156,7 @@ metadata:
   name: networking-certmanager
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210318-88c14df8"
     networking.knative.dev/certificate-provider: cert-manager
 spec:
   selector:
@@ -168,14 +168,14 @@ spec:
         cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
       labels:
         app: networking-certmanager
-        serving.knative.dev/release: "v20210310-3038fe98"
+        serving.knative.dev/release: "v20210318-88c14df8"
     spec:
       serviceAccountName: controller
       containers:
         - name: networking-certmanager
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/controller@sha256:396e562c2d723b93ec55cb53e4e3058acdae9de4a98267baf29d6dff6f477f10
+          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/controller@sha256:ac2d50ae0b61b0d46b7e77ca7825e81354039e9eec06c2edf17d217bca8756c0
           resources:
             requests:
               cpu: 30m
@@ -213,7 +213,7 @@ kind: Service
 metadata:
   labels:
     app: networking-certmanager
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210318-88c14df8"
     networking.knative.dev/certificate-provider: cert-manager
   name: networking-certmanager
   namespace: knative-serving
@@ -250,7 +250,7 @@ metadata:
   name: net-certmanager-webhook
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210318-88c14df8"
 spec:
   selector:
     matchLabels:
@@ -263,14 +263,14 @@ spec:
       labels:
         app: net-certmanager-webhook
         role: net-certmanager-webhook
-        serving.knative.dev/release: "v20210310-3038fe98"
+        serving.knative.dev/release: "v20210318-88c14df8"
     spec:
       serviceAccountName: controller
       containers:
         - name: webhook
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/webhook@sha256:620cebbf1401e9707d03da06e970e09030168bda1130affaa82b28815a9038ff
+          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/webhook@sha256:8a40cf1ef0e413942c98c1542b676b5b4b0be61fa21acad5571e3f0a66305c98
           resources:
             requests:
               cpu: 20m
@@ -329,7 +329,7 @@ metadata:
   namespace: knative-serving
   labels:
     role: net-certmanager-webhook
-    serving.knative.dev/release: "v20210310-3038fe98"
+    serving.knative.dev/release: "v20210318-88c14df8"
 spec:
   ports:
     # Define metrics and profiling for them to be accessible within service meshes.
diff --git a/third_party/contour-latest/contour.yaml b/third_party/contour-latest/contour.yaml
index 2af14a751..35070cd42 100644
--- a/third_party/contour-latest/contour.yaml
+++ b/third_party/contour-latest/contour.yaml
@@ -1789,7 +1789,7 @@ spec:
     spec:
       containers:
         - name: contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:3ec696c6cec3559a4d2f82eb6e9d373143491c6712c9e8e302c6f6edf44b6c9b
           imagePullPolicy: Always
           command:
             - contour
@@ -2024,7 +2024,7 @@ spec:
             - --contour-key-file=/certs/tls.key
             - --config-path=/config/contour.yaml
           command: ["contour"]
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:3ec696c6cec3559a4d2f82eb6e9d373143491c6712c9e8e302c6f6edf44b6c9b
           imagePullPolicy: IfNotPresent
           name: contour
           ports:
@@ -2113,7 +2113,7 @@ spec:
           args:
             - envoy
             - shutdown-manager
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:3ec696c6cec3559a4d2f82eb6e9d373143491c6712c9e8e302c6f6edf44b6c9b
           imagePullPolicy: IfNotPresent
           lifecycle:
             preStop:
@@ -2192,7 +2192,7 @@ spec:
             - --envoy-key-file=/certs/tls.key
           command:
             - contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:3ec696c6cec3559a4d2f82eb6e9d373143491c6712c9e8e302c6f6edf44b6c9b
           imagePullPolicy: IfNotPresent
           name: envoy-initconfig
           volumeMounts:
@@ -2450,7 +2450,7 @@ spec:
     spec:
       containers:
         - name: contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:3ec696c6cec3559a4d2f82eb6e9d373143491c6712c9e8e302c6f6edf44b6c9b
           imagePullPolicy: Always
           command:
             - contour
@@ -2570,7 +2570,7 @@ spec:
             - --contour-key-file=/certs/tls.key
             - --config-path=/config/contour.yaml
           command: ["contour"]
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:3ec696c6cec3559a4d2f82eb6e9d373143491c6712c9e8e302c6f6edf44b6c9b
           imagePullPolicy: IfNotPresent
           name: contour
           ports:
@@ -2659,7 +2659,7 @@ spec:
           args:
             - envoy
             - shutdown-manager
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:3ec696c6cec3559a4d2f82eb6e9d373143491c6712c9e8e302c6f6edf44b6c9b
           imagePullPolicy: IfNotPresent
           lifecycle:
             preStop:
@@ -2738,7 +2738,7 @@ spec:
             - --envoy-key-file=/certs/tls.key
           command:
             - contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:36d1a4f55f1f983512474012d93f2c45678f92b426b507846272647ad95f54c3
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:3ec696c6cec3559a4d2f82eb6e9d373143491c6712c9e8e302c6f6edf44b6c9b
           imagePullPolicy: IfNotPresent
           name: envoy-initconfig
           volumeMounts:
diff --git a/third_party/contour-latest/net-contour.yaml b/third_party/contour-latest/net-contour.yaml
index a90c738c7..3a546c225 100644
--- a/third_party/contour-latest/net-contour.yaml
+++ b/third_party/contour-latest/net-contour.yaml
@@ -33,7 +33,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: contour
-    serving.knative.dev/release: "v20210309-51e90c2e"
+    serving.knative.dev/release: "v20210319-42ebe377"
 data:
   _example: |
     ################################
@@ -103,7 +103,7 @@ spec:
         - name: controller
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-contour/cmd/controller@sha256:1710a98b53ec9ccd34e8844940f984a41a0fc2f3dc1e9e853c4ae0ca4b4c4bf7
+          image: gcr.io/knative-nightly/knative.dev/net-contour/cmd/controller@sha256:6f29f09027eb4cfec065fde819e5eb1840b182b86399fb11deb1538a3a7aada6
           resources:
             requests:
               cpu: 40m
diff --git a/third_party/istio-latest/net-istio.yaml b/third_party/istio-latest/net-istio.yaml
index 7e5624e4d..88adf369b 100644
--- a/third_party/istio-latest/net-istio.yaml
+++ b/third_party/istio-latest/net-istio.yaml
@@ -1,4 +1,4 @@
-# Generated when HEAD was ad2b7bb8892845cfc07791d7e59ccb3bd2dc2001
+# Generated when HEAD was 26f93f89f27ce8535d4768d0e75724e9fceb2c7f
 #
 # Copyright 2019 The Knative Authors
 #
@@ -20,7 +20,7 @@ metadata:
   # These are the permissions needed by the Istio Ingress implementation.
   name: knative-serving-istio
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     serving.knative.dev/controller: "true"
     networking.knative.dev/ingress-provider: istio
 rules:
@@ -50,7 +50,7 @@ metadata:
   name: knative-ingress-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -87,7 +87,7 @@ metadata:
   name: knative-local-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -106,7 +106,7 @@ metadata:
   name: knative-local-gateway
   namespace: istio-system
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 spec:
   type: ClusterIP
@@ -126,7 +126,7 @@ metadata:
   name: "webhook"
   namespace: "knative-serving"
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -142,7 +142,7 @@ metadata:
   name: "domainmapping-webhook"
   namespace: "knative-serving"
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -158,7 +158,7 @@ metadata:
   name: "istio-webhook"
   namespace: "knative-serving"
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -188,7 +188,7 @@ kind: MutatingWebhookConfiguration
 metadata:
   name: webhook.istio.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 webhooks:
   - admissionReviewVersions:
@@ -224,7 +224,7 @@ kind: ValidatingWebhookConfiguration
 metadata:
   name: config.webhook.istio.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 webhooks:
   - admissionReviewVersions:
@@ -262,7 +262,7 @@ metadata:
   name: istio-webhook-certs
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 
 ---
@@ -286,7 +286,7 @@ metadata:
   name: config-istio
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 data:
   _example: |
@@ -337,6 +337,10 @@ data:
     # If true, knative will use the Istio VirtualService's status to determine
     # endpoint readiness. Otherwise, probe as usual.
     enable-virtualservice-status: "false"
+
+    # If true, knative will add additional information to all deployed applications to
+    # make their pods directly accessible via their IPs even if mesh is enabled.
+    enable-mesh-pod-addressability: "false"
   # TODO(nghia): Extract the .svc.cluster.local suffix into its own config.
 
 ---
@@ -360,7 +364,7 @@ metadata:
   name: networking-istio
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -376,14 +380,14 @@ spec:
         sidecar.istio.io/inject: "false"
       labels:
         app: networking-istio
-        serving.knative.dev/release: "v20210311-ad2b7bb8"
+        serving.knative.dev/release: "v20210322-26f93f89"
     spec:
       serviceAccountName: controller
       containers:
         - name: networking-istio
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/controller@sha256:86c8bb08b5b54674deb8a54659acfa5599002713e3cec32ad6f1ba6e815ee9dc
+          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/controller@sha256:cf8e00484e07bad3ae4227cd57abd3bd7df5d8eaa698b0cf3330e1c055ef7757
           resources:
             requests:
               cpu: 30m
@@ -440,7 +444,7 @@ metadata:
   name: istio-webhook
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -454,14 +458,14 @@ spec:
       labels:
         app: istio-webhook
         role: istio-webhook
-        serving.knative.dev/release: "v20210311-ad2b7bb8"
+        serving.knative.dev/release: "v20210322-26f93f89"
     spec:
       serviceAccountName: controller
       containers:
         - name: webhook
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/webhook@sha256:69462b6970e29647457f15ec6610436c2900f7cb12acf6da5f2c10bd07ac319a
+          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/webhook@sha256:92635e583ec7f6ac0aab92ca9e25f5efc645d7921792d21d7d42dcb8bb3634c5
           resources:
             requests:
               cpu: 20m
@@ -515,7 +519,7 @@ metadata:
   namespace: knative-serving
   labels:
     role: istio-webhook
-    serving.knative.dev/release: "v20210311-ad2b7bb8"
+    serving.knative.dev/release: "v20210322-26f93f89"
     networking.knative.dev/ingress-provider: istio
 spec:
   ports:
diff --git a/third_party/kourier-latest/kourier.yaml b/third_party/kourier-latest/kourier.yaml
index 4825d72f7..f4486ecf5 100644
--- a/third_party/kourier-latest/kourier.yaml
+++ b/third_party/kourier-latest/kourier.yaml
@@ -18,7 +18,7 @@ metadata:
   name: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210311-74129975"
+    serving.knative.dev/release: "v20210319-04187e96"
 
 ---
 # Copyright 2020 The Knative Authors
@@ -42,7 +42,7 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210311-74129975"
+    serving.knative.dev/release: "v20210319-04187e96"
 data:
   envoy-bootstrap.yaml: |
     dynamic_resources:
@@ -113,7 +113,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210311-74129975"
+    serving.knative.dev/release: "v20210319-04187e96"
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
@@ -122,7 +122,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210311-74129975"
+    serving.knative.dev/release: "v20210319-04187e96"
 rules:
   - apiGroups: [""]
     resources: ["events"]
@@ -149,7 +149,7 @@ metadata:
   name: 3scale-kourier
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210311-74129975"
+    serving.knative.dev/release: "v20210319-04187e96"
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -181,7 +181,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210311-74129975"
+    serving.knative.dev/release: "v20210319-04187e96"
 spec:
   replicas: 1
   selector:
@@ -193,7 +193,7 @@ spec:
         app: 3scale-kourier-control
     spec:
       containers:
-        - image: gcr.io/knative-nightly/knative.dev/net-kourier/cmd/kourier@sha256:f04026e993b01f14dd73a981e9a234912fbc9d517eb4aaa6dc7e3e43a7ff1ec9
+        - image: gcr.io/knative-nightly/knative.dev/net-kourier/cmd/kourier@sha256:9179151b77ea735c569ab3fce38ff3ac09e872f528837467f1a3e7bd1c208e5f
           name: kourier-control
           env:
             - name: CERTS_SECRET_NAMESPACE
@@ -229,7 +229,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210311-74129975"
+    serving.knative.dev/release: "v20210319-04187e96"
 spec:
   ports:
     - name: grpc-xds
@@ -262,7 +262,7 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210311-74129975"
+    serving.knative.dev/release: "v20210319-04187e96"
 spec:
   selector:
     matchLabels:
@@ -328,7 +328,7 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210311-74129975"
+    serving.knative.dev/release: "v20210319-04187e96"
 spec:
   ports:
     - name: http2
@@ -350,7 +350,7 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
-    serving.knative.dev/release: "v20210311-74129975"
+    serving.knative.dev/release: "v20210319-04187e96"
 spec:
   ports:
     - name: http2
diff --git a/vendor/knative.dev/hack/e2e-tests.sh b/vendor/knative.dev/hack/e2e-tests.sh
index 0b8548f66..c5906d610 100644
--- a/vendor/knative.dev/hack/e2e-tests.sh
+++ b/vendor/knative.dev/hack/e2e-tests.sh
@@ -37,12 +37,15 @@ function teardown_test_resources() {
 # Parameters: $1..$n - any go test flags, then directories containing the tests to run.
 function go_test_e2e() {
   local go_test_args=()
+  [[ ! " $*" == *" -tags="* ]] && go_test_args+=("-tags=e2e")
+  [[ ! " $*" == *" -count="* ]] && go_test_args+=("-count=1")
+  [[ ! " $*" == *" -race"* ]] && go_test_args+=("-race")
+
   # Remove empty args as `go test` will consider it as running tests for the current directory, which is not expected.
   for arg in "$@"; do
     [[ -n "$arg" ]] && go_test_args+=("$arg")
   done
-  [[ ! " $*" == *" -tags="* ]] && go_test_args+=("-tags=e2e")
-  report_go_test -race -count=1 "${go_test_args[@]}"
+  report_go_test "${go_test_args[@]}"
 }
 
 # Setup the test cluster for running the tests.
@@ -69,8 +72,8 @@ function setup_test_cluster() {
   # Acquire cluster admin role for the current user.
   acquire_cluster_admin_role "${k8s_cluster}"
 
-  # Setup KO_DOCKER_REPO if it is a GKE cluster. Incorporate an element of 
-  # randomness to ensure that each run properly publishes images. Don't 
+  # Setup KO_DOCKER_REPO if it is a GKE cluster. Incorporate an element of
+  # randomness to ensure that each run properly publishes images. Don't
   # owerwrite KO_DOCKER_REPO if already set.
   [ -z "${KO_DOCKER_REPO}" ] && \
     [[ "${k8s_cluster}" =~ ^gke_.* ]] && \
diff --git a/vendor/knative.dev/hack/presubmit-tests.sh b/vendor/knative.dev/hack/presubmit-tests.sh
index e873736be..fb50ac819 100644
--- a/vendor/knative.dev/hack/presubmit-tests.sh
+++ b/vendor/knative.dev/hack/presubmit-tests.sh
@@ -209,7 +209,7 @@ function run_unit_tests() {
 
 # Default unit test runner that runs all go tests in the repo.
 function default_unit_test_runner() {
-  report_go_test -race ./...
+  report_go_test -race -count 1 ./...
 }
 
 # Run integration tests. If there's no `integration_tests` function, run the