Repository: knative/serving
Pull request #9099 (2020-08-19 00:45:07)

Add collector address as env var for queue-proxy
<!--
Request Prow to automatically lint any go code in this PR:

/lint
-->

Fixes queue-proxy metrics when the metric backend is opencensus

<!-- Please include the 'why' behind your changes if no issue exists -->
## Proposed Changes
Add the collector address from `config-observability` as an env var to queue-proxy, enabling queue-proxy to send the metrics to the collector.

**Release Note**

<!-- Enter your extended release note in the below block. If the PR requires
additional action from users switching to the new release, include the string
"action required". If no release note is required, write "NONE". -->

```release-note

```


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

This pull-request has been approved by: *<a href="https://github.com/knative/serving/pull/9099#" title="Author self-approved">jjzeng-seattle</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **mdemirhan**
You can assign the PR to them by writing `/assign @mdemirhan` 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:

- **[OWNERS](https://github.com/knative/serving/blob/master/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":["mdemirhan"]} -->
knative-prow-robot: @jjzeng-seattle: The following test **failed**, say `/retest` to rerun all failed tests:

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

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/9099). [Your PR dashboard](https://gubernator.knative.dev/pr/jjzeng-seattle).

<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: @jjzeng-seattle: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-build-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-build-tests/1295884729819598848) | `/test pull-knative-serving-build-tests`
pull-knative-serving-integration-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-integration-tests/1295884604422492160) | `/test pull-knative-serving-integration-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/9099). [Your PR dashboard](https://gubernator.knative.dev/pr/jjzeng-seattle).

<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-test-reporter-robot: <!--[AUTOMATED-FLAKY-RETRYER]0c27838422bf78b9b440cb1ff762621b0b9c3904[AUTOMATED-FLAKY-RETRYER]-->
The following jobs failed:

Test name | Triggers | Retries
--- | --- | ---
pull-knative-serving-integration-tests | [2020-08-19 01:06:10.793 +0000 UTC](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-integration-tests/1295884604422492160) | 1/3

Automatically retrying due to test flakiness...
/test pull-knative-serving-integration-tests
knative-test-reporter-robot: <!--[AUTOMATED-FLAKY-RETRYER]0c27838422bf78b9b440cb1ff762621b0b9c3904[AUTOMATED-FLAKY-RETRYER]-->
The following jobs failed:

Test name | Triggers | Retries
--- | --- | ---
pull-knative-serving-autotls-tests | [2020-08-19 01:06:10.782 +0000 UTC](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-autotls-tests/1295884604422492161) | 1/3

Automatically retrying due to test flakiness...
/test pull-knative-serving-autotls-tests
knative-prow-robot: @jjzeng-seattle: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-build-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-build-tests/1295884729819598848) | `/test pull-knative-serving-build-tests`
pull-knative-serving-integration-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-integration-tests/1295884604422492160) | `/test pull-knative-serving-integration-tests`
pull-knative-serving-autotls-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-autotls-tests/1295884604422492161) | `/test pull-knative-serving-autotls-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/9099). [Your PR dashboard](https://gubernator.knative.dev/pr/jjzeng-seattle).

<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: @jjzeng-seattle: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-build-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-build-tests/1295884729819598848) | `/test pull-knative-serving-build-tests`
pull-knative-serving-integration-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-integration-tests/1295884604422492160) | `/test pull-knative-serving-integration-tests`
pull-knative-serving-autotls-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-autotls-tests/1295884604422492161) | `/test pull-knative-serving-autotls-tests`
pull-knative-serving-upgrade-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-upgrade-tests/1295884729819598849) | `/test pull-knative-serving-upgrade-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/9099). [Your PR dashboard](https://gubernator.knative.dev/pr/jjzeng-seattle).

<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: @jjzeng-seattle: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-build-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-build-tests/1295884729819598848) | `/test pull-knative-serving-build-tests`
pull-knative-serving-integration-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-integration-tests/1295884604422492160) | `/test pull-knative-serving-integration-tests`
pull-knative-serving-upgrade-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-upgrade-tests/1295884729819598849) | `/test pull-knative-serving-upgrade-tests`
pull-knative-serving-autotls-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-autotls-tests/1295890014718136320) | `/test pull-knative-serving-autotls-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/9099). [Your PR dashboard](https://gubernator.knative.dev/pr/jjzeng-seattle).

<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: @jjzeng-seattle: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-build-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-build-tests/1295884729819598848) | `/test pull-knative-serving-build-tests`
pull-knative-serving-upgrade-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-upgrade-tests/1295884729819598849) | `/test pull-knative-serving-upgrade-tests`
pull-knative-serving-autotls-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-autotls-tests/1295890014718136320) | `/test pull-knative-serving-autotls-tests`
pull-knative-serving-integration-tests | 0c27838422bf78b9b440cb1ff762621b0b9c3904 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/9099/pull-knative-serving-integration-tests/1295890014713942016) | `/test pull-knative-serving-integration-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/9099). [Your PR dashboard](https://gubernator.knative.dev/pr/jjzeng-seattle).

<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 -->

Patch:
diff --git a/.github/workflows/stale.yaml b/.github/workflows/knative-stale.yaml
similarity index 100%
rename from .github/workflows/stale.yaml
rename to .github/workflows/knative-stale.yaml
diff --git a/cmd/queue/main.go b/cmd/queue/main.go
index 5b0d156a7..d85d842f0 100644
--- a/cmd/queue/main.go
+++ b/cmd/queue/main.go
@@ -93,6 +93,7 @@ type config struct {
 	ServingPod                   string `split_words:"true" required:"true"`
 	ServingService               string `split_words:"true"` // optional
 	ServingRequestMetricsBackend string `split_words:"true"` // optional
+	MetricsCollectorAddress      string `split_words:"true"` // optional
 
 	// Tracing configuration
 	TracingConfigDebug                bool                      `split_words:"true"` // optional
@@ -409,7 +410,7 @@ func supportsMetrics(env config, logger *zap.SugaredLogger) bool {
 		return false
 	}
 
-	if err := setupMetricsExporter(env.ServingRequestMetricsBackend); err != nil {
+	if err := setupMetricsExporter(env.ServingRequestMetricsBackend, env.MetricsCollectorAddress); err != nil {
 		logger.Errorw("Error setting up request metrics exporter. Request metrics will be unavailable.", zap.Error(err))
 		return false
 	}
@@ -482,7 +483,7 @@ func requestAppMetricsHandler(currentHandler http.Handler, breaker *queue.Breake
 	return h
 }
 
-func setupMetricsExporter(backend string) error {
+func setupMetricsExporter(backend string, collectorAddress string) error {
 	// Set up OpenCensus exporter.
 	// NOTE: We use revision as the component instead of queue because queue is
 	// implementation specific. The current metrics are request relative. Using
@@ -495,6 +496,7 @@ func setupMetricsExporter(backend string) error {
 		PrometheusPort: networking.UserQueueMetricsPort,
 		ConfigMap: map[string]string{
 			metrics.BackendDestinationKey: backend,
+			"metrics.opencensus-address":  collectorAddress,
 		},
 	}
 	return metrics.UpdateExporter(ops, logger)
diff --git a/config/core/configmaps/features.yaml b/config/core/configmaps/features.yaml
index b3f3bc5f9..c01121a1e 100644
--- a/config/core/configmaps/features.yaml
+++ b/config/core/configmaps/features.yaml
@@ -20,7 +20,7 @@ metadata:
   labels:
     serving.knative.dev/release: devel
   annotations:
-    knative.dev/example-checksum: "dd011edb"
+    knative.dev/example-checksum: "983ddf13"
 data:
   _example: |
     ################################
@@ -92,3 +92,8 @@ data:
     # ALPHA WARNING: This feature is not yet stable or complete. Enabling it
     # should be used for testing purposes only.
     responsive-revision-gc: "disabled"
+
+    # Controls whether tag header based routing feature are enabled or not.
+    # 1. Enabled: enabling tag header based routing
+    # 2. Disabled: disabling tag header based routing
+    tag-header-based-routing: "disabled"
diff --git a/config/core/configmaps/network.yaml b/config/core/configmaps/network.yaml
index 8be9017e6..e59242a6f 100644
--- a/config/core/configmaps/network.yaml
+++ b/config/core/configmaps/network.yaml
@@ -20,7 +20,7 @@ metadata:
   labels:
     serving.knative.dev/release: devel
   annotations:
-    knative.dev/example-checksum: "b22469ec"
+    knative.dev/example-checksum: "44560e65"
 data:
   _example: |
     ################################
@@ -38,13 +38,6 @@ data:
     # this example block and unindented to be in the data block
     # to actually change the configuration.
 
-    # DEPRECATED:
-    # istio.sidecar.includeOutboundIPRanges is obsolete.
-    # The current versions have outbound network access enabled by default.
-    # If you need this option for some reason, please use global.proxy.includeIPRanges in Istio.
-    #
-    # istio.sidecar.includeOutboundIPRanges: "*"
-
     # ingress.class specifies the default ingress class
     # to use when not dictated by Route annotation.
     #
@@ -111,8 +104,3 @@ data:
     # 3. Redirected: The Knative ingress will send a 302 redirect for all
     # http connections, asking the clients to use HTTPS
     httpProtocol: "Enabled"
-
-    # Controls whether tag header based routing feature are enabled or not.
-    # 1. Enabled: enabling tag header based routing
-    # 2. Disabled: disabling tag header based routing
-    tagHeaderBasedRouting: "Disabled"
diff --git a/go.mod b/go.mod
index 75bbb3282..04faa4c88 100644
--- a/go.mod
+++ b/go.mod
@@ -35,10 +35,10 @@ require (
 	k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
 	k8s.io/code-generator v0.18.6
 	k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29
-	knative.dev/caching v0.0.0-20200820161315-4cd021a72a18
-	knative.dev/networking v0.0.0-20200820164014-acfd663203ae
-	knative.dev/pkg v0.0.0-20200820181214-50386ad39634
-	knative.dev/test-infra v0.0.0-20200819210814-f578ab25945b
+	knative.dev/caching v0.0.0-20200821175847-c9d611a83dba
+	knative.dev/networking v0.0.0-20200823191547-a36404ec4654
+	knative.dev/pkg v0.0.0-20200822174146-f0f096d81292
+	knative.dev/test-infra v0.0.0-20200820231346-543fe3e80c03
 )
 
 replace (
diff --git a/go.sum b/go.sum
index e4e399500..3877d950b 100644
--- a/go.sum
+++ b/go.sum
@@ -1008,6 +1008,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
 github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 github.com/rogpeppe/go-internal v1.5.2 h1:qLvObTrvO/XRCqmkKxUlOBc48bI3efyDuAZe25QiF0w=
 github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rs/dnscache v0.0.0-20190621150935-06bb5526f76b/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA=
 github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -1798,12 +1799,12 @@ k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7Mpm
 k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 knative.dev/caching v0.0.0-20190719140829-2032732871ff/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
 knative.dev/caching v0.0.0-20200116200605-67bca2c83dfa/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
-knative.dev/caching v0.0.0-20200820161315-4cd021a72a18 h1:PhTB/DEr/Ms5QNoGNqX9RyE920jYbPGohH+IFM7EzYk=
-knative.dev/caching v0.0.0-20200820161315-4cd021a72a18/go.mod h1:4HR5VudOBe8UTaU5qoMbErBoiKlFSEM9VZ7C64PWPg4=
+knative.dev/caching v0.0.0-20200821175847-c9d611a83dba h1:o0tSwFoMpPnQ7mW9NpQnLyFdmDRM6CrjXl9K262WZ5U=
+knative.dev/caching v0.0.0-20200821175847-c9d611a83dba/go.mod h1:KKc+LgWHmwK+VqxbEGy8STAogNuBYHpKp5d52CnJ7FQ=
 knative.dev/eventing-contrib v0.6.1-0.20190723221543-5ce18048c08b/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g=
 knative.dev/eventing-contrib v0.11.2/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g=
-knative.dev/networking v0.0.0-20200820164014-acfd663203ae h1:gI3H/w23kWFBeST3xImbV0ndDTQTGLPwbq9JDhrnI+0=
-knative.dev/networking v0.0.0-20200820164014-acfd663203ae/go.mod h1:35o/+HeiOoaAC6Hch+MJWzR1TnMmzW6LzBeR9sCyGJY=
+knative.dev/networking v0.0.0-20200823191547-a36404ec4654 h1:p547XsmXFSelh4nOYSzq1qk4fiTtGorrfek0SMQTeZ0=
+knative.dev/networking v0.0.0-20200823191547-a36404ec4654/go.mod h1:24LNCk5qakmWNKf9+C/bLRXoqi7ZrF63jN7LhABIx94=
 knative.dev/pkg v0.0.0-20191101194912-56c2594e4f11/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
 knative.dev/pkg v0.0.0-20191111150521-6d806b998379/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
 knative.dev/pkg v0.0.0-20200207155214-fef852970f43/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
@@ -1812,17 +1813,19 @@ knative.dev/pkg v0.0.0-20200505191044-3da93ebb24c2/go.mod h1:Q6sL35DdGs8hIQZKdaC
 knative.dev/pkg v0.0.0-20200515002500-16d7b963416f/go.mod h1:tMOHGbxtRz8zYFGEGpV/bpoTEM1o89MwYFC4YJXl3GY=
 knative.dev/pkg v0.0.0-20200528142800-1c6815d7e4c9/go.mod h1:QgNZTxnwpB/oSpNcfnLVlw+WpEwwyKAvJlvR3hgeltA=
 knative.dev/pkg v0.0.0-20200711004937-22502028e31a/go.mod h1:AqAJV6rYi8IGikDjJ/9ZQd9qKdkXVlesVnVjwx62YB8=
-knative.dev/pkg v0.0.0-20200819202314-b5411f2221aa/go.mod h1:UQNXXn3xdykWbTkhXYUZnev2H3s82+gNrgxYDJ5jIRE=
 knative.dev/pkg v0.0.0-20200820181214-50386ad39634 h1:qIoOfpUOCmy1AWJ/LEhVd5Oj1Vb2PxEQTL+ui4DIaDc=
 knative.dev/pkg v0.0.0-20200820181214-50386ad39634/go.mod h1:UQNXXn3xdykWbTkhXYUZnev2H3s82+gNrgxYDJ5jIRE=
+knative.dev/pkg v0.0.0-20200821175947-f0c35fcd5ba4/go.mod h1:VK46K0GB3wrFYqDinB5gh79csrWKBtd1GchBYVvtwkY=
+knative.dev/pkg v0.0.0-20200822174146-f0f096d81292 h1:PPGDq/mWT0FhqsmJL9B3rO2I+/wgN48sfGlWyqSx3Bk=
+knative.dev/pkg v0.0.0-20200822174146-f0f096d81292/go.mod h1:VK46K0GB3wrFYqDinB5gh79csrWKBtd1GchBYVvtwkY=
 knative.dev/test-infra v0.0.0-20200407185800-1b88cb3b45a5/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ=
 knative.dev/test-infra v0.0.0-20200505052144-5ea2f705bb55/go.mod h1:WqF1Azka+FxPZ20keR2zCNtiQA1MP9ZB4BH4HuI+SIU=
 knative.dev/test-infra v0.0.0-20200513011557-d03429a76034/go.mod h1:aMif0KXL4g19YCYwsy4Ocjjz5xgPlseYV+B95Oo4JGE=
 knative.dev/test-infra v0.0.0-20200519015156-82551620b0a9/go.mod h1:A5b2OAXTOeHT3hHhVQm3dmtbuWvIDP7qzgtqxA3/2pE=
 knative.dev/test-infra v0.0.0-20200707183444-aed09e56ddc7/go.mod h1:RjYAhXnZqeHw9+B0zsbqSPlae0lCvjekO/nw5ZMpLCs=
 knative.dev/test-infra v0.0.0-20200817225313-c0ea00ce480c/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
-knative.dev/test-infra v0.0.0-20200819210814-f578ab25945b h1:1iSavTEBQtZOWAnTE/4i5E0uGOWn+WgpYDqx++AoiLU=
-knative.dev/test-infra v0.0.0-20200819210814-f578ab25945b/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
+knative.dev/test-infra v0.0.0-20200820231346-543fe3e80c03 h1:tBz8QL+H4chihsWHGDJ8/1xwHiFMDqRWHHid/qlfSoo=
+knative.dev/test-infra v0.0.0-20200820231346-543fe3e80c03/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
 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/apis/config/features.go b/pkg/apis/config/features.go
index 3738358e8..10bde135f 100644
--- a/pkg/apis/config/features.go
+++ b/pkg/apis/config/features.go
@@ -48,6 +48,7 @@ func defaultFeaturesConfig() *Features {
 		PodSpecSecurityContext: Disabled,
 		PodSpecTolerations:     Disabled,
 		ResponsiveRevisionGC:   Disabled,
+		TagHeaderBasedRouting:  Disabled,
 	}
 }
 
@@ -63,7 +64,8 @@ func NewFeaturesConfigFromMap(data map[string]string) (*Features, error) {
 		asFlag("kubernetes.podspec-nodeselector", &nc.PodSpecNodeSelector),
 		asFlag("kubernetes.podspec-securitycontext", &nc.PodSpecSecurityContext),
 		asFlag("kubernetes.podspec-tolerations", &nc.PodSpecTolerations),
-		asFlag("responsive-revision-gc", &nc.ResponsiveRevisionGC)); err != nil {
+		asFlag("responsive-revision-gc", &nc.ResponsiveRevisionGC),
+		asFlag("tag-header-based-routing", &nc.TagHeaderBasedRouting)); err != nil {
 		return nil, err
 	}
 	return nc, nil
@@ -84,6 +86,7 @@ type Features struct {
 	PodSpecTolerations     Flag
 	PodSpecSecurityContext Flag
 	ResponsiveRevisionGC   Flag
+	TagHeaderBasedRouting  Flag
 }
 
 // asFlag parses the value at key as a Flag into the target, if it exists.
diff --git a/pkg/reconciler/revision/resources/queue.go b/pkg/reconciler/revision/resources/queue.go
index e215ade5f..6cbfebe31 100644
--- a/pkg/reconciler/revision/resources/queue.go
+++ b/pkg/reconciler/revision/resources/queue.go
@@ -350,6 +350,9 @@ func makeQueueContainer(rev *v1.Revision, loggingConfig *logging.Config, tracing
 		}, {
 			Name:  "SERVING_ENABLE_PROBE_REQUEST_LOG",
 			Value: strconv.FormatBool(observabilityConfig.EnableProbeRequestLog),
+		}, {
+			Name:  "METRICS_COLLECTOR_ADDRESS",
+			Value: observabilityConfig.MetricsCollectorAddress,
 		}},
 	}, nil
 }
diff --git a/pkg/reconciler/route/config/store.go b/pkg/reconciler/route/config/store.go
index d0f965aa9..4e591b6d1 100644
--- a/pkg/reconciler/route/config/store.go
+++ b/pkg/reconciler/route/config/store.go
@@ -22,6 +22,7 @@ import (
 	network "knative.dev/networking/pkg"
 	"knative.dev/pkg/configmap"
 	"knative.dev/pkg/logging"
+	cfgmap "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/gc"
 )
 
@@ -29,15 +30,31 @@ type cfgKey struct{}
 
 // +k8s:deepcopy-gen=false
 type Config struct {
-	Domain  *Domain
-	GC      *gc.Config
-	Network *network.Config
+	Domain   *Domain
+	GC       *gc.Config
+	Network  *network.Config
+	Features *cfgmap.Features
 }
 
 func FromContext(ctx context.Context) *Config {
 	return ctx.Value(cfgKey{}).(*Config)
 }
 
+// FromContextOrDefaults is like FromContext, but when no Config is attached it
+// returns a Config populated with the defaults for each of the Config fields.
+func FromContextOrDefaults(ctx context.Context) *Config {
+	cfg := FromContext(ctx)
+	if cfg == nil {
+		cfg = &Config{}
+	}
+
+	if cfg.Features == nil {
+		cfg.Features, _ = cfgmap.NewFeaturesConfigFromMap(map[string]string{})
+	}
+
+	return cfg
+}
+
 func ToContext(ctx context.Context, c *Config) context.Context {
 	return context.WithValue(ctx, cfgKey{}, c)
 }
@@ -67,9 +84,10 @@ func NewStore(ctx context.Context, onAfterStore ...func(name string, value inter
 			"route",
 			logger,
 			configmap.Constructors{
-				DomainConfigName:   NewDomainFromConfigMap,
-				gc.ConfigName:      gc.NewConfigFromConfigMapFunc(ctx),
-				network.ConfigName: network.NewConfigFromConfigMap,
+				DomainConfigName:          NewDomainFromConfigMap,
+				gc.ConfigName:             gc.NewConfigFromConfigMapFunc(ctx),
+				network.ConfigName:        network.NewConfigFromConfigMap,
+				cfgmap.FeaturesConfigName: cfgmap.NewFeaturesConfigFromConfigMap,
 			},
 			onAfterStore...,
 		),
@@ -83,9 +101,16 @@ func (s *Store) ToContext(ctx context.Context) context.Context {
 }
 
 func (s *Store) Load() *Config {
-	return &Config{
-		Domain:  s.UntypedLoad(DomainConfigName).(*Domain).DeepCopy(),
-		GC:      s.UntypedLoad(gc.ConfigName).(*gc.Config).DeepCopy(),
-		Network: s.UntypedLoad(network.ConfigName).(*network.Config).DeepCopy(),
+	config := &Config{
+		Domain:   s.UntypedLoad(DomainConfigName).(*Domain).DeepCopy(),
+		GC:       s.UntypedLoad(gc.ConfigName).(*gc.Config).DeepCopy(),
+		Network:  s.UntypedLoad(network.ConfigName).(*network.Config).DeepCopy(),
+		Features: nil,
+	}
+
+	if featureConfig := s.UntypedLoad(cfgmap.FeaturesConfigName); featureConfig != nil {
+		config.Features = featureConfig.(*cfgmap.Features).DeepCopy()
 	}
+
+	return config
 }
diff --git a/pkg/reconciler/route/resources/ingress.go b/pkg/reconciler/route/resources/ingress.go
index 9f8d29081..dccee12ee 100644
--- a/pkg/reconciler/route/resources/ingress.go
+++ b/pkg/reconciler/route/resources/ingress.go
@@ -32,7 +32,7 @@ import (
 	ingress "knative.dev/networking/pkg/ingress"
 	"knative.dev/pkg/kmeta"
 	"knative.dev/serving/pkg/activator"
-	defaults "knative.dev/serving/pkg/apis/config"
+	apiConfig "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/apis/serving"
 	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
 	"knative.dev/serving/pkg/reconciler/route/config"
@@ -105,7 +105,7 @@ func MakeIngressSpec(
 	rules := make([]netv1alpha1.IngressRule, 0, len(names))
 	challengeHosts := getChallengeHosts(acmeChallenges)
 
-	networkConfig := config.FromContext(ctx).Network
+	featuresConfig := config.FromContextOrDefaults(ctx).Features
 
 	for _, name := range names {
 		visibilities := []netv1alpha1.IngressVisibility{netv1alpha1.IngressVisibilityClusterLocal}
@@ -119,7 +119,7 @@ func MakeIngressSpec(
 				return netv1alpha1.IngressSpec{}, err
 			}
 			rule := makeIngressRule(ctx, domains, r.Namespace, visibility, targets[name])
-			if networkConfig.TagHeaderBasedRouting {
+			if featuresConfig.TagHeaderBasedRouting == apiConfig.Enabled {
 				if rule.HTTP.Paths[0].AppendHeaders == nil {
 					rule.HTTP.Paths[0].AppendHeaders = make(map[string]string)
 				}
@@ -295,9 +295,9 @@ func ingressTimeout(ctx context.Context) time.Duration {
 	longTimeout := time.Hour * 48
 
 	// However, if the MaxRevisionTimeout is longer, we should still honor that.
-	if defaults.FromContext(ctx) != nil && defaults.FromContext(ctx).Defaults != nil {
+	if apiConfig.FromContext(ctx) != nil && apiConfig.FromContext(ctx).Defaults != nil {
 		maxRevisionTimeout := time.Duration(
-			defaults.FromContext(ctx).Defaults.MaxRevisionTimeoutSeconds) * time.Second
+			apiConfig.FromContext(ctx).Defaults.MaxRevisionTimeoutSeconds) * time.Second
 		if maxRevisionTimeout > longTimeout {
 			return maxRevisionTimeout
 		}
diff --git a/pkg/reconciler/route/resources/service.go b/pkg/reconciler/route/resources/service.go
index 4f1a9ad71..16880450d 100644
--- a/pkg/reconciler/route/resources/service.go
+++ b/pkg/reconciler/route/resources/service.go
@@ -23,6 +23,7 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/apimachinery/pkg/util/intstr"
 	"k8s.io/apimachinery/pkg/util/sets"
 
 	"knative.dev/networking/pkg/apis/networking"
@@ -71,6 +72,11 @@ func MakeK8sPlaceholderService(ctx context.Context, route *v1.Route, targetName
 		Type:            corev1.ServiceTypeExternalName,
 		ExternalName:    fullName,
 		SessionAffinity: corev1.ServiceAffinityNone,
+		Ports: []corev1.ServicePort{{
+			Name:       networking.ServicePortNameH2C,
+			Port:       int32(80),
+			TargetPort: intstr.FromInt(80),
+		}},
 	}
 
 	return service, nil
@@ -151,11 +157,21 @@ func makeServiceSpec(ingress *netv1alpha1.Ingress, isPrivate bool, clusterIP str
 			Type:            corev1.ServiceTypeExternalName,
 			ExternalName:    balancer.DomainInternal,
 			SessionAffinity: corev1.ServiceAffinityNone,
+			Ports: []corev1.ServicePort{{
+				Name:       networking.ServicePortNameH2C,
+				Port:       int32(80),
+				TargetPort: intstr.FromInt(80),
+			}},
 		}, nil
 	case len(balancer.Domain) != 0:
 		return &corev1.ServiceSpec{
 			Type:         corev1.ServiceTypeExternalName,
 			ExternalName: balancer.Domain,
+			Ports: []corev1.ServicePort{{
+				Name:       networking.ServicePortNameH2C,
+				Port:       int32(80),
+				TargetPort: intstr.FromInt(80),
+			}},
 		}, nil
 	case balancer.MeshOnly:
 		// The Ingress is loadbalanced through a Service mesh.
diff --git a/third_party/cert-manager-0.12.0/net-certmanager.yaml b/third_party/cert-manager-0.12.0/net-certmanager.yaml
index a9380b973..1f3f3f71a 100644
--- a/third_party/cert-manager-0.12.0/net-certmanager.yaml
+++ b/third_party/cert-manager-0.12.0/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: "v20200821-8a5392f"
+    serving.knative.dev/release: "v20200824-8a5392f"
     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: "v20200821-8a5392f"
+    serving.knative.dev/release: "v20200824-8a5392f"
 webhooks:
 - admissionReviewVersions:
   - v1beta1
@@ -86,7 +86,7 @@ metadata:
   name: net-certmanager-webhook-certs
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200821-8a5392f"
+    serving.knative.dev/release: "v20200824-8a5392f"
 
 ---
 # Copyright 2020 The Knative Authors
@@ -109,7 +109,7 @@ metadata:
   name: config-certmanager
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200821-8a5392f"
+    serving.knative.dev/release: "v20200824-8a5392f"
     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: "v20200821-8a5392f"
+    serving.knative.dev/release: "v20200824-8a5392f"
     networking.knative.dev/certificate-provider: cert-manager
 spec:
   selector:
@@ -168,7 +168,7 @@ spec:
         cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
       labels:
         app: networking-certmanager
-        serving.knative.dev/release: "v20200821-8a5392f"
+        serving.knative.dev/release: "v20200824-8a5392f"
     spec:
       serviceAccountName: controller
       containers:
@@ -208,7 +208,7 @@ kind: Service
 metadata:
   labels:
     app: networking-certmanager
-    serving.knative.dev/release: "v20200821-8a5392f"
+    serving.knative.dev/release: "v20200824-8a5392f"
     networking.knative.dev/certificate-provider: cert-manager
   name: networking-certmanager
   namespace: knative-serving
@@ -245,7 +245,7 @@ metadata:
   name: net-certmanager-webhook
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200821-8a5392f"
+    serving.knative.dev/release: "v20200824-8a5392f"
 spec:
   selector:
     matchLabels:
@@ -258,7 +258,7 @@ spec:
       labels:
         app: net-certmanager-webhook
         role: net-certmanager-webhook
-        serving.knative.dev/release: "v20200821-8a5392f"
+        serving.knative.dev/release: "v20200824-8a5392f"
     spec:
       serviceAccountName: controller
       containers:
@@ -319,7 +319,7 @@ metadata:
   namespace: knative-serving
   labels:
     role: net-certmanager-webhook
-    serving.knative.dev/release: "v20200821-8a5392f"
+    serving.knative.dev/release: "v20200824-8a5392f"
 spec:
   ports:
   - # Define metrics and profiling for them to be accessible within service meshes.
diff --git a/third_party/net-istio.yaml b/third_party/net-istio.yaml
index 51bce8ddc..dd063d1e6 100644
--- a/third_party/net-istio.yaml
+++ b/third_party/net-istio.yaml
@@ -18,7 +18,7 @@ metadata:
   # These are the permissions needed by the Istio Ingress implementation.
   name: knative-serving-istio
   labels:
-    serving.knative.dev/release: "v20200817-f64ed34"
+    serving.knative.dev/release: "v20200824-104ee54"
     serving.knative.dev/controller: "true"
     networking.knative.dev/ingress-provider: istio
 rules:
@@ -48,7 +48,7 @@ metadata:
   name: knative-ingress-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200817-f64ed34"
+    serving.knative.dev/release: "v20200824-104ee54"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -85,7 +85,7 @@ metadata:
   name: cluster-local-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200817-f64ed34"
+    serving.knative.dev/release: "v20200824-104ee54"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -98,6 +98,33 @@ spec:
     hosts:
     - "*"
 
+---
+# Allows the Webhooks to be reached by kube-api with or without
+# sidecar injection and with mTLS PERMISSIVE and STRICT. 
+apiVersion: "security.istio.io/v1beta1"
+kind: "PeerAuthentication"
+metadata:
+  name: "webhook"
+  namespace: "knative-serving"
+spec:
+  selector:
+    matchLabels:
+      app: webhook
+  mtls:
+    mode: PERMISSIVE
+---
+apiVersion: "security.istio.io/v1beta1"
+kind: "PeerAuthentication"
+metadata:
+  name: "istio-webhook"
+  namespace: "knative-serving"
+spec:
+  selector:
+    matchLabels:
+      app: istio-webhook
+  mtls:
+    mode: PERMISSIVE
+
 ---
 # Copyright 2020 The Knative Authors
 #
@@ -118,7 +145,7 @@ kind: MutatingWebhookConfiguration
 metadata:
   name: webhook.istio.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20200817-f64ed34"
+    serving.knative.dev/release: "v20200824-104ee54"
     networking.knative.dev/ingress-provider: istio
 webhooks:
 - admissionReviewVersions:
@@ -154,7 +181,7 @@ kind: ValidatingWebhookConfiguration
 metadata:
   name: config.webhook.istio.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20200817-f64ed34"
+    serving.knative.dev/release: "v20200824-104ee54"
     networking.knative.dev/ingress-provider: istio
 webhooks:
 - admissionReviewVersions:
@@ -192,7 +219,7 @@ metadata:
   name: istio-webhook-certs
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200817-f64ed34"
+    serving.knative.dev/release: "v20200824-104ee54"
     networking.knative.dev/ingress-provider: istio
 
 ---
@@ -216,7 +243,7 @@ metadata:
   name: config-istio
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200817-f64ed34"
+    serving.knative.dev/release: "v20200824-104ee54"
     networking.knative.dev/ingress-provider: istio
 data:
   _example: |
@@ -286,7 +313,7 @@ metadata:
   name: networking-istio
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200817-f64ed34"
+    serving.knative.dev/release: "v20200824-104ee54"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -302,14 +329,14 @@ spec:
         sidecar.istio.io/inject: "false"
       labels:
         app: networking-istio
-        serving.knative.dev/release: "v20200817-f64ed34"
+        serving.knative.dev/release: "v20200824-104ee54"
     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:52fe3a011e2247896f5d8381f1a1f293616fc880a4a93391b070580dff19d373
+        image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/controller@sha256:8484dc62e6d93e2e0a741d9618ddc29ac0076b9266a803166d51795c43ca92a1
         resources:
           requests:
             cpu: 30m
@@ -361,7 +388,7 @@ metadata:
   name: istio-webhook
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200817-f64ed34"
+    serving.knative.dev/release: "v20200824-104ee54"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -375,14 +402,14 @@ spec:
       labels:
         app: istio-webhook
         role: istio-webhook
-        serving.knative.dev/release: "v20200817-f64ed34"
+        serving.knative.dev/release: "v20200824-104ee54"
     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:ea809c1a2fa4c6e3016d031e4579f99770fae0f068b71eee4dc7b18c2b82f5dc
+        image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/webhook@sha256:16fa32e3fb1e7057914ca66ce4d35e6553f10137c1949c5c0a4ef817665198f4
         resources:
           requests:
             cpu: 20m
@@ -436,7 +463,7 @@ metadata:
   namespace: knative-serving
   labels:
     role: istio-webhook
-    serving.knative.dev/release: "v20200817-f64ed34"
+    serving.knative.dev/release: "v20200824-104ee54"
     networking.knative.dev/ingress-provider: istio
 spec:
   ports:
diff --git a/vendor/knative.dev/networking/pkg/apis/networking/register.go b/vendor/knative.dev/networking/pkg/apis/networking/register.go
index 55a5fe66a..f2e90d76a 100644
--- a/vendor/knative.dev/networking/pkg/apis/networking/register.go
+++ b/vendor/knative.dev/networking/pkg/apis/networking/register.go
@@ -84,11 +84,6 @@ const (
 	// WildcardCertDomainLabelKey is the label key attached to a certificate to indicate the
 	// domain for which it was issued.
 	WildcardCertDomainLabelKey = "networking.knative.dev/wildcardDomain"
-
-	// KnativeIngressGateway is the name of the ingress gateway
-	KnativeIngressGateway = "knative-ingress-gateway"
-	// ClusterLocalGateway is the name of the local gateway
-	ClusterLocalGateway = "cluster-local-gateway"
 )
 
 // ServiceType is the enumeration type for the Kubernetes services
diff --git a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_types.go b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_types.go
index da3f5a54b..586820cc6 100644
--- a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_types.go
+++ b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_types.go
@@ -212,13 +212,10 @@ type HTTPIngressPath struct {
 	// +optional
 	Path string `json:"path,omitempty"`
 
-	// RewriteHost rewrites the incoming request's host header. The request will
-	// then be re-evaluated based on the new host header.
+	// RewriteHost rewrites the incoming request's host header.
 	//
 	// This field is currently experimental and not supported by all Ingress
 	// implementations.
-	//
-	// If RewriteHost is specified, Splits must not be.
 	RewriteHost string `json:"rewriteHost,omitempty"`
 
 	// Headers defines header matching rules which is a map from a header name
diff --git a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_validation.go b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_validation.go
index 369995494..ecdefa398 100644
--- a/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_validation.go
+++ b/vendor/knative.dev/networking/pkg/apis/networking/v1alpha1/ingress_validation.go
@@ -87,12 +87,9 @@ func (h HTTPIngressPath) Validate(ctx context.Context) *apis.FieldError {
 		return apis.ErrMissingField(apis.CurrentField)
 	}
 	var all *apis.FieldError
-	switch {
-	case len(h.Splits) == 0 && h.RewriteHost == "":
-		all = all.Also(apis.ErrMissingOneOf("splits", "rewriteHost"))
-	case len(h.Splits) != 0 && h.RewriteHost != "":
-		all = all.Also(apis.ErrMultipleOneOf("splits", "rewriteHost"))
-	case len(h.Splits) != 0:
+	if len(h.Splits) == 0 {
+		all = all.Also(apis.ErrMissingField("splits"))
+	} else {
 		totalPct := 0
 		for idx, split := range h.Splits {
 			if err := split.Validate(ctx); err != nil {
diff --git a/vendor/knative.dev/networking/pkg/network.go b/vendor/knative.dev/networking/pkg/network.go
index 2f21bfa6d..19b922208 100644
--- a/vendor/knative.dev/networking/pkg/network.go
+++ b/vendor/knative.dev/networking/pkg/network.go
@@ -18,7 +18,6 @@ package pkg
 
 import (
 	"bytes"
-	"context"
 	"errors"
 	"fmt"
 	"io/ioutil"
@@ -31,7 +30,6 @@ import (
 	lru "github.com/hashicorp/golang-lru"
 	corev1 "k8s.io/api/core/v1"
 	cm "knative.dev/pkg/configmap"
-	"knative.dev/pkg/logging"
 )
 
 const (
@@ -67,12 +65,6 @@ const (
 	// customizations for networking features.
 	ConfigName = "config-network"
 
-	// IstioOutboundIPRangesKey is the name of the configuration entry
-	// that specifies Istio outbound ip ranges.
-	//
-	// DEPRECATED: This will be completely removed in the future release.
-	IstioOutboundIPRangesKey = "istio.sidecar.includeOutboundIPRanges"
-
 	// DeprecatedDefaultIngressClassKey  Please use DefaultIngressClassKey instead.
 	DeprecatedDefaultIngressClassKey = "clusteringress.class"
 
@@ -272,12 +264,6 @@ func NewConfigFromConfigMap(configMap *corev1.ConfigMap) (*Config, error) {
 // NewConfigFromMap creates a Config from the supplied data.
 func NewConfigFromMap(data map[string]string) (*Config, error) {
 	nc := defaultConfig()
-	if _, ok := data[IstioOutboundIPRangesKey]; ok {
-		// TODO(0.15): Until the next version is released, the validation check is
-		// enabled to notify users who configure this value.
-		logger := logging.FromContext(context.Background()).Named("config-network")
-		logger.Warnf("%q is deprecated as outbound network access is enabled by default now. Remove it from config-network", IstioOutboundIPRangesKey)
-	}
 
 	if err := cm.Parse(data,
 		cm.AsString(DeprecatedDefaultIngressClassKey, &nc.DefaultIngressClass),
diff --git a/vendor/knative.dev/pkg/controller/controller.go b/vendor/knative.dev/pkg/controller/controller.go
index 895b05d01..300f76e82 100644
--- a/vendor/knative.dev/pkg/controller/controller.go
+++ b/vendor/knative.dev/pkg/controller/controller.go
@@ -216,10 +216,13 @@ type ControllerOptions struct {
 
 // NewImpl instantiates an instance of our controller that will feed work to the
 // provided Reconciler as it is enqueued.
+// Deprecated: use NewImplFull.
 func NewImpl(r Reconciler, logger *zap.SugaredLogger, workQueueName string) *Impl {
 	return NewImplFull(r, ControllerOptions{WorkQueueName: workQueueName, Logger: logger})
 }
 
+// NewImplWithStats creates a controller.Impl with stats reporter.
+// Deprecated: use NewImplFull.
 func NewImplWithStats(r Reconciler, logger *zap.SugaredLogger, workQueueName string, reporter StatsReporter) *Impl {
 	return NewImplFull(r, ControllerOptions{WorkQueueName: workQueueName, Logger: logger, Reporter: reporter})
 }
@@ -416,15 +419,14 @@ func (c *Impl) EnqueueKeyAfter(key types.NamespacedName, delay time.Duration) {
 // internal work queue and waits for workers to finish processing their current
 // work items.
 func (c *Impl) RunContext(ctx context.Context, threadiness int) error {
-	logger := c.logger
-	defer runtime.HandleCrash()
 	sg := sync.WaitGroup{}
-	defer sg.Wait()
 	defer func() {
 		c.workQueue.ShutDown()
 		for c.workQueue.Len() > 0 {
 			time.Sleep(time.Millisecond * 100)
 		}
+		sg.Wait()
+		runtime.HandleCrash()
 	}()
 
 	if la, ok := c.Reconciler.(reconciler.LeaderAware); ok {
@@ -441,7 +443,7 @@ func (c *Impl) RunContext(ctx context.Context, threadiness int) error {
 	}
 
 	// Launch workers to process resources that get enqueued to our workqueue.
-	logger.Info("Starting controller and workers")
+	c.logger.Info("Starting controller and workers")
 	for i := 0; i < threadiness; i++ {
 		sg.Add(1)
 		go func() {
@@ -451,9 +453,9 @@ func (c *Impl) RunContext(ctx context.Context, threadiness int) error {
 		}()
 	}
 
-	logger.Info("Started workers")
+	c.logger.Info("Started workers")
 	<-ctx.Done()
-	logger.Info("Shutting down workers")
+	c.logger.Info("Shutting down workers")
 
 	return nil
 }
@@ -485,13 +487,6 @@ func (c *Impl) processNextWorkItem() bool {
 	// Send the metrics for the current queue depth
 	c.statsReporter.ReportQueueDepth(int64(c.workQueue.Len()))
 
-	// We call Done here so the workqueue knows we have finished
-	// processing this item. We also must remember to call Forget if
-	// reconcile succeeds. If a transient error occurs, we do not call
-	// Forget and put the item back to the queue with an increased
-	// delay.
-	defer c.workQueue.Done(key)
-
 	var err error
 	defer func() {
 		status := trueString
@@ -499,6 +494,13 @@ func (c *Impl) processNextWorkItem() bool {
 			status = falseString
 		}
 		c.statsReporter.ReportReconcile(time.Since(startTime), status)
+
+		// We call Done here so the workqueue knows we have finished
+		// processing this item. We also must remember to call Forget if
+		// reconcile succeeds. If a transient error occurs, we do not call
+		// Forget and put the item back to the queue with an increased
+		// delay.
+		c.workQueue.Done(key)
 	}()
 
 	// Embed the key into the logger and attach that to the context we pass
@@ -544,8 +546,8 @@ func (c *Impl) GlobalResync(si cache.SharedInformer) {
 	c.FilteredGlobalResync(alwaysTrue, si)
 }
 
-// FilteredGlobalResync enqueues (with a delay) all objects from the
-// SharedInformer that pass the filter function
+// FilteredGlobalResync enqueues all objects from the
+// SharedInformer that pass the filter function in to the slow queue.
 func (c *Impl) FilteredGlobalResync(f func(interface{}) bool, si cache.SharedInformer) {
 	if c.workQueue.ShuttingDown() {
 		return
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 553faac2f..7ad28ac97 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1054,7 +1054,7 @@ k8s.io/utils/buffer
 k8s.io/utils/integer
 k8s.io/utils/pointer
 k8s.io/utils/trace
-# knative.dev/caching v0.0.0-20200820161315-4cd021a72a18
+# knative.dev/caching v0.0.0-20200821175847-c9d611a83dba
 ## explicit
 knative.dev/caching/config
 knative.dev/caching/pkg/apis/caching
@@ -1075,7 +1075,7 @@ 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/networking v0.0.0-20200820164014-acfd663203ae
+# knative.dev/networking v0.0.0-20200823191547-a36404ec4654
 ## explicit
 knative.dev/networking/pkg
 knative.dev/networking/pkg/apis/networking
@@ -1103,7 +1103,7 @@ knative.dev/networking/pkg/client/injection/reconciler/networking/v1alpha1/serve
 knative.dev/networking/pkg/client/istio/listers/networking/v1alpha3
 knative.dev/networking/pkg/client/listers/networking/v1alpha1
 knative.dev/networking/pkg/ingress
-# knative.dev/pkg v0.0.0-20200820181214-50386ad39634
+# knative.dev/pkg v0.0.0-20200822174146-f0f096d81292
 ## explicit
 knative.dev/pkg/apiextensions/storageversion
 knative.dev/pkg/apiextensions/storageversion/cmd/migrate
@@ -1227,7 +1227,7 @@ knative.dev/pkg/webhook/resourcesemantics/conversion
 knative.dev/pkg/webhook/resourcesemantics/defaulting
 knative.dev/pkg/webhook/resourcesemantics/validation
 knative.dev/pkg/websocket
-# knative.dev/test-infra v0.0.0-20200819210814-f578ab25945b
+# knative.dev/test-infra v0.0.0-20200820231346-543fe3e80c03
 ## explicit
 knative.dev/test-infra/scripts
 # sigs.k8s.io/yaml v1.2.0


Test patch:
diff --git a/pkg/activator/handler/concurrency_reporter_test.go b/pkg/activator/handler/concurrency_reporter_test.go
index 0076b6166..c3f4d18d8 100644
--- a/pkg/activator/handler/concurrency_reporter_test.go
+++ b/pkg/activator/handler/concurrency_reporter_test.go
@@ -471,12 +471,14 @@ func TestMetricsReported(t *testing.T) {
 		close(reportCh)
 	}()
 
-	cr.handleEvent(network.ReqEvent{Key: rev1, Type: network.ReqIn})
-	cr.handleEvent(network.ReqEvent{Key: rev1, Type: network.ReqIn})
-	cr.handleEvent(network.ReqEvent{Key: rev1, Type: network.ReqIn})
-	cr.handleEvent(network.ReqEvent{Key: rev1, Type: network.ReqIn})
+	now := time.Now().Truncate(time.Second)
+	cr.handleEvent(network.ReqEvent{Key: rev1, Type: network.ReqIn, Time: now})
+	cr.handleEvent(network.ReqEvent{Key: rev1, Type: network.ReqIn, Time: now})
+	cr.handleEvent(network.ReqEvent{Key: rev1, Type: network.ReqIn, Time: now})
+	cr.handleEvent(network.ReqEvent{Key: rev1, Type: network.ReqIn, Time: now})
 
-	reportCh <- time.Now()
+	now = now.Add(time.Second)
+	reportCh <- now
 	<-cr.statCh
 	<-cr.statCh
 
@@ -496,7 +498,8 @@ func TestMetricsReported(t *testing.T) {
 
 	wantMetric := metricstest.FloatMetric("request_concurrency", 3, wantTags).WithResource(wantResource)
 	metricstest.AssertMetric(t, wantMetric)
-	reportCh <- time.Now()
+	now = now.Add(time.Second)
+	reportCh <- now
 	<-cr.statCh
 	*wantMetric.Values[0].Float64++
 	metricstest.AssertMetric(t, wantMetric)
diff --git a/pkg/apis/config/features_test.go b/pkg/apis/config/features_test.go
index 6d7ffca9c..f43e059d5 100644
--- a/pkg/apis/config/features_test.go
+++ b/pkg/apis/config/features_test.go
@@ -66,6 +66,7 @@ func TestFeaturesConfiguration(t *testing.T) {
 			PodSpecSecurityContext: Enabled,
 			PodSpecTolerations:     Enabled,
 			ResponsiveRevisionGC:   Enabled,
+			TagHeaderBasedRouting:  Enabled,
 		}),
 		data: map[string]string{
 			"multi-container":                    "Enabled",
@@ -75,6 +76,7 @@ func TestFeaturesConfiguration(t *testing.T) {
 			"kubernetes.podspec-securitycontext": "Enabled",
 			"kubernetes.podspec-tolerations":     "Enabled",
 			"responsive-revision-gc":             "Enabled",
+			"tag-header-based-routing":           "Enabled",
 		},
 	}, {
 		name:    "multi-container Allowed",
@@ -247,6 +249,24 @@ func TestFeaturesConfiguration(t *testing.T) {
 		data: map[string]string{
 			"kubernetes.podspec-securitycontext": "Disabled",
 		},
+	}, {
+		name:    "tag-header-based-routing Allowed",
+		wantErr: false,
+		wantFeatures: defaultWith(&Features{
+			TagHeaderBasedRouting: Allowed,
+		}),
+		data: map[string]string{
+			"tag-header-based-routing": "Allowed",
+		},
+	}, {
+		name:    "tag-header-based-routing Enabled",
+		wantErr: false,
+		wantFeatures: defaultWith(&Features{
+			TagHeaderBasedRouting: Enabled,
+		}),
+		data: map[string]string{
+			"tag-header-based-routing": "Enabled",
+		},
 	}}
 
 	for _, tt := range configTests {
diff --git a/pkg/reconciler/metric/metric_test.go b/pkg/reconciler/metric/metric_test.go
index a44dc059d..a49dab9e4 100644
--- a/pkg/reconciler/metric/metric_test.go
+++ b/pkg/reconciler/metric/metric_test.go
@@ -185,12 +185,12 @@ func TestReconcile(t *testing.T) {
 func TestReconcileWithCollector(t *testing.T) {
 	ctx, cancel, informers := SetupFakeContextWithCancel(t)
 
-	collector := &testCollector{}
-	collector.createOrUpdateCalls = make(chan struct{}, 1)
-	collector.deleteCalls = make(chan struct{}, 1)
+	collector := &testCollector{
+		createOrUpdateCalls: make(chan struct{}, 1),
+		deleteCalls:         make(chan struct{}, 1),
+	}
 
 	ctl := NewController(ctx, configmap.NewStaticWatcher(), collector)
-
 	wf, err := controller.RunInformers(ctx.Done(), informers...)
 	if err != nil {
 		cancel()
@@ -199,17 +199,18 @@ func TestReconcileWithCollector(t *testing.T) {
 
 	barrier := make(chan struct{})
 	var eg errgroup.Group
-	eg.Go(func() error {
-		close(barrier)
-		return ctl.Run(1, ctx.Done())
-	})
-	defer func() {
+	t.Cleanup(func() {
 		cancel()
 		wf()
 		eg.Wait()
-	}()
+	})
+
+	eg.Go(func() error {
+		close(barrier)
+		return ctl.RunContext(ctx, 1)
+	})
 
-	m := metric("new", "metric")
+	m := metric("a-new", "test-metric")
 	scs := servingclient.Get(ctx)
 
 	// Ensure the controller is running.
@@ -217,6 +218,7 @@ func TestReconcileWithCollector(t *testing.T) {
 	scs.AutoscalingV1alpha1().Metrics(m.Namespace).Create(m)
 	select {
 	case <-collector.createOrUpdateCalls:
+		t.Log("Create or Update was invoked")
 	case <-time.After(2 * time.Second):
 		t.Fatal("CreateOrUpdate() called 0 times, want non-zero times")
 	}
@@ -224,6 +226,7 @@ func TestReconcileWithCollector(t *testing.T) {
 	scs.AutoscalingV1alpha1().Metrics(m.Namespace).Delete(m.Name, &metav1.DeleteOptions{})
 	select {
 	case <-collector.deleteCalls:
+		t.Log("Delete was invoked")
 	case <-time.After(2 * time.Second):
 		t.Error("Delete() called 0 times, want non-zero times")
 	}
@@ -266,11 +269,10 @@ func metric(namespace, name string, opts ...metricOption) *av1alpha1.Metric {
 }
 
 type testCollector struct {
+	metrics.Collector
 	createOrUpdateCalls chan struct{}
 	createOrUpdateError error
 
-	recordCalls chan struct{}
-
 	deleteCalls chan struct{}
 	deleteError error
 }
@@ -282,12 +284,6 @@ func (c *testCollector) CreateOrUpdate(metric *av1alpha1.Metric) error {
 	return c.createOrUpdateError
 }
 
-func (c *testCollector) Record(key types.NamespacedName, now time.Time, stat metrics.Stat) {
-	if c.recordCalls != nil {
-		c.recordCalls <- struct{}{}
-	}
-}
-
 func (c *testCollector) Delete(namespace, name string) error {
 	if c.deleteCalls != nil {
 		c.deleteCalls <- struct{}{}
diff --git a/pkg/reconciler/revision/resources/deploy_test.go b/pkg/reconciler/revision/resources/deploy_test.go
index e64cb9d02..ed6671b10 100644
--- a/pkg/reconciler/revision/resources/deploy_test.go
+++ b/pkg/reconciler/revision/resources/deploy_test.go
@@ -175,6 +175,9 @@ var (
 		}, {
 			Name:  "SERVING_ENABLE_PROBE_REQUEST_LOG",
 			Value: "false",
+		}, {
+			Name:  "METRICS_COLLECTOR_ADDRESS",
+			Value: "",
 		}},
 	}
 
@@ -578,6 +581,32 @@ func TestMakePodSpec(t *testing.T) {
 					withEnvVar("CONTAINER_CONCURRENCY", "1"),
 				),
 			}),
+	}, {
+		name: "metrics collector address",
+		rev: revision("bar", "foo",
+			withContainers([]corev1.Container{{
+				Name:           servingContainerName,
+				Image:          "busybox",
+				ReadinessProbe: withTCPReadinessProbe(v1.DefaultUserPort),
+			}}),
+			WithContainerStatuses([]v1.ContainerStatuses{{
+				ImageDigest: "busybox@sha256:deadbeef",
+			}}),
+		),
+		oc: metrics.ObservabilityConfig{
+			RequestMetricsBackend:   "opencensus",
+			MetricsCollectorAddress: "otel:55678",
+		},
+		want: podSpec(
+			[]corev1.Container{
+				servingContainer(func(container *corev1.Container) {
+					container.Image = "busybox@sha256:deadbeef"
+				}),
+				queueContainer(
+					withEnvVar("METRICS_COLLECTOR_ADDRESS", "otel:55678"),
+					withEnvVar("SERVING_REQUEST_METRICS_BACKEND", "opencensus"),
+				),
+			}),
 	}, {
 		name: "concurrency=121 no owner digest resolved",
 		rev: revision("bar", "foo",
diff --git a/pkg/reconciler/revision/resources/queue_test.go b/pkg/reconciler/revision/resources/queue_test.go
index 7c1c14746..bfd6f43ab 100644
--- a/pkg/reconciler/revision/resources/queue_test.go
+++ b/pkg/reconciler/revision/resources/queue_test.go
@@ -279,6 +279,20 @@ func TestMakeQueueContainer(t *testing.T) {
 				corev1.ResourceMemory: resource.MustParse("789m"),
 			}
 		}),
+	}, {
+		name: "collector address as env var",
+		rev: revision("bar", "foo",
+			withContainers(containers)),
+		oc: metrics.ObservabilityConfig{
+			RequestMetricsBackend:   "opencensus",
+			MetricsCollectorAddress: "otel:55678",
+		},
+		want: queueContainer(func(c *corev1.Container) {
+			c.Env = env(map[string]string{
+				"SERVING_REQUEST_METRICS_BACKEND": "opencensus",
+				"METRICS_COLLECTOR_ADDRESS":       "otel:55678",
+			})
+		}),
 	}}
 
 	for _, test := range tests {
@@ -746,6 +760,7 @@ var defaultEnv = map[string]string{
 	"CONTAINER_CONCURRENCY":                 "0",
 	"ENABLE_PROFILING":                      "false",
 	"METRICS_DOMAIN":                        metrics.Domain(),
+	"METRICS_COLLECTOR_ADDRESS":             "",
 	"QUEUE_SERVING_PORT":                    "8012",
 	"REVISION_TIMEOUT_SECONDS":              "45",
 	"SERVING_CONFIGURATION":                 "",
diff --git a/pkg/reconciler/route/config/store_test.go b/pkg/reconciler/route/config/store_test.go
index c3796a387..884c4abd7 100644
--- a/pkg/reconciler/route/config/store_test.go
+++ b/pkg/reconciler/route/config/store_test.go
@@ -24,6 +24,7 @@ import (
 	"github.com/google/go-cmp/cmp"
 	network "knative.dev/networking/pkg"
 	logtesting "knative.dev/pkg/logging/testing"
+	cfgmap "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/gc"
 
 	. "knative.dev/pkg/configmap/testing"
@@ -36,10 +37,12 @@ func TestStoreLoadWithContext(t *testing.T) {
 	domainConfig := ConfigMapFromTestFile(t, DomainConfigName)
 	gcConfig := ConfigMapFromTestFile(t, gc.ConfigName)
 	networkConfig := ConfigMapFromTestFile(t, network.ConfigName)
+	featureConfig := ConfigMapFromTestFile(t, cfgmap.FeaturesConfigName)
 
 	store.OnConfigChanged(domainConfig)
 	store.OnConfigChanged(gcConfig)
 	store.OnConfigChanged(networkConfig)
+	store.OnConfigChanged(featureConfig)
 
 	config := FromContext(store.ToContext(context.Background()))
 
@@ -74,11 +77,28 @@ func TestStoreLoadWithContext(t *testing.T) {
 	})
 }
 
+func TestStoreLoadWithContextOrDefaults(t *testing.T) {
+	store := NewStore(logtesting.TestContextWithLogger(t))
+	store.OnConfigChanged(ConfigMapFromTestFile(t, DomainConfigName))
+	store.OnConfigChanged(ConfigMapFromTestFile(t, network.ConfigName))
+	store.OnConfigChanged(ConfigMapFromTestFile(t, gc.ConfigName))
+
+	config := FromContextOrDefaults(store.ToContext(context.Background()))
+
+	t.Run("domain", func(t *testing.T) {
+		expected, _ := cfgmap.NewFeaturesConfigFromMap(map[string]string{})
+		if diff := cmp.Diff(expected, config.Features); diff != "" {
+			t.Errorf("Unexpected controller config (-want, +got): %v", diff)
+		}
+	})
+}
+
 func TestStoreImmutableConfig(t *testing.T) {
 	store := NewStore(logtesting.TestContextWithLogger(t))
 	store.OnConfigChanged(ConfigMapFromTestFile(t, DomainConfigName))
 	store.OnConfigChanged(ConfigMapFromTestFile(t, network.ConfigName))
 	store.OnConfigChanged(ConfigMapFromTestFile(t, gc.ConfigName))
+	store.OnConfigChanged(ConfigMapFromTestFile(t, cfgmap.FeaturesConfigName))
 
 	config := store.Load()
 
diff --git a/pkg/reconciler/route/config/testdata/config-features.yaml b/pkg/reconciler/route/config/testdata/config-features.yaml
new file mode 120000
index 000000000..bc15e5934
--- /dev/null
+++ b/pkg/reconciler/route/config/testdata/config-features.yaml
@@ -0,0 +1,1 @@
+../../../../../config/core/configmaps/features.yaml
\ No newline at end of file
diff --git a/pkg/reconciler/route/queueing_test.go b/pkg/reconciler/route/queueing_test.go
index 9c71edace..459fd582e 100644
--- a/pkg/reconciler/route/queueing_test.go
+++ b/pkg/reconciler/route/queueing_test.go
@@ -33,6 +33,7 @@ import (
 	"knative.dev/pkg/controller"
 	"knative.dev/pkg/ptr"
 	"knative.dev/pkg/system"
+	cfgmap "knative.dev/serving/pkg/apis/config"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	fakeservingclient "knative.dev/serving/pkg/client/injection/client/fake"
 	fakerevisioninformer "knative.dev/serving/pkg/client/injection/informers/serving/v1/revision/fake"
@@ -78,6 +79,11 @@ func TestNewRouteCallsSyncHandler(t *testing.T) {
 			Namespace: system.Namespace(),
 		},
 		Data: map[string]string{},
+	}, &corev1.ConfigMap{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      cfgmap.FeaturesConfigName,
+			Namespace: system.Namespace(),
+		},
 	})
 
 	servingClient := fakeservingclient.Get(ctx)
diff --git a/pkg/reconciler/route/resources/ingress_test.go b/pkg/reconciler/route/resources/ingress_test.go
index 998dc7c4a..ab57787b6 100644
--- a/pkg/reconciler/route/resources/ingress_test.go
+++ b/pkg/reconciler/route/resources/ingress_test.go
@@ -484,7 +484,7 @@ func TestMakeIngressSpec_CorrectRulesWithTagBasedRouting(t *testing.T) {
 	}}
 
 	ctx := testContext()
-	config.FromContext(ctx).Network.TagHeaderBasedRouting = true
+	config.FromContext(ctx).Features.TagHeaderBasedRouting = apiConfig.Enabled
 
 	ci, err := MakeIngressSpec(ctx, r, nil, targets, nil /* visibility */)
 	if err != nil {
diff --git a/pkg/reconciler/route/resources/service_test.go b/pkg/reconciler/route/resources/service_test.go
index 0bd494be8..347ae83db 100644
--- a/pkg/reconciler/route/resources/service_test.go
+++ b/pkg/reconciler/route/resources/service_test.go
@@ -26,11 +26,14 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/apimachinery/pkg/util/intstr"
 	"k8s.io/apimachinery/pkg/util/sets"
 
 	network "knative.dev/networking/pkg"
+	"knative.dev/networking/pkg/apis/networking"
 	netv1alpha1 "knative.dev/networking/pkg/apis/networking/v1alpha1"
 	"knative.dev/pkg/kmeta"
+	apiConfig "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/apis/serving"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	"knative.dev/serving/pkg/gc"
@@ -139,6 +142,11 @@ func TestNewMakeK8SService(t *testing.T) {
 		expectedSpec: corev1.ServiceSpec{
 			Type:         corev1.ServiceTypeExternalName,
 			ExternalName: "domain.com",
+			Ports: []corev1.ServicePort{{
+				Name:       networking.ServicePortNameH2C,
+				Port:       int32(80),
+				TargetPort: intstr.FromInt(80),
+			}},
 		},
 	}, {
 		name:  "ingress-with-domaininternal",
@@ -161,6 +169,11 @@ func TestNewMakeK8SService(t *testing.T) {
 			Type:            corev1.ServiceTypeExternalName,
 			ExternalName:    "private-istio-ingressgateway.istio-system.svc.cluster.local",
 			SessionAffinity: corev1.ServiceAffinityNone,
+			Ports: []corev1.ServicePort{{
+				Name:       networking.ServicePortNameH2C,
+				Port:       int32(80),
+				TargetPort: intstr.FromInt(80),
+			}},
 		},
 	}, {
 		name:  "ingress-with-only-mesh",
@@ -262,6 +275,11 @@ func TestMakeK8sPlaceholderService(t *testing.T) {
 			Type:            corev1.ServiceTypeExternalName,
 			ExternalName:    "foo-test-route.test-ns.example.com",
 			SessionAffinity: corev1.ServiceAffinityNone,
+			Ports: []corev1.ServicePort{{
+				Name:       networking.ServicePortNameH2C,
+				Port:       int32(80),
+				TargetPort: intstr.FromInt(80),
+			}},
 		},
 		expectedLabels: map[string]string{
 			serving.RouteLabelKey: "test-route",
@@ -275,6 +293,11 @@ func TestMakeK8sPlaceholderService(t *testing.T) {
 			Type:            corev1.ServiceTypeExternalName,
 			ExternalName:    "foo-test-route.test-ns.example.com",
 			SessionAffinity: corev1.ServiceAffinityNone,
+			Ports: []corev1.ServicePort{{
+				Name:       networking.ServicePortNameH2C,
+				Port:       int32(80),
+				TargetPort: intstr.FromInt(80),
+			}},
 		},
 		expectedLabels: map[string]string{
 			serving.RouteLabelKey: "test-route",
@@ -291,6 +314,11 @@ func TestMakeK8sPlaceholderService(t *testing.T) {
 			Type:            corev1.ServiceTypeExternalName,
 			ExternalName:    "foo-test-route.test-ns.svc.cluster.local",
 			SessionAffinity: corev1.ServiceAffinityNone,
+			Ports: []corev1.ServicePort{{
+				Name:       networking.ServicePortNameH2C,
+				Port:       int32(80),
+				TargetPort: intstr.FromInt(80),
+			}},
 		},
 		expectedLabels: map[string]string{
 			serving.RouteLabelKey: "test-route",
@@ -354,6 +382,16 @@ func testConfig() *config.Config {
 		GC: &gc.Config{
 			StaleRevisionLastpinnedDebounce: 1 * time.Minute,
 		},
+		Features: &apiConfig.Features{
+			MultiContainer:        apiConfig.Disabled,
+			PodSpecAffinity:       apiConfig.Disabled,
+			PodSpecFieldRef:       apiConfig.Disabled,
+			PodSpecDryRun:         apiConfig.Enabled,
+			PodSpecNodeSelector:   apiConfig.Disabled,
+			PodSpecTolerations:    apiConfig.Disabled,
+			ResponsiveRevisionGC:  apiConfig.Disabled,
+			TagHeaderBasedRouting: apiConfig.Disabled,
+		},
 	}
 }
 
diff --git a/pkg/reconciler/route/route_test.go b/pkg/reconciler/route/route_test.go
index 1cd941ddd..2628d2a85 100644
--- a/pkg/reconciler/route/route_test.go
+++ b/pkg/reconciler/route/route_test.go
@@ -52,6 +52,7 @@ import (
 	"knative.dev/pkg/ptr"
 	"knative.dev/pkg/reconciler"
 	"knative.dev/pkg/system"
+	cfgmap "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/apis/serving"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	"knative.dev/serving/pkg/gc"
@@ -115,6 +116,11 @@ func newTestSetup(t *testing.T, opts ...reconcilerOption) (
 			Name:      gc.ConfigName,
 			Namespace: system.Namespace(),
 		},
+	}, {
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      cfgmap.FeaturesConfigName,
+			Namespace: system.Namespace(),
+		},
 	}} {
 		configMapWatcher.OnChange(cfg)
 	}
@@ -975,11 +981,11 @@ func TestCreateRouteWithNamedTargetsAndTagBasedRouting(t *testing.T) {
 
 	watcher.OnChange(&corev1.ConfigMap{
 		ObjectMeta: metav1.ObjectMeta{
-			Name:      network.ConfigName,
+			Name:      cfgmap.FeaturesConfigName,
 			Namespace: system.Namespace(),
 		},
 		Data: map[string]string{
-			network.TagHeaderBasedRoutingKey: "enabled",
+			"tag-header-based-routing": "enabled",
 		},
 	})
 	// A standalone revision
@@ -1015,7 +1021,6 @@ func TestCreateRouteWithNamedTargetsAndTagBasedRouting(t *testing.T) {
 	fakeservingclient.Get(ctx).ServingV1().Routes(testNamespace).Create(route)
 	// Since Reconcile looks in the lister, we need to add it to the informer
 	fakerouteinformer.Get(ctx).Informer().GetIndexer().Add(route)
-
 	ctl.Reconciler.Reconcile(context.Background(), KeyOrDie(route))
 
 	ci := getRouteIngressFromClient(ctx, t, route)
diff --git a/pkg/reconciler/route/table_test.go b/pkg/reconciler/route/table_test.go
index ad30331c5..048aa2dbc 100644
--- a/pkg/reconciler/route/table_test.go
+++ b/pkg/reconciler/route/table_test.go
@@ -507,7 +507,8 @@ func TestReconcile(t *testing.T) {
 					},
 				},
 			),
-			simpleK8sService(Route("default", "steady-state", WithConfigTarget("config"))),
+			simpleK8sService(Route("default", "steady-state", WithConfigTarget("config")),
+				WithExternalName("private-istio-ingressgateway.istio-system.svc.cluster.local")),
 		},
 		Key: "default/steady-state",
 	}, {
@@ -2800,6 +2801,16 @@ func ReconcilerTestConfig(enableAutoTLS bool) *config.Config {
 		GC: &gc.Config{
 			StaleRevisionLastpinnedDebounce: 1 * time.Minute,
 		},
+		Features: &cfgmap.Features{
+			MultiContainer:        cfgmap.Disabled,
+			PodSpecAffinity:       cfgmap.Disabled,
+			PodSpecFieldRef:       cfgmap.Disabled,
+			PodSpecDryRun:         cfgmap.Enabled,
+			PodSpecNodeSelector:   cfgmap.Disabled,
+			PodSpecTolerations:    cfgmap.Disabled,
+			ResponsiveRevisionGC:  cfgmap.Disabled,
+			TagHeaderBasedRouting: cfgmap.Disabled,
+		},
 	}
 }
 
diff --git a/pkg/testing/functional.go b/pkg/testing/functional.go
index 2acdc28b8..958fa49d5 100644
--- a/pkg/testing/functional.go
+++ b/pkg/testing/functional.go
@@ -22,6 +22,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/intstr"
 
 	"knative.dev/networking/pkg/apis/networking"
 	netv1alpha1 "knative.dev/networking/pkg/apis/networking/v1alpha1"
@@ -264,6 +265,11 @@ func WithClusterIP(ip string) K8sServiceOption {
 func WithExternalName(name string) K8sServiceOption {
 	return func(svc *corev1.Service) {
 		svc.Spec.ExternalName = name
+		svc.Spec.Ports = []corev1.ServicePort{{
+			Name:       networking.ServicePortNameH2C,
+			Port:       int32(80),
+			TargetPort: intstr.FromInt(80),
+		}}
 	}
 }
 
diff --git a/test/e2e-tests.sh b/test/e2e-tests.sh
index 7a1aec890..97317f1f3 100755
--- a/test/e2e-tests.sh
+++ b/test/e2e-tests.sh
@@ -102,9 +102,9 @@ if (( HTTPS )); then
   toggle_feature autoTLS Disabled config-network
 fi
 
-toggle_feature tagHeaderBasedRouting Enabled config-network
+toggle_feature tag-header-based-routing Enabled
 go_test_e2e -timeout=2m ./test/e2e/tagheader || failed=1
-toggle_feature tagHeaderBasedRouting Disabled config-network
+toggle_feature tag-header-based-routing Disabled
 
 toggle_feature multi-container Enabled
 go_test_e2e -timeout=2m ./test/e2e/multicontainer || failed=1
diff --git a/test/e2e/istio/probing_test.go b/test/e2e/istio/probing_test.go
index f9875456c..f616f4f54 100644
--- a/test/e2e/istio/probing_test.go
+++ b/test/e2e/istio/probing_test.go
@@ -44,7 +44,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	istiov1alpha3 "istio.io/api/networking/v1alpha3"
-	"knative.dev/networking/pkg/apis/networking"
 	"knative.dev/pkg/system"
 	pkgTest "knative.dev/pkg/test"
 	"knative.dev/pkg/test/spoof"
@@ -53,25 +52,29 @@ import (
 	v1test "knative.dev/serving/test/v1"
 )
 
+// TODO(nak3,#9002): once those tests are moved to net-istio
+// use the generic constant there.
+const knativeIngressGateway = "knative-ingress-gateway"
+
 func TestIstioProbing(t *testing.T) {
 	clients := e2e.Setup(t)
 	namespace := system.Namespace()
 
 	// Save the current Gateway to restore it after the test
-	oldGateway, err := clients.IstioClient.NetworkingV1alpha3().Gateways(namespace).Get(networking.KnativeIngressGateway, metav1.GetOptions{})
+	oldGateway, err := clients.IstioClient.NetworkingV1alpha3().Gateways(namespace).Get(knativeIngressGateway, metav1.GetOptions{})
 	if err != nil {
-		t.Fatalf("Failed to get Gateway %s/%s", namespace, networking.KnativeIngressGateway)
+		t.Fatalf("Failed to get Gateway %s/%s", namespace, knativeIngressGateway)
 	}
 
 	// After the test ends, restore the old gateway
 	test.EnsureCleanup(t, func() {
-		curGateway, err := clients.IstioClient.NetworkingV1alpha3().Gateways(namespace).Get(networking.KnativeIngressGateway, metav1.GetOptions{})
+		curGateway, err := clients.IstioClient.NetworkingV1alpha3().Gateways(namespace).Get(knativeIngressGateway, metav1.GetOptions{})
 		if err != nil {
-			t.Fatalf("Failed to get Gateway %s/%s", namespace, networking.KnativeIngressGateway)
+			t.Fatalf("Failed to get Gateway %s/%s", namespace, knativeIngressGateway)
 		}
 		curGateway.Spec.Servers = oldGateway.Spec.Servers
 		if _, err := clients.IstioClient.NetworkingV1alpha3().Gateways(namespace).Update(curGateway); err != nil {
-			t.Fatalf("Failed to restore Gateway %s/%s: %v", namespace, networking.KnativeIngressGateway, err)
+			t.Fatalf("Failed to restore Gateway %s/%s: %v", namespace, knativeIngressGateway, err)
 		}
 	})
 
@@ -306,9 +309,9 @@ func hasHTTPS(servers []*istiov1alpha3.Server) bool {
 func setupGateway(t *testing.T, clients *test.Clients, names test.ResourceNames, domain string,
 	namespace string, servers []*istiov1alpha3.Server) {
 	// Get the current Gateway
-	curGateway, err := clients.IstioClient.NetworkingV1alpha3().Gateways(namespace).Get(networking.KnativeIngressGateway, metav1.GetOptions{})
+	curGateway, err := clients.IstioClient.NetworkingV1alpha3().Gateways(namespace).Get(knativeIngressGateway, metav1.GetOptions{})
 	if err != nil {
-		t.Fatalf("Failed to get Gateway %s/%s: %v", namespace, networking.KnativeIngressGateway, err)
+		t.Fatalf("Failed to get Gateway %s/%s: %v", namespace, knativeIngressGateway, err)
 	}
 
 	// Update its Spec
@@ -318,7 +321,7 @@ func setupGateway(t *testing.T, clients *test.Clients, names test.ResourceNames,
 	// Update the Gateway
 	gw, err := clients.IstioClient.NetworkingV1alpha3().Gateways(namespace).Update(newGateway)
 	if err != nil {
-		t.Fatalf("Failed to update Gateway %s/%s: %v", namespace, networking.KnativeIngressGateway, err)
+		t.Fatalf("Failed to update Gateway %s/%s: %v", namespace, knativeIngressGateway, err)
 	}
 
 	selector := labels.SelectorFromSet(gw.Spec.Selector).String()
diff --git a/vendor/knative.dev/test-infra/scripts/README.md b/vendor/knative.dev/test-infra/scripts/README.md
index 01361fd4a..6fc264849 100644
--- a/vendor/knative.dev/test-infra/scripts/README.md
+++ b/vendor/knative.dev/test-infra/scripts/README.md
@@ -113,12 +113,13 @@ This is a helper script for Knative E2E test scripts. To use it:
 1. [optional] Customize the test cluster. Set the following environment
    variables if the default values don't fit your needs:
 
-   - `E2E_GCP_PROJECT_ID`: GCP project ID for creating the clusters, defaults to none.
+   - `E2E_GCP_PROJECT_ID`: GCP project ID for creating the clusters, defaults to
+     none.
    - `E2E_GKE_CLUSTER_REGION`: Cluster region, defaults to `us-central1`.
-   - `E2E_GKE_CLUSTER_BACKUP_REGIONS`: Space-separated list of regions to retry test
-     cluster creation in case of stockout. Defaults to `us-west1 us-east1`.
-   - `E2E_GKE_CLUSTER_ZONE`: Cluster zone (e.g., `a`), defaults to none (i.e. use a
-     regional cluster).
+   - `E2E_GKE_CLUSTER_BACKUP_REGIONS`: Space-separated list of regions to retry
+     test cluster creation in case of stockout. Defaults to `us-west1 us-east1`.
+   - `E2E_GKE_CLUSTER_ZONE`: Cluster zone (e.g., `a`), defaults to none (i.e.
+     use a regional cluster).
    - `E2E_GKE_CLUSTER_BACKUP_ZONES`: Space-separated list of zones to retry test
      cluster creation in case of stockout. If defined,
      `E2E_GKE_CLUSTER_BACKUP_REGIONS` will be ignored thus it defaults to none.
@@ -128,7 +129,8 @@ This is a helper script for Knative E2E test scripts. To use it:
      autoscaling, defaults to 1.
    - `E2E_MAX_CLUSTER_NODES`: Maximum number of nodes in the cluster when
      autoscaling, defaults to 3.
-   - `E2E_GKE_SCOPES`: Scopes for the GKE node instances, defaults to `cloud-platform`.
+   - `E2E_GKE_SCOPES`: Scopes for the GKE node instances, defaults to
+     `cloud-platform`.
    - `E2E_CLUSTER_VERSION`: Version for the cluster, defaults to `latest`.
 
 1. Source the script.