Repository: knative/serving
Pull request #7884 (2020-05-07 20:04:46)

Update outdated doc link to errors
## Proposed Changes
Fixing some outdated doc links

**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
NONE
```


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

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

Patch:
diff --git a/cmd/queue/main.go b/cmd/queue/main.go
index f66c30d1b..1be09afb6 100644
--- a/cmd/queue/main.go
+++ b/cmd/queue/main.go
@@ -27,9 +27,7 @@ import (
 	"net/http/httputil"
 	"net/url"
 	"os"
-	"path"
 	"strconv"
-	"strings"
 	"time"
 
 	"github.com/kelseyhightower/envconfig"
@@ -111,12 +109,6 @@ type config struct {
 	ServingService               string `split_words:"true"` // optional
 	ServingRequestMetricsBackend string `split_words:"true"` // optional
 
-	// /var/log configuration
-	EnableVarLogCollection bool   `split_words:"true"` // optional
-	UserContainerName      string `split_words:"true"` // optional
-	VarLogVolumeName       string `split_words:"true"` // optional
-	InternalVolumePath     string `split_words:"true"` // optional
-
 	// DownwardAPI configuration for pod labels
 	DownwardAPILabelsPath string `split_words:"true"`
 
@@ -348,10 +340,6 @@ func main() {
 		})),
 		zap.String(logkey.Pod, env.ServingPod))
 
-	if err := validateEnv(env); err != nil {
-		logger.Fatalw("Error validating env", zap.Error(err))
-	}
-
 	// Report stats on Go memory usage every 30 seconds.
 	msp := metrics.NewMemStatsAll()
 	msp.Start(context.Background(), 30*time.Second)
@@ -403,15 +391,6 @@ func main() {
 		}(name, server)
 	}
 
-	// Setup /var/log.
-	// Logic that isn't required to be executed before the critical path
-	// and should be started last to not impact start up latency
-	go func() {
-		if env.EnableVarLogCollection {
-			createVarLogLink(env)
-		}
-	}()
-
 	// Blocks until we actually receive a TERM signal or one of the servers
 	// exit unexpectedly. We fold both signals together because we only want
 	// to act on the first of those to reach here.
@@ -447,21 +426,6 @@ func main() {
 	}
 }
 
-func validateEnv(env config) error {
-	if !env.EnableVarLogCollection {
-		return nil
-	}
-
-	if env.VarLogVolumeName == "" {
-		return errors.New("VAR_LOG_VOLUME_NAME must be specified when ENABLE_VAR_LOG_COLLECTION is true")
-	}
-	if env.InternalVolumePath == "" {
-		return errors.New("INTERNAL_VOLUME_PATH must be specified when ENABLE_VAR_LOG_COLLECTION is true")
-	}
-
-	return nil
-}
-
 func buildProbe(probeJSON string) *readiness.Probe {
 	coreProbe, err := readiness.DecodeProbe(probeJSON)
 	if err != nil {
@@ -581,17 +545,6 @@ func buildMetricsServer(promStatReporter *queue.PrometheusStatsReporter) *http.S
 	}
 }
 
-// createVarLogLink creates a symlink allowing the fluentd daemon set to capture the
-// logs from the user container /var/log. See fluentd config for more details.
-func createVarLogLink(env config) {
-	link := strings.Join([]string{env.ServingNamespace, env.ServingPod, env.UserContainerName}, "_")
-	target := path.Join("..", env.VarLogVolumeName)
-	source := path.Join(env.InternalVolumePath, link)
-	if err := os.Symlink(target, source); err != nil {
-		logger.Errorw("Failed to create /var/log symlink. Log collection will not work.", zap.Error(err))
-	}
-}
-
 func pushRequestLogHandler(currentHandler http.Handler, env config) http.Handler {
 	if env.ServingRequestLogTemplate == "" {
 		return currentHandler
diff --git a/config/core/configmaps/dummy.go b/config/core/configmaps/dummy.go
new file mode 100644
index 000000000..ee729dd5d
--- /dev/null
+++ b/config/core/configmaps/dummy.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2020 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
+
+    https://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 configmaps is a placeholder that allows us to pull in config files
+// via go mod vendor.
+package configmaps
diff --git a/config/core/deployments/dummy.go b/config/core/deployments/dummy.go
new file mode 100644
index 000000000..a3bde1ba6
--- /dev/null
+++ b/config/core/deployments/dummy.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2020 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
+
+    https://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 deployments is a placeholder that allows us to pull in config files
+// via go mod vendor.
+package deployments
diff --git a/config/core/dummy.go b/config/core/dummy.go
new file mode 100644
index 000000000..9658a36aa
--- /dev/null
+++ b/config/core/dummy.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2020 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
+
+    https://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 core is a placeholder that allows us to pull in config files
+// via go mod vendor.
+package core
diff --git a/config/core/resources/dummy.go b/config/core/resources/dummy.go
new file mode 100644
index 000000000..229171cdc
--- /dev/null
+++ b/config/core/resources/dummy.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2020 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
+
+    https://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 resources is a placeholder that allows us to pull in config files
+// via go mod vendor.
+package resources
diff --git a/config/core/roles/dummy.go b/config/core/roles/dummy.go
new file mode 100644
index 000000000..cddff2b7f
--- /dev/null
+++ b/config/core/roles/dummy.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2020 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
+
+    https://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 roles is a placeholder that allows us to pull in config files
+// via go mod vendor.
+package roles
diff --git a/config/core/webhooks/dummy.go b/config/core/webhooks/dummy.go
new file mode 100644
index 000000000..4de28428b
--- /dev/null
+++ b/config/core/webhooks/dummy.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2020 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
+
+    https://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 webhooks is a placeholder that allows us to pull in config files
+// via go mod vendor.
+package webhooks
diff --git a/config/hpa-autoscaling/dummy.go b/config/hpa-autoscaling/dummy.go
new file mode 100644
index 000000000..f009a605c
--- /dev/null
+++ b/config/hpa-autoscaling/dummy.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2020 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
+
+    https://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 autoscaling is a placeholder that allows us to pull in config files
+// via go mod vendor.
+package autoscaling
diff --git a/config/monitoring/logging/elasticsearch/100-fluentd-configmap.yaml b/config/monitoring/logging/elasticsearch/100-fluentd-configmap.yaml
index 06e555830..b377d7436 100644
--- a/config/monitoring/logging/elasticsearch/100-fluentd-configmap.yaml
+++ b/config/monitoring/logging/elasticsearch/100-fluentd-configmap.yaml
@@ -41,7 +41,7 @@ data:
       @id containers-var-log
       @type tail
       # **/*/**/* allows path expansion to go through one symlink (the one created by the init container)
-      path /var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/knative-internal/**/*/**/*
+      path /var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/knative-var-log/**/*/**/*
       path_key stream
       pos_file /var/log/containers-var-log.pos
       tag raw.kubernetes.*
@@ -72,21 +72,21 @@ data:
       max_lines 1000
     </match>
     # Make stream path correct from the container's point of view
-    <filter kubernetes.var.lib.kubelet.pods.*.volumes.kubernetes.io~empty-dir.knative-internal.*.**>
+    <filter kubernetes.var.lib.kubelet.pods.*.volumes.kubernetes.io~empty-dir.knative-var-log.*.**>
       @type record_transformer
       enable_ruby true
       <record>
-        stream /var/log/${record["stream"].scan(/\/knative-internal\/[^\/]+\/(.*)/).last.last}
+        stream /var/log/${record["stream"].scan(/\/knative-var-log\/[^\/]+\/(.*)/).last.last}
       </record>
     </filter>
     # Add Kubernetes metadata to logs from /var/log/containers
     <filter kubernetes.var.log.containers.**>
       @type kubernetes_metadata
     </filter>
-    # Add Kubernetes metadata to logs from /var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/knative-internal/**/*/**/*
+    # Add Kubernetes metadata to logs from /var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/knative-var-log/**/*/**/*
     <filter kubernetes.var.lib.kubelet.pods.**>
       @type kubernetes_metadata
-      tag_to_kubernetes_name_regexp (?<docker_id>[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12})\.volumes.kubernetes\.io~empty-dir\.knative-internal\.(?<namespace>[^_]+)_(?<pod_name>[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<container_name>user-container)\..*?$
+      tag_to_kubernetes_name_regexp (?<docker_id>[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12})\.volumes\.kubernetes\.io~empty-dir\.knative-var-log\.(?<namespace>[^_]+)_(?<pod_name>[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<container_name>)[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\..*?$
     </filter>
   300.forward.input.conf: |-
     # Takes the messages sent over TCP, e.g. request logs from Istio
diff --git a/config/monitoring/logging/stackdriver/100-fluentd-configmap.yaml b/config/monitoring/logging/stackdriver/100-fluentd-configmap.yaml
index 5eda924eb..5b1f31fe2 100644
--- a/config/monitoring/logging/stackdriver/100-fluentd-configmap.yaml
+++ b/config/monitoring/logging/stackdriver/100-fluentd-configmap.yaml
@@ -40,7 +40,7 @@ data:
     <source>
       @id containers-var-log
       @type tail
-      path /var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/knative-internal/**/*/**/*
+      path /var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/knative-var-log/**/*/**/*
       path_key stream
       pos_file /var/log/containers-var-log.pos
       tag raw.kubernetes.*
@@ -60,21 +60,21 @@ data:
       max_lines 1000
     </match>
     # Make stream path correct from the container's point of view
-    <filter kubernetes.var.lib.kubelet.pods.*.volumes.kubernetes.io~empty-dir.knative-internal.*.**>
+    <filter kubernetes.var.lib.kubelet.pods.*.volumes.kubernetes.io~empty-dir.knative-var-log.*.**>
       @type record_transformer
       enable_ruby true
       <record>
-        stream /var/log/${record["stream"].scan(/\/knative-internal\/[^\/]+\/(.*)/).last.last}
+        stream /var/log/${record["stream"].scan(/\/knative-var-log\/[^\/]+\/(.*)/).last.last}
       </record>
     </filter>
     # Add Kubernetes metadata to logs from /var/log/containers
     <filter kubernetes.var.log.containers.**>
       @type kubernetes_metadata
     </filter>
-    # Add Kubernetes metadata to logs from /var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/knative-internal/**/*/**/*
+    # Add Kubernetes metadata to logs from /var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/knative-var-log/**/*/**/*
     <filter kubernetes.var.lib.kubelet.pods.**>
       @type kubernetes_metadata
-      tag_to_kubernetes_name_regexp (?<docker_id>[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12})\.volumes.kubernetes\.io~empty-dir\.knative-internal\.(?<namespace>[^_]+)_(?<pod_name>[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<container_name>user-container)\..*?$
+      tag_to_kubernetes_name_regexp (?<docker_id>[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12})\.volumes\.kubernetes\.io~empty-dir\.knative-var-log\.(?<namespace>[^_]+)_(?<pod_name>[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<container_name>)[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\..*?$
     </filter>
   300.forward.input.conf: |-
     # Takes the messages sent over TCP, e.g. request logs from Istio
diff --git a/config/namespace-wildcard-certs/dummy.go b/config/namespace-wildcard-certs/dummy.go
new file mode 100644
index 000000000..678e72478
--- /dev/null
+++ b/config/namespace-wildcard-certs/dummy.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2020 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
+
+    https://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 certs is a placeholder that allows us to pull in config files
+// via go mod vendor.
+package certs
diff --git a/config/post-install/dummy.go b/config/post-install/dummy.go
new file mode 100644
index 000000000..c5cc04518
--- /dev/null
+++ b/config/post-install/dummy.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2020 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
+
+    https://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 install is a placeholder that allows us to pull in config files
+// via go mod vendor.
+package install
diff --git a/pkg/reconciler/revision/resources/deploy.go b/pkg/reconciler/revision/resources/deploy.go
index 28c2d5cb1..fe4607931 100644
--- a/pkg/reconciler/revision/resources/deploy.go
+++ b/pkg/reconciler/revision/resources/deploy.go
@@ -42,10 +42,6 @@ import (
 )
 
 const (
-	varLogVolumeName   = "knative-var-log"
-	varLogVolumePath   = "/var/log"
-	internalVolumeName = "knative-internal"
-	internalVolumePath = "/var/knative-internal"
 	podInfoVolumeName  = "podinfo"
 	podInfoVolumePath  = "/etc/podinfo"
 	metadataLabelsRef  = "metadata.labels"
@@ -54,15 +50,16 @@ const (
 
 var (
 	varLogVolume = corev1.Volume{
-		Name: varLogVolumeName,
+		Name: "knative-var-log",
 		VolumeSource: corev1.VolumeSource{
 			EmptyDir: &corev1.EmptyDirVolumeSource{},
 		},
 	}
 
 	varLogVolumeMount = corev1.VolumeMount{
-		Name:      varLogVolumeName,
-		MountPath: varLogVolumePath,
+		Name:        varLogVolume.Name,
+		MountPath:   "/var/log",
+		SubPathExpr: "$(K_INTERNAL_POD_NAMESPACE)_$(K_INTERNAL_POD_NAME)_",
 	}
 
 	labelVolume = corev1.Volume{
@@ -86,18 +83,6 @@ var (
 		MountPath: podInfoVolumePath,
 	}
 
-	internalVolume = corev1.Volume{
-		Name: internalVolumeName,
-		VolumeSource: corev1.VolumeSource{
-			EmptyDir: &corev1.EmptyDirVolumeSource{},
-		},
-	}
-
-	internalVolumeMount = corev1.VolumeMount{
-		Name:      internalVolumeName,
-		MountPath: internalVolumePath,
-	}
-
 	// This PreStop hook is actually calling an endpoint on the queue-proxy
 	// because of the way PreStop hooks are called by kubelet. We use this
 	// to block the user-container from exiting before the queue-proxy is ready
@@ -144,11 +129,6 @@ func makePodSpec(rev *v1.Revision, loggingConfig *logging.Config, tracingConfig
 	userContainer := BuildUserContainer(rev)
 	podSpec := BuildPodSpec(rev, []corev1.Container{*userContainer, *queueContainer})
 
-	// Add the Knative internal volume only if /var/log collection is enabled
-	if observabilityConfig.EnableVarLogCollection {
-		podSpec.Volumes = append(podSpec.Volumes, internalVolume)
-	}
-
 	if autoscalerConfig.EnableGracefulScaledown {
 		podSpec.Volumes = append(podSpec.Volumes, labelVolume)
 	}
@@ -161,8 +141,10 @@ func BuildUserContainer(rev *v1.Revision) *corev1.Container {
 	userContainer := rev.Spec.GetContainer().DeepCopy()
 	// Adding or removing an overwritten corev1.Container field here? Don't forget to
 	// update the fieldmasks / validations in pkg/apis/serving
+	varLogMount := varLogVolumeMount.DeepCopy()
+	varLogMount.SubPathExpr += userContainer.Name
 
-	userContainer.VolumeMounts = append(userContainer.VolumeMounts, varLogVolumeMount)
+	userContainer.VolumeMounts = append(userContainer.VolumeMounts, *varLogMount)
 	userContainer.Lifecycle = userLifecycle
 	userPort := getUserPort(rev)
 	userPortInt := int(userPort)
@@ -171,6 +153,8 @@ func BuildUserContainer(rev *v1.Revision) *corev1.Container {
 	userContainer.Ports = buildContainerPorts(userPort)
 	userContainer.Env = append(userContainer.Env, buildUserPortEnv(userPortStr))
 	userContainer.Env = append(userContainer.Env, getKnativeEnvVar(rev)...)
+	userContainer.Env = append(userContainer.Env, buildVarLogSubpathEnvs()...)
+
 	// Explicitly disable stdin and tty allocation
 	userContainer.Stdin = false
 	userContainer.TTY = false
@@ -225,6 +209,24 @@ func buildContainerPorts(userPort int32) []corev1.ContainerPort {
 	}}
 }
 
+func buildVarLogSubpathEnvs() []corev1.EnvVar {
+	return []corev1.EnvVar{{
+		Name: "K_INTERNAL_POD_NAME",
+		ValueFrom: &corev1.EnvVarSource{
+			FieldRef: &corev1.ObjectFieldSelector{
+				FieldPath: "metadata.name",
+			},
+		},
+	}, {
+		Name: "K_INTERNAL_POD_NAMESPACE",
+		ValueFrom: &corev1.EnvVarSource{
+			FieldRef: &corev1.ObjectFieldSelector{
+				FieldPath: "metadata.namespace",
+			},
+		},
+	}}
+}
+
 func buildUserPortEnv(userPort string) corev1.EnvVar {
 	return corev1.EnvVar{
 		Name:  "PORT",
diff --git a/pkg/reconciler/revision/resources/queue.go b/pkg/reconciler/revision/resources/queue.go
index 3a3b3bd4a..490e80ec5 100644
--- a/pkg/reconciler/revision/resources/queue.go
+++ b/pkg/reconciler/revision/resources/queue.go
@@ -220,10 +220,6 @@ func makeQueueContainer(rev *v1.Revision, loggingConfig *logging.Config, tracing
 	ports = append(ports, servingPort)
 
 	var volumeMounts []corev1.VolumeMount
-	if observabilityConfig.EnableVarLogCollection {
-		volumeMounts = append(volumeMounts, internalVolumeMount)
-	}
-
 	if autoscalerConfig.EnableGracefulScaledown {
 		volumeMounts = append(volumeMounts, labelVolumeMount)
 	}
@@ -317,18 +313,6 @@ func makeQueueContainer(rev *v1.Revision, loggingConfig *logging.Config, tracing
 		}, {
 			Name:  pkgmetrics.DomainEnv,
 			Value: pkgmetrics.Domain(),
-		}, {
-			Name:  "USER_CONTAINER_NAME",
-			Value: rev.Spec.GetContainer().Name,
-		}, {
-			Name:  "ENABLE_VAR_LOG_COLLECTION",
-			Value: strconv.FormatBool(observabilityConfig.EnableVarLogCollection),
-		}, {
-			Name:  "VAR_LOG_VOLUME_NAME",
-			Value: varLogVolumeName,
-		}, {
-			Name:  "INTERNAL_VOLUME_PATH",
-			Value: internalVolumePath,
 		}, {
 			Name:  "DOWNWARD_API_LABELS_PATH",
 			Value: fmt.Sprintf("%s/%s", podInfoVolumePath, metadataLabelsPath),
diff --git a/pkg/reconciler/revision/revision.go b/pkg/reconciler/revision/revision.go
index e165410d8..caec98227 100644
--- a/pkg/reconciler/revision/revision.go
+++ b/pkg/reconciler/revision/revision.go
@@ -18,6 +18,7 @@ package revision
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"strings"
 
@@ -97,54 +98,31 @@ func (c *Reconciler) reconcileDigest(ctx context.Context, rev *v1.Revision) erro
 	}
 
 	var digestGrp errgroup.Group
-	type digestData struct {
-		digestValue        string
-		containerName      string
-		isServingContainer bool
-		image              string
-		digestError        error
-	}
-
-	digests := make(chan digestData, len(rev.Spec.Containers))
-	for _, container := range rev.Spec.Containers {
+	containerStatuses := make([]v1.ContainerStatuses, len(rev.Spec.Containers))
+	for i, container := range rev.Spec.Containers {
 		container := container // Standard Go concurrency pattern.
+		i := i
 		digestGrp.Go(func() error {
 			digest, err := c.resolver.Resolve(container.Image,
 				opt, cfgs.Deployment.RegistriesSkippingTagResolving)
 			if err != nil {
-				err = fmt.Errorf("failed to resolve image to digest: %w", err)
-				digests <- digestData{
-					image:       container.Image,
-					digestError: err,
-				}
-			} else {
-				isServingContainer := len(rev.Spec.Containers) == 1 || len(container.Ports) != 0
-				digests <- digestData{
-					digestValue:        digest,
-					containerName:      container.Name,
-					isServingContainer: isServingContainer,
-				}
+				return errors.New(v1.RevisionContainerMissingMessage(container.Image, fmt.Sprintf("failed to resolve image to digest: %v", err)))
+			}
+			if len(rev.Spec.Containers) == 1 || len(container.Ports) != 0 {
+				rev.Status.DeprecatedImageDigest = digest
+			}
+			containerStatuses[i] = v1.ContainerStatuses{
+				Name:        container.Name,
+				ImageDigest: digest,
 			}
 			return nil
 		})
 	}
-	digestGrp.Wait()
-	close(digests)
-	for v := range digests {
-		if v.digestError != nil {
-			rev.Status.MarkContainerHealthyFalse(v1.ReasonContainerMissing,
-				v1.RevisionContainerMissingMessage(
-					v.image, v.digestError.Error()))
-			return v.digestError
-		}
-		if v.isServingContainer {
-			rev.Status.DeprecatedImageDigest = v.digestValue
-		}
-		rev.Status.ContainerStatuses = append(rev.Status.ContainerStatuses, v1.ContainerStatuses{
-			Name:        v.containerName,
-			ImageDigest: v.digestValue,
-		})
+	if err := digestGrp.Wait(); err != nil {
+		rev.Status.MarkContainerHealthyFalse(v1.ReasonContainerMissing, err.Error())
+		return err
 	}
+	rev.Status.ContainerStatuses = containerStatuses
 	return nil
 }
 


Test patch:
diff --git a/cmd/queue/main_test.go b/cmd/queue/main_test.go
index 53cd79de7..69ca84223 100644
--- a/cmd/queue/main_test.go
+++ b/cmd/queue/main_test.go
@@ -24,7 +24,6 @@ import (
 	"net/http/httputil"
 	"net/url"
 	"os"
-	"path"
 	"strconv"
 	"strings"
 	"sync/atomic"
@@ -173,32 +172,6 @@ func TestProbeHandler(t *testing.T) {
 	}
 }
 
-func TestCreateVarLogLink(t *testing.T) {
-	dir, err := ioutil.TempDir("", "TestCreateVarLogLink")
-	if err != nil {
-		t.Errorf("Failed to created temporary directory: %v", err)
-	}
-	defer os.RemoveAll(dir)
-	var env = config{
-		ServingNamespace:   "default",
-		ServingPod:         "service-7f97f9465b-5kkm5",
-		UserContainerName:  "user-container",
-		VarLogVolumeName:   "knative-var-log",
-		InternalVolumePath: dir,
-	}
-	createVarLogLink(env)
-
-	source := path.Join(dir, "default_service-7f97f9465b-5kkm5_user-container")
-	want := "../knative-var-log"
-	got, err := os.Readlink(source)
-	if err != nil {
-		t.Errorf("Failed to read symlink: %v", err)
-	}
-	if got != want {
-		t.Errorf("Incorrect symlink = %q, want %q, diff: %s", got, want, cmp.Diff(got, want))
-	}
-}
-
 func TestProbeQueueInvalidPort(t *testing.T) {
 	const port = 0 // invalid port
 
diff --git a/pkg/reconciler/revision/resources/deploy_test.go b/pkg/reconciler/revision/resources/deploy_test.go
index f93d9c9d8..933ed2cab 100644
--- a/pkg/reconciler/revision/resources/deploy_test.go
+++ b/pkg/reconciler/revision/resources/deploy_test.go
@@ -46,10 +46,14 @@ var (
 	containerName                = "my-container-name"
 	sidecarIstioInjectAnnotation = "sidecar.istio.io/inject"
 	defaultUserContainer         = &corev1.Container{
-		Name:                     containerName,
-		Image:                    "busybox",
-		Ports:                    buildContainerPorts(v1.DefaultUserPort),
-		VolumeMounts:             []corev1.VolumeMount{varLogVolumeMount},
+		Name:  containerName,
+		Image: "busybox",
+		Ports: buildContainerPorts(v1.DefaultUserPort),
+		VolumeMounts: []corev1.VolumeMount{{
+			Name:        varLogVolume.Name,
+			MountPath:   "/var/log",
+			SubPathExpr: "$(K_INTERNAL_POD_NAMESPACE)_$(K_INTERNAL_POD_NAME)_my-container-name",
+		}},
 		Lifecycle:                userLifecycle,
 		TerminationMessagePolicy: corev1.TerminationMessageFallbackToLogsOnError,
 		Stdin:                    false,
@@ -64,6 +68,12 @@ var (
 			Name: "K_CONFIGURATION",
 		}, {
 			Name: "K_SERVICE",
+		}, {
+			Name:      "K_INTERNAL_POD_NAME",
+			ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{FieldPath: "metadata.name"}},
+		}, {
+			Name:      "K_INTERNAL_POD_NAMESPACE",
+			ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{FieldPath: "metadata.namespace"}},
 		}},
 	}
 
@@ -147,18 +157,6 @@ var (
 		}, {
 			Name:  "METRICS_DOMAIN",
 			Value: metrics.Domain(),
-		}, {
-			Name:  "USER_CONTAINER_NAME",
-			Value: containerName,
-		}, {
-			Name:  "ENABLE_VAR_LOG_COLLECTION",
-			Value: "false",
-		}, {
-			Name:  "VAR_LOG_VOLUME_NAME",
-			Value: varLogVolumeName,
-		}, {
-			Name:  "INTERNAL_VOLUME_PATH",
-			Value: internalVolumePath,
 		}, {
 			Name:  "DOWNWARD_API_LABELS_PATH",
 			Value: fmt.Sprintf("%s/%s", podInfoVolumePath, metadataLabelsPath),
@@ -276,12 +274,6 @@ func withEnvVar(name, value string) containerOption {
 	}
 }
 
-func withInternalVolumeMount() containerOption {
-	return func(container *corev1.Container) {
-		container.VolumeMounts = append(container.VolumeMounts, internalVolumeMount)
-	}
-}
-
 func withPodLabelsVolumeMount() containerOption {
 	return func(container *corev1.Container) {
 		container.VolumeMounts = append(container.VolumeMounts, labelVolumeMount)
@@ -635,30 +627,6 @@ func TestMakePodSpec(t *testing.T) {
 					withEnvVar("CONTAINER_CONCURRENCY", "0"),
 				),
 			}),
-	}, {
-		name: "with /var/log collection",
-		rev: revision("bar", "foo", withContainerConcurrency(1),
-			func(revision *v1.Revision) {
-				container(revision.Spec.GetContainer(),
-					withTCPReadinessProbe(),
-				)
-			}),
-		oc: metrics.ObservabilityConfig{
-			EnableVarLogCollection: true,
-		},
-		want: podSpec(
-			[]corev1.Container{
-				userContainer(),
-				queueContainer(
-					withEnvVar("CONTAINER_CONCURRENCY", "1"),
-					withEnvVar("ENABLE_VAR_LOG_COLLECTION", "true"),
-					withInternalVolumeMount(),
-				),
-			},
-			func(podSpec *corev1.PodSpec) {
-				podSpec.Volumes = append(podSpec.Volumes, internalVolume)
-			},
-		),
 	}, {
 		name: "with graceful scaledown enabled",
 		rev: revision("bar", "foo", func(revision *v1.Revision) {
diff --git a/pkg/reconciler/revision/resources/queue_test.go b/pkg/reconciler/revision/resources/queue_test.go
index c7e8f4973..901fdd3ad 100644
--- a/pkg/reconciler/revision/resources/queue_test.go
+++ b/pkg/reconciler/revision/resources/queue_test.go
@@ -784,10 +784,6 @@ var defaultEnv = map[string]string{
 	"SYSTEM_NAMESPACE":                      system.Namespace(),
 	"METRICS_DOMAIN":                        metrics.Domain(),
 	"QUEUE_SERVING_PORT":                    "8012",
-	"USER_CONTAINER_NAME":                   containerName,
-	"ENABLE_VAR_LOG_COLLECTION":             "false",
-	"VAR_LOG_VOLUME_NAME":                   varLogVolumeName,
-	"INTERNAL_VOLUME_PATH":                  internalVolumePath,
 	"DOWNWARD_API_LABELS_PATH":              fmt.Sprintf("%s/%s", podInfoVolumePath, metadataLabelsPath),
 	"ENABLE_PROFILING":                      "false",
 	"SERVING_ENABLE_PROBE_REQUEST_LOG":      "false",
diff --git a/pkg/reconciler/revision/revision_test.go b/pkg/reconciler/revision/revision_test.go
index 4e8925b5f..8c016e10e 100644
--- a/pkg/reconciler/revision/revision_test.go
+++ b/pkg/reconciler/revision/revision_test.go
@@ -20,7 +20,6 @@ import (
 	"context"
 	"errors"
 	"fmt"
-	"strconv"
 	"strings"
 	"testing"
 	"time"
@@ -346,12 +345,17 @@ func TestRevWithImageDigests(t *testing.T) {
 
 	rev := testRevision(corev1.PodSpec{
 		Containers: []corev1.Container{{
+			Name:  "first",
 			Image: "gcr.io/repo/image",
 			Ports: []corev1.ContainerPort{{
 				ContainerPort: 8888,
 			}},
 		}, {
+			Name:  "second",
 			Image: "docker.io/repo/image",
+		}, {
+			Name:  "third",
+			Image: "docker.io/anotherrepo/image",
 		}},
 	})
 	createRevision(t, ctx, controller, rev)
@@ -369,6 +373,11 @@ func TestRevWithImageDigests(t *testing.T) {
 	if len(rev.Spec.Containers) != len(rev.Status.ContainerStatuses) {
 		t.Error("Image digests does not match with the provided containers")
 	}
+	for i, c := range rev.Spec.Containers {
+		if c.Name != rev.Status.ContainerStatuses[i].Name {
+			t.Error("Container statuses do not match the order of containers in spec")
+		}
+	}
 	rev.Status.ContainerStatuses = []v1.ContainerStatuses{}
 	updateRevision(t, ctx, controller, rev)
 	if len(rev.Status.ContainerStatuses) != 0 {
@@ -593,47 +602,6 @@ func TestGlobalResyncOnConfigMapUpdateDeployment(t *testing.T) {
 		configMapToUpdate *corev1.ConfigMap
 		callback          func(*testing.T) func(runtime.Object) HookResult
 	}{{
-		name: "Disable /var/log Collection", // Should set ENABLE_VAR_LOG_COLLECTION to false
-		configMapToUpdate: &corev1.ConfigMap{
-			ObjectMeta: metav1.ObjectMeta{
-				Namespace: system.Namespace(),
-				Name:      metrics.ConfigMapName(),
-			},
-			Data: map[string]string{
-				"logging.enable-var-log-collection": "false",
-			},
-		},
-		callback: func(t *testing.T) func(runtime.Object) HookResult {
-			return func(obj runtime.Object) HookResult {
-				deployment := obj.(*appsv1.Deployment)
-				t.Logf("Deployment updated: %v", deployment.Name)
-
-				for _, c := range deployment.Spec.Template.Spec.Containers {
-					if c.Name == resources.QueueContainerName {
-						for _, e := range c.Env {
-							if e.Name == "ENABLE_VAR_LOG_COLLECTION" {
-								flag, err := strconv.ParseBool(e.Value)
-								if err != nil {
-									t.Errorf("Invalid ENABLE_VAR_LOG_COLLECTION value: %q", e.Name)
-									return HookIncomplete
-								}
-								if flag {
-									t.Errorf("ENABLE_VAR_LOG_COLLECTION = %v, want: %v", flag, false)
-									return HookIncomplete
-								}
-								return HookComplete
-							}
-						}
-
-						t.Error("ENABLE_VAR_LOG_COLLECTION is not set")
-						return HookIncomplete
-					}
-				}
-				t.Logf("The deployment spec doesn't contain the expected container %q", resources.QueueContainerName)
-				return HookIncomplete
-			}
-		},
-	}, {
 		name: "Update QueueProxy Image", // Should update queueSidecarImage
 		configMapToUpdate: &corev1.ConfigMap{
 			ObjectMeta: metav1.ObjectMeta{
diff --git a/test/README.md b/test/README.md
index f5dbf0af5..1eaeb064b 100644
--- a/test/README.md
+++ b/test/README.md
@@ -170,7 +170,7 @@ flags:
 - [`--https`](#using-https)
 - [`--ingressClass`](#using-ingress-class)
 
-### Overridding docker repo
+### Overriding docker repo
 
 The `--dockerrepo` argument lets you specify the docker repo from which images
 used by your tests should be pulled. This will default to the value of your
diff --git a/test/conformance/api/v1/errorcondition_test.go b/test/conformance/api/v1/errorcondition_test.go
index 326c69cb6..8d8598643 100644
--- a/test/conformance/api/v1/errorcondition_test.go
+++ b/test/conformance/api/v1/errorcondition_test.go
@@ -40,7 +40,7 @@ const (
 )
 
 // TestContainerErrorMsg is to validate the error condition defined at
-// https://github.com/knative/serving/blob/master/docs/spec/errors.md
+// https://github.com/knative/docs/blob/master/docs/serving/spec/knative-api-specification-1.0.md#error-signalling
 // for the container image missing scenario.
 func TestContainerErrorMsg(t *testing.T) {
 	t.Parallel()
diff --git a/test/conformance/api/v1alpha1/errorcondition_test.go b/test/conformance/api/v1alpha1/errorcondition_test.go
index 17e3d435d..c0b3caeda 100644
--- a/test/conformance/api/v1alpha1/errorcondition_test.go
+++ b/test/conformance/api/v1alpha1/errorcondition_test.go
@@ -39,7 +39,7 @@ const (
 )
 
 // TestContainerErrorMsg is to validate the error condition defined at
-// https://github.com/knative/serving/blob/master/docs/spec/errors.md
+// https://github.com/knative/docs/blob/master/docs/serving/spec/knative-api-specification-1.0.md#error-signalling
 // for the container image missing scenario.
 func TestContainerErrorMsg(t *testing.T) {
 	t.Parallel()
diff --git a/test/conformance/api/v1beta1/errorcondition_test.go b/test/conformance/api/v1beta1/errorcondition_test.go
index 2f59ac8c3..dbb0a0363 100644
--- a/test/conformance/api/v1beta1/errorcondition_test.go
+++ b/test/conformance/api/v1beta1/errorcondition_test.go
@@ -40,7 +40,7 @@ const (
 )
 
 // TestContainerErrorMsg is to validate the error condition defined at
-// https://github.com/knative/serving/blob/master/docs/spec/errors.md
+// https://github.com/knative/docs/blob/master/docs/serving/spec/knative-api-specification-1.0.md#error-signalling
 // for the container image missing scenario.
 func TestContainerErrorMsg(t *testing.T) {
 	t.Parallel()
diff --git a/test/ha/activator_test.go b/test/ha/activator_test.go
index d7d2e70b4..a0d04278d 100644
--- a/test/ha/activator_test.go
+++ b/test/ha/activator_test.go
@@ -24,6 +24,7 @@ import (
 	"testing"
 
 	"knative.dev/pkg/system"
+	"knative.dev/pkg/test/logstream"
 
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"knative.dev/pkg/ptr"
@@ -47,6 +48,8 @@ const (
 // that we can scale from zero after activator restart.
 func TestActivatorHA(t *testing.T) {
 	clients := e2e.Setup(t)
+	cancel := logstream.Start(t)
+	defer cancel()
 
 	if err := waitForDeploymentScale(clients, activatorDeploymentName, haReplicas); err != nil {
 		t.Fatalf("Deployment %s not scaled to %d: %v", activatorDeploymentName, haReplicas, err)
diff --git a/test/ha/autoscalerhpa_test.go b/test/ha/autoscalerhpa_test.go
index d47cedc57..462d11a7d 100644
--- a/test/ha/autoscalerhpa_test.go
+++ b/test/ha/autoscalerhpa_test.go
@@ -22,8 +22,10 @@ import (
 	"testing"
 
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
 	"knative.dev/pkg/system"
 	pkgTest "knative.dev/pkg/test"
+	"knative.dev/pkg/test/logstream"
 	"knative.dev/serving/pkg/apis/autoscaling"
 	rtesting "knative.dev/serving/pkg/testing/v1"
 	"knative.dev/serving/test"
@@ -38,6 +40,8 @@ const (
 
 func TestAutoscalerHPAHANewRevision(t *testing.T) {
 	clients := e2e.Setup(t)
+	cancel := logstream.Start(t)
+	defer cancel()
 
 	if err := waitForDeploymentScale(clients, autoscalerHPADeploymentName, haReplicas); err != nil {
 		t.Fatalf("Deployment %s not scaled to %d: %v", autoscalerHPADeploymentName, haReplicas, err)
diff --git a/test/ha/controller_test.go b/test/ha/controller_test.go
index 0578646e9..1e537eafd 100644
--- a/test/ha/controller_test.go
+++ b/test/ha/controller_test.go
@@ -22,17 +22,19 @@ import (
 	"testing"
 
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
 	"knative.dev/pkg/system"
+	"knative.dev/pkg/test/logstream"
 	"knative.dev/serving/test"
 	"knative.dev/serving/test/e2e"
 )
 
-const (
-	controllerDeploymentName = "controller"
-)
+const controllerDeploymentName = "controller"
 
 func TestControllerHA(t *testing.T) {
 	clients := e2e.Setup(t)
+	cancel := logstream.Start(t)
+	defer cancel()
 
 	if err := waitForDeploymentScale(clients, controllerDeploymentName, haReplicas); err != nil {
 		t.Fatalf("Deployment %s not scaled to %d: %v", controllerDeploymentName, haReplicas, err)
diff --git a/test/test_images/varlog/service.yaml b/test/test_images/varlog/service.yaml
new file mode 100644
index 000000000..7b99f9522
--- /dev/null
+++ b/test/test_images/varlog/service.yaml
@@ -0,0 +1,26 @@
+# Copyright 2020 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
+#
+#     https://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.
+
+
+apiVersion: serving.knative.dev/v1
+kind: Service
+metadata:
+  name: varlog-test-image
+  namespace: default
+spec:
+  template:
+    spec:
+      containers:
+        - name: wooo
+          image: ko://knative.dev/serving/test/test_images/varlog
diff --git a/test/test_images/varlog/varlog.go b/test/test_images/varlog/varlog.go
new file mode 100644
index 000000000..68d7c0289
--- /dev/null
+++ b/test/test_images/varlog/varlog.go
@@ -0,0 +1,54 @@
+/*
+Copyright 2020 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
+
+    https://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 main
+
+import (
+	"fmt"
+	"log"
+	"net/http"
+	"os"
+	"time"
+
+	"knative.dev/serving/test"
+)
+
+type handler struct {
+	logger *log.Logger
+}
+
+func (h *handler) Handle(w http.ResponseWriter, r *http.Request) {
+	h.logger.Println("var log received a request at " + time.Now().String())
+	fmt.Fprintln(w, "var log! How about some tasty noodles?")
+}
+
+func main() {
+	f, err := os.OpenFile("/var/log/server.log",
+		os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
+
+	if err != nil {
+		panic(err)
+	}
+
+	defer f.Close()
+
+	logger := log.New(f, "[server] ", log.LstdFlags)
+	logger.Println("var log app started at " + time.Now().String())
+
+	handler := handler{logger: logger}
+
+	test.ListenAndServeGracefully(":8080", handler.Handle)
+}
diff --git a/third_party/contour-latest/contour.yaml b/third_party/contour-latest/contour.yaml
index 1b9748c0e..6bd84ec28 100644
--- a/third_party/contour-latest/contour.yaml
+++ b/third_party/contour-latest/contour.yaml
@@ -1406,7 +1406,7 @@ spec:
         # if we change this on each version, you can no longer upgrade
         # just by applying the deployment YAML.
         # See #2423, #2395, #2150, and #2030 for earlier questions about this.
-        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:29503f5af78a1301a07b270d79952c67501eb8f645dda051ce6b0ec83c0f4991
+        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:4f7ff8187ef1d0872f345c9ef35b8e976e9e87248da5f7509477661cdbcd0cd3
         imagePullPolicy: Always
         command:
         - contour
@@ -1635,7 +1635,7 @@ spec:
         - --contour-key-file=/certs/tls.key
         - --config-path=/config/contour.yaml
         command: ["contour"]
-        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:29503f5af78a1301a07b270d79952c67501eb8f645dda051ce6b0ec83c0f4991
+        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:4f7ff8187ef1d0872f345c9ef35b8e976e9e87248da5f7509477661cdbcd0cd3
         imagePullPolicy: Always
         name: contour
         ports:
@@ -1726,7 +1726,7 @@ spec:
         args:
         - envoy
         - shutdown-manager
-        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:29503f5af78a1301a07b270d79952c67501eb8f645dda051ce6b0ec83c0f4991
+        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:4f7ff8187ef1d0872f345c9ef35b8e976e9e87248da5f7509477661cdbcd0cd3
         imagePullPolicy: Always
         lifecycle:
           preStop:
@@ -1802,7 +1802,7 @@ spec:
         - --envoy-key-file=/certs/tls.key
         command:
         - contour
-        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:29503f5af78a1301a07b270d79952c67501eb8f645dda051ce6b0ec83c0f4991
+        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:4f7ff8187ef1d0872f345c9ef35b8e976e9e87248da5f7509477661cdbcd0cd3
         imagePullPolicy: Always
         name: envoy-initconfig
         volumeMounts:
@@ -3243,7 +3243,7 @@ spec:
         # if we change this on each version, you can no longer upgrade
         # just by applying the deployment YAML.
         # See #2423, #2395, #2150, and #2030 for earlier questions about this.
-        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:29503f5af78a1301a07b270d79952c67501eb8f645dda051ce6b0ec83c0f4991
+        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:4f7ff8187ef1d0872f345c9ef35b8e976e9e87248da5f7509477661cdbcd0cd3
         imagePullPolicy: Always
         command:
         - contour
@@ -3472,7 +3472,7 @@ spec:
         - --contour-key-file=/certs/tls.key
         - --config-path=/config/contour.yaml
         command: ["contour"]
-        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:29503f5af78a1301a07b270d79952c67501eb8f645dda051ce6b0ec83c0f4991
+        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:4f7ff8187ef1d0872f345c9ef35b8e976e9e87248da5f7509477661cdbcd0cd3
         imagePullPolicy: Always
         name: contour
         ports:
@@ -3563,7 +3563,7 @@ spec:
         args:
         - envoy
         - shutdown-manager
-        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:29503f5af78a1301a07b270d79952c67501eb8f645dda051ce6b0ec83c0f4991
+        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:4f7ff8187ef1d0872f345c9ef35b8e976e9e87248da5f7509477661cdbcd0cd3
         imagePullPolicy: Always
         lifecycle:
           preStop:
@@ -3639,7 +3639,7 @@ spec:
         - --envoy-key-file=/certs/tls.key
         command:
         - contour
-        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:29503f5af78a1301a07b270d79952c67501eb8f645dda051ce6b0ec83c0f4991
+        image: gcr.io/knative-nightly/knative.dev/net-contour/vendor/github.com/projectcontour/contour/cmd/contour@sha256:4f7ff8187ef1d0872f345c9ef35b8e976e9e87248da5f7509477661cdbcd0cd3
         imagePullPolicy: Always
         name: envoy-initconfig
         volumeMounts:
diff --git a/third_party/contour-latest/net-contour.yaml b/third_party/contour-latest/net-contour.yaml
index 0a8570ff5..50aa80342 100644
--- a/third_party/contour-latest/net-contour.yaml
+++ b/third_party/contour-latest/net-contour.yaml
@@ -33,7 +33,7 @@ metadata:
   name: config-contour
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200504-78a8b6d"
+    serving.knative.dev/release: "v20200507-8f27913"
 data:
   _example: |
     ################################
@@ -90,7 +90,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:394b28a5fc144aab7a8f28074b329e948a9d2e44e2f06078b943ef22eac1a7c7
+        image: gcr.io/knative-nightly/knative.dev/net-contour/cmd/controller@sha256:e2f5b37dabcbc1741be1965ebc47f3f20521d12caf8dd798bc788bdb2d51bf12
         resources:
           requests:
             cpu: 40m
diff --git a/third_party/kourier-latest/kourier.yaml b/third_party/kourier-latest/kourier.yaml
index 8bac6ebb7..a04cae1c4 100644
--- a/third_party/kourier-latest/kourier.yaml
+++ b/third_party/kourier-latest/kourier.yaml
@@ -148,7 +148,7 @@ spec:
         app: 3scale-kourier-control
     spec:
       containers:
-      - image: gcr.io/knative-nightly/knative.dev/net-kourier/cmd/kourier@sha256:39b511e932c792599b62deafd134f67df5ff582cc26abf0127ffcbeefbc8238b
+      - image: gcr.io/knative-nightly/knative.dev/net-kourier/cmd/kourier@sha256:01cfb84279d80a467b761ea26c98e0072e2cb23a3de8e36597eb2ba5a970589e
         imagePullPolicy: Always
         name: kourier-control
         env: