Repository: kumahq/kuma
Pull request #1642 (2021-03-07 21:05:01)

chore(kuma-cp) keep backward compatibility with Kuma DP 1.0.x
### Summary

Fix compatibility issue with this scenario:
* Use Kuma CP 1.0.8 and Kuma DP 1.0.8
* Upgrade Kuma CP to 1.1.x (DP still works and is on V2)
* Restart Kuma DP 1.0.8 (this will fetch V3 config which is not compatible with Envoy 1.16.x)

This would not be a problem on K8S since when you update CP, the next DP restart will spawn a new Kuma DP.

This PR changes the code to use Envoy's deprecated settings in 1.17.x to keep compatibility with Kuma DP 1.0.x (Envoy 1.16.x).

Another solution would be to
* Put DP version in `DataplaneMetadata` structure
* Change interface of all `Configure(X)` of envoy configurers to `Configure(X, EnvoyVersion)`
* Use proper Envoy settings depending on the Envoy version

This requires a refactor so I implemented a simpler solution at the cost of some warnings in 1.1.0.

I also added Universal E2E test that fetches "old" Kuma DP version and connects to the new CP. This test will require an internet connection to Bintray.

### Documentation

- [X] No docs



Patch:
diff --git a/api/go.mod b/api/go.mod
index c46fda35a..7068f9ec4 100644
--- a/api/go.mod
+++ b/api/go.mod
@@ -7,8 +7,8 @@ require (
 	github.com/envoyproxy/protoc-gen-validate v0.4.1
 	github.com/ghodss/yaml v1.0.0
 	github.com/golang/protobuf v1.4.3
-	github.com/onsi/ginkgo v1.15.0
-	github.com/onsi/gomega v1.10.5
+	github.com/onsi/ginkgo v1.15.1
+	github.com/onsi/gomega v1.11.0
 	github.com/pkg/errors v0.9.1
 	google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013
 	google.golang.org/grpc v1.36.0
diff --git a/api/go.sum b/api/go.sum
index c42648a87..0238dbce5 100644
--- a/api/go.sum
+++ b/api/go.sum
@@ -44,14 +44,16 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 github.com/lyft/protoc-gen-star v0.5.1/go.mod h1:9toiA3cC7z5uVbODF7kEQ91Xn7XNFkVUl+SrEe+ZORU=
 github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4=
-github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
+github.com/onsi/ginkgo v1.15.1 h1:DsXNrKujDlkMS9Rsxmd+Fg7S6Kc5lhE+qX8tY6laOxc=
+github.com/onsi/ginkgo v1.15.1/go.mod h1:Dd6YFfwBW84ETqqtL0CPyPXillHgY6XhQH3uuCCTr/o=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ=
-github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
+github.com/onsi/gomega v1.11.0 h1:+CqWgvj0OZycCaqclBD1pxKHAU+tOkHmQIWvDHq2aug=
+github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -155,6 +157,8 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/go.mod b/go.mod
index a4308ed74..4cd226bce 100644
--- a/go.mod
+++ b/go.mod
@@ -29,8 +29,8 @@ require (
 	github.com/kumahq/kuma/pkg/transparentproxy/istio v0.0.0-00010101000000-000000000000
 	github.com/lib/pq v1.9.0
 	github.com/miekg/dns v1.1.40
-	github.com/onsi/ginkgo v1.15.0
-	github.com/onsi/gomega v1.10.5
+	github.com/onsi/ginkgo v1.15.1
+	github.com/onsi/gomega v1.11.0
 	github.com/patrickmn/go-cache v2.1.0+incompatible
 	github.com/pkg/errors v0.9.1
 	github.com/prometheus/client_golang v1.9.0
@@ -42,7 +42,7 @@ require (
 	github.com/slok/go-http-metrics v0.9.0
 	github.com/spf13/cobra v1.0.0
 	github.com/spiffe/go-spiffe v0.0.0-20190820222348-6adcf1eecbcc
-	github.com/spiffe/spire v0.12.0
+	github.com/spiffe/spire v0.12.1
 	github.com/spiffe/spire/proto/spire v0.12.0 // indirect
 	go.uber.org/multierr v1.6.0
 	go.uber.org/zap v1.13.0
diff --git a/go.sum b/go.sum
index eef14857f..07e876a97 100644
--- a/go.sum
+++ b/go.sum
@@ -872,6 +872,8 @@ github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:
 github.com/nwaples/rardecode v1.0.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
 github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
 github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=
 github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
@@ -891,6 +893,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108
 github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
 github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4=
 github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
+github.com/onsi/ginkgo v1.15.1 h1:DsXNrKujDlkMS9Rsxmd+Fg7S6Kc5lhE+qX8tY6laOxc=
+github.com/onsi/ginkgo v1.15.1/go.mod h1:Dd6YFfwBW84ETqqtL0CPyPXillHgY6XhQH3uuCCTr/o=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
@@ -902,6 +906,8 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ=
 github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
+github.com/onsi/gomega v1.11.0 h1:+CqWgvj0OZycCaqclBD1pxKHAU+tOkHmQIWvDHq2aug=
+github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg=
 github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
 github.com/open-policy-agent/opa v0.8.2/go.mod h1:rlfeSeHuZmMEpmrcGla42AjkOUjP4rGIpS96H12un3o=
 github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
@@ -1096,8 +1102,8 @@ github.com/spiffe/go-spiffe v0.0.0-20190820222348-6adcf1eecbcc h1:YeGvOZLHZxE8nr
 github.com/spiffe/go-spiffe v0.0.0-20190820222348-6adcf1eecbcc/go.mod h1:HyNeJnVYkDyQgB2qcSPxVYkAA2F3lQu51bDxNpFcKxY=
 github.com/spiffe/go-spiffe/v2 v2.0.0-beta.4 h1:tF4to8mhz24XGez/Vn9YPdmKrhg50M+zLGt1cbGuZbI=
 github.com/spiffe/go-spiffe/v2 v2.0.0-beta.4/go.mod h1:TEfgrEcyFhuSuvqohJt6IxENUNeHfndWCCV1EX7UaVk=
-github.com/spiffe/spire v0.12.0 h1:6NRPDVaTx5aErrrgSCQSYdG8o91M5mEshPRKW7xjG/4=
-github.com/spiffe/spire v0.12.0/go.mod h1:DRlFbPnrxPP1BO/+G6tFAiBStuArejV8sWDg5E+6nlY=
+github.com/spiffe/spire v0.12.1 h1:E+fGKRXd2Ojp7/9FESk18dYP5ZDdu5miDQA4jfAM7/g=
+github.com/spiffe/spire v0.12.1/go.mod h1:DRlFbPnrxPP1BO/+G6tFAiBStuArejV8sWDg5E+6nlY=
 github.com/spiffe/spire/proto/spire v0.10.1/go.mod h1:QmfLOnjxfc4o9KAe1f8bwYX3WcMLWSiKljTEHdGNFYU=
 github.com/spiffe/spire/proto/spire v0.12.0 h1:5juqJwMoKsbBbnTlSlKGAwJXZ3OhE261kwbTv28PowI=
 github.com/spiffe/spire/proto/spire v0.12.0/go.mod h1:oq/86U6YwjQMTUfRyBWc3+BBDcUusYlVXW6QAXziUME=
diff --git a/pkg/plugins/resources/k8s/native/go.mod b/pkg/plugins/resources/k8s/native/go.mod
index 6f3227327..d65019ed8 100644
--- a/pkg/plugins/resources/k8s/native/go.mod
+++ b/pkg/plugins/resources/k8s/native/go.mod
@@ -6,8 +6,8 @@ require (
 	github.com/go-logr/logr v0.1.0
 	github.com/golang/protobuf v1.4.3
 	github.com/kumahq/kuma/api v0.0.0-00010101000000-000000000000
-	github.com/onsi/ginkgo v1.15.0
-	github.com/onsi/gomega v1.10.5
+	github.com/onsi/ginkgo v1.15.1
+	github.com/onsi/gomega v1.11.0
 	github.com/pkg/errors v0.9.1
 	golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb
 	k8s.io/apimachinery v0.18.14
diff --git a/pkg/plugins/resources/k8s/native/go.sum b/pkg/plugins/resources/k8s/native/go.sum
index 02a402b34..2a06eb9f2 100644
--- a/pkg/plugins/resources/k8s/native/go.sum
+++ b/pkg/plugins/resources/k8s/native/go.sum
@@ -240,6 +240,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW
 github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
 github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
 github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -247,12 +249,16 @@ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4=
 github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
+github.com/onsi/ginkgo v1.15.1 h1:DsXNrKujDlkMS9Rsxmd+Fg7S6Kc5lhE+qX8tY6laOxc=
+github.com/onsi/ginkgo v1.15.1/go.mod h1:Dd6YFfwBW84ETqqtL0CPyPXillHgY6XhQH3uuCCTr/o=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ=
 github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
+github.com/onsi/gomega v1.11.0 h1:+CqWgvj0OZycCaqclBD1pxKHAU+tOkHmQIWvDHq2aug=
+github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg=
 github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
@@ -490,6 +496,8 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
diff --git a/pkg/xds/envoy/clusters/v3/http2_configurer.go b/pkg/xds/envoy/clusters/v3/http2_configurer.go
index 84cff553d..d2a05773b 100644
--- a/pkg/xds/envoy/clusters/v3/http2_configurer.go
+++ b/pkg/xds/envoy/clusters/v3/http2_configurer.go
@@ -3,10 +3,6 @@ package clusters
 import (
 	envoy_cluster "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3"
 	envoy_core "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
-	envoy_upstream_http "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3"
-	"github.com/golang/protobuf/ptypes/any"
-
-	"github.com/kumahq/kuma/pkg/util/proto"
 )
 
 type Http2Configurer struct {
@@ -15,22 +11,25 @@ type Http2Configurer struct {
 var _ ClusterConfigurer = &Http2Configurer{}
 
 func (p *Http2Configurer) Configure(c *envoy_cluster.Cluster) error {
-	options := &envoy_upstream_http.HttpProtocolOptions{
-		UpstreamProtocolOptions: &envoy_upstream_http.HttpProtocolOptions_ExplicitHttpConfig_{
-			ExplicitHttpConfig: &envoy_upstream_http.HttpProtocolOptions_ExplicitHttpConfig{
-				ProtocolConfig: &envoy_upstream_http.HttpProtocolOptions_ExplicitHttpConfig_Http2ProtocolOptions{
-					Http2ProtocolOptions: &envoy_core.Http2ProtocolOptions{},
-				},
-			},
-		},
-	}
+	// nolint:staticcheck // keep deprecated options to be compatible with Envoy 1.16.x in Kuma 1.0.x
+	c.Http2ProtocolOptions = &envoy_core.Http2ProtocolOptions{}
 
-	pbst, err := proto.MarshalAnyDeterministic(options)
-	if err != nil {
-		return err
-	}
-	c.TypedExtensionProtocolOptions = map[string]*any.Any{
-		"envoy.extensions.upstreams.http.v3.HttpProtocolOptions": pbst,
-	}
+	// options := &envoy_upstream_http.HttpProtocolOptions{
+	// 	UpstreamProtocolOptions: &envoy_upstream_http.HttpProtocolOptions_ExplicitHttpConfig_{
+	// 		ExplicitHttpConfig: &envoy_upstream_http.HttpProtocolOptions_ExplicitHttpConfig{
+	// 			ProtocolConfig: &envoy_upstream_http.HttpProtocolOptions_ExplicitHttpConfig_Http2ProtocolOptions{
+	// 				Http2ProtocolOptions: &envoy_core.Http2ProtocolOptions{},
+	// 			},
+	// 		},
+	// 	},
+	// }
+	//
+	// pbst, err := proto.MarshalAnyDeterministic(options)
+	// if err != nil {
+	// 	return err
+	// }
+	// c.TypedExtensionProtocolOptions = map[string]*any.Any{
+	// 	"envoy.extensions.upstreams.http.v3.HttpProtocolOptions": pbst,
+	// }
 	return nil
 }
diff --git a/pkg/xds/envoy/clusters/v3/timeout_configurer.go b/pkg/xds/envoy/clusters/v3/timeout_configurer.go
index b32574bce..805bac4a9 100644
--- a/pkg/xds/envoy/clusters/v3/timeout_configurer.go
+++ b/pkg/xds/envoy/clusters/v3/timeout_configurer.go
@@ -5,13 +5,10 @@ import (
 
 	envoy_cluster "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3"
 	envoy_core "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
-	envoy_upstream_http "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3"
 	"github.com/golang/protobuf/ptypes"
-	"github.com/golang/protobuf/ptypes/any"
 
 	mesh_proto "github.com/kumahq/kuma/api/mesh/v1alpha1"
 	mesh_core "github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
-	"github.com/kumahq/kuma/pkg/util/proto"
 )
 
 const defaultConnectTimeout = 10 * time.Second
@@ -27,32 +24,42 @@ func (t *TimeoutConfigurer) Configure(cluster *envoy_cluster.Cluster) error {
 	cluster.ConnectTimeout = ptypes.DurationProto(t.Conf.GetConnectTimeoutOrDefault(defaultConnectTimeout))
 	switch t.Protocol {
 	case mesh_core.ProtocolHTTP, mesh_core.ProtocolHTTP2:
-		options := &envoy_upstream_http.HttpProtocolOptions{
-			CommonHttpProtocolOptions: &envoy_core.HttpProtocolOptions{
-				IdleTimeout: ptypes.DurationProto(t.Conf.GetHttp().GetIdleTimeout().AsDuration()),
-			},
-		}
-		pbst, err := proto.MarshalAnyDeterministic(options)
-		if err != nil {
-			return err
-		}
-		cluster.TypedExtensionProtocolOptions = map[string]*any.Any{
-			"envoy.extensions.upstreams.http.v3.HttpProtocolOptions": pbst,
+		// nolint:staticcheck // keep deprecated options to be compatible with Envoy 1.16.x in Kuma 1.0.x
+		cluster.CommonHttpProtocolOptions = &envoy_core.HttpProtocolOptions{
+			IdleTimeout: ptypes.DurationProto(t.Conf.GetHttp().GetIdleTimeout().AsDuration()),
 		}
+
+		// options := &envoy_upstream_http.HttpProtocolOptions{
+		// 	CommonHttpProtocolOptions: &envoy_core.HttpProtocolOptions{
+		// 		IdleTimeout: ptypes.DurationProto(t.Conf.GetHttp().GetIdleTimeout().AsDuration()),
+		// 	},
+		// }
+		// pbst, err := proto.MarshalAnyDeterministic(options)
+		// if err != nil {
+		// 	return err
+		// }
+		// cluster.TypedExtensionProtocolOptions = map[string]*any.Any{
+		// 	"envoy.extensions.upstreams.http.v3.HttpProtocolOptions": pbst,
+		// }
 	case mesh_core.ProtocolGRPC:
 		if maxStreamDuration := t.Conf.GetGrpc().GetMaxStreamDuration().AsDuration(); maxStreamDuration != 0 {
-			options := &envoy_upstream_http.HttpProtocolOptions{
-				CommonHttpProtocolOptions: &envoy_core.HttpProtocolOptions{
-					MaxStreamDuration: ptypes.DurationProto(maxStreamDuration),
-				},
-			}
-			pbst, err := proto.MarshalAnyDeterministic(options)
-			if err != nil {
-				return err
-			}
-			cluster.TypedExtensionProtocolOptions = map[string]*any.Any{
-				"envoy.extensions.upstreams.http.v3.HttpProtocolOptions": pbst,
+			// nolint:staticcheck // keep deprecated options to be compatible with Envoy 1.16.x in Kuma 1.0.x
+			cluster.CommonHttpProtocolOptions = &envoy_core.HttpProtocolOptions{
+				MaxStreamDuration: ptypes.DurationProto(maxStreamDuration),
 			}
+
+			// options := &envoy_upstream_http.HttpProtocolOptions{
+			// 	CommonHttpProtocolOptions: &envoy_core.HttpProtocolOptions{
+			// 		MaxStreamDuration: ptypes.DurationProto(maxStreamDuration),
+			// 	},
+			// }
+			// pbst, err := proto.MarshalAnyDeterministic(options)
+			// if err != nil {
+			// 	return err
+			// }
+			// cluster.TypedExtensionProtocolOptions = map[string]*any.Any{
+			// 	"envoy.extensions.upstreams.http.v3.HttpProtocolOptions": pbst,
+			// }
 		}
 	}
 	return nil
diff --git a/pkg/xds/envoy/listeners/v3/access_log_configurer.go b/pkg/xds/envoy/listeners/v3/access_log_configurer.go
index d4b20ca7c..077ea6714 100644
--- a/pkg/xds/envoy/listeners/v3/access_log_configurer.go
+++ b/pkg/xds/envoy/listeners/v3/access_log_configurer.go
@@ -109,16 +109,20 @@ func fileAccessLog(format *accesslog.AccessLogFormat, cfgStr *structpb.Struct) (
 	}
 
 	fileAccessLog := &access_loggers_file.FileAccessLog{
-		AccessLogFormat: &access_loggers_file.FileAccessLog_LogFormat{
-			LogFormat: &envoy_core.SubstitutionFormatString{
-				Format: &envoy_core.SubstitutionFormatString_TextFormatSource{
-					TextFormatSource: &envoy_core.DataSource{
-						Specifier: &envoy_core.DataSource_InlineString{
-							InlineString: format.String(),
-						},
-					},
-				},
-			},
+		// AccessLogFormat: &access_loggers_file.FileAccessLog_LogFormat{
+		// 	LogFormat: &envoy_core.SubstitutionFormatString{
+		// 		Format: &envoy_core.SubstitutionFormatString_TextFormatSource{
+		// 			TextFormatSource: &envoy_core.DataSource{
+		// 				Specifier: &envoy_core.DataSource_InlineString{
+		// 					InlineString: format.String(),
+		// 				},
+		// 			},
+		// 		},
+		// 	},
+		// },
+		AccessLogFormat: &access_loggers_file.FileAccessLog_Format{
+			// nolint:staticcheck // keep deprecated options to be compatible with Envoy 1.16.x in Kuma 1.0.x
+			Format: format.String(),
 		},
 		Path: cfg.Path,
 	}


Test patch:
diff --git a/mk/e2e.new.mk b/mk/e2e.new.mk
index 3d26a9e30..761644483 100644
--- a/mk/e2e.new.mk
+++ b/mk/e2e.new.mk
@@ -1,7 +1,7 @@
 K8SCLUSTERS = kuma-1 kuma-2
 K8SCLUSTERS_START_TARGETS = $(addprefix test/e2e/kind/start/cluster/, $(K8SCLUSTERS))
 K8SCLUSTERS_STOP_TARGETS  = $(addprefix test/e2e/kind/stop/cluster/, $(K8SCLUSTERS))
-API_VERSION ?= v2
+API_VERSION ?= v3
 
 KUMA_UNIVERSAL_DOCKER_IMAGE ?= kuma-universal
 KUMA_UNIVERSAL_DOCKERFILE ?= test/dockerfiles/Dockerfile.universal
diff --git a/pkg/xds/envoy/clusters/v3/http2_configurer_test.go b/pkg/xds/envoy/clusters/v3/http2_configurer_test.go
index ab84a87ca..3d84c1cc0 100644
--- a/pkg/xds/envoy/clusters/v3/http2_configurer_test.go
+++ b/pkg/xds/envoy/clusters/v3/http2_configurer_test.go
@@ -13,11 +13,7 @@ var _ = Describe("Http2Configurer", func() {
 
 	It("should generate proper Envoy config", func() {
 		// given
-		expected := `typedExtensionProtocolOptions:
-        envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-          '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-          explicitHttpConfig:
-            http2ProtocolOptions: {}`
+		expected := `http2ProtocolOptions: {}`
 
 		// when
 		cluster, err := clusters.NewClusterBuilder(envoy.APIV3).
diff --git a/pkg/xds/envoy/listeners/v3/http_access_log_configurer_test.go b/pkg/xds/envoy/listeners/v3/http_access_log_configurer_test.go
index 9b9ff2524..3c3019693 100644
--- a/pkg/xds/envoy/listeners/v3/http_access_log_configurer_test.go
+++ b/pkg/xds/envoy/listeners/v3/http_access_log_configurer_test.go
@@ -125,11 +125,9 @@ var _ = Describe("HttpAccessLogConfigurer", func() {
                   - name: envoy.access_loggers.file
                     typedConfig:
                       '@type': type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
-                      logFormat:
-                        textFormatSource:
-                          inlineString: |+
-                            [%START_TIME%] demo "%REQ(:method)% %REQ(x-envoy-original-path?:path)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(x-envoy-upstream-service-time)% "%REQ(x-forwarded-for)%" "%REQ(user-agent)%" "%REQ(x-request-id)%" "%REQ(:authority)%" "web" "backend" "192.168.0.1" "%UPSTREAM_HOST%"
-            
+                      format: |+
+                        [%START_TIME%] demo "%REQ(:method)% %REQ(x-envoy-original-path?:path)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(x-envoy-upstream-service-time)% "%REQ(x-forwarded-for)%" "%REQ(user-agent)%" "%REQ(x-request-id)%" "%REQ(:authority)%" "web" "backend" "192.168.0.1" "%UPSTREAM_HOST%"
+
                       path: /tmp/log
                   httpFilters:
                   - name: envoy.filters.http.router
diff --git a/pkg/xds/envoy/listeners/v3/network_access_log_configurer_test.go b/pkg/xds/envoy/listeners/v3/network_access_log_configurer_test.go
index cb379c401..f123d6912 100644
--- a/pkg/xds/envoy/listeners/v3/network_access_log_configurer_test.go
+++ b/pkg/xds/envoy/listeners/v3/network_access_log_configurer_test.go
@@ -111,8 +111,6 @@ var _ = Describe("NetworkAccessLogConfigurer", func() {
 				}),
 			},
 			expected: `
-            name: outbound:127.0.0.1:5432
-            trafficDirection: OUTBOUND
             address:
               socketAddress:
                 address: 127.0.0.1
@@ -126,14 +124,14 @@ var _ = Describe("NetworkAccessLogConfigurer", func() {
                   - name: envoy.access_loggers.file
                     typedConfig:
                       '@type': type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
-                      logFormat:
-                        textFormatSource:
-                          inlineString: |+
-                            [%START_TIME%] %RESPONSE_FLAGS% demo 192.168.0.1(backend)->%UPSTREAM_HOST%(db) took %DURATION%ms, sent %BYTES_SENT% bytes, received: %BYTES_RECEIVED% bytes
-            
+                      format: |+
+                        [%START_TIME%] %RESPONSE_FLAGS% demo 192.168.0.1(backend)->%UPSTREAM_HOST%(db) took %DURATION%ms, sent %BYTES_SENT% bytes, received: %BYTES_RECEIVED% bytes
+
                       path: /tmp/log
                   cluster: db
                   statPrefix: db
+            name: outbound:127.0.0.1:5432
+            trafficDirection: OUTBOUND
 `,
 		}),
 		Entry("basic tcp_proxy with tcp access log", testCase{
diff --git a/pkg/xds/generator/testdata/outbound-proxy/03.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/03.envoy.golden.yaml
index fb5306d3d..011bb4132 100644
--- a/pkg/xds/generator/testdata/outbound-proxy/03.envoy.golden.yaml
+++ b/pkg/xds/generator/testdata/outbound-proxy/03.envoy.golden.yaml
@@ -151,22 +151,21 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     lbPolicy: RANDOM
     name: api-grpc
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: api-http
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
+    commonHttpProtocolOptions:
+      idleTimeout: 0s
     connectTimeout: 10s
     edsClusterConfig:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     name: api-http
     outlierDetection:
       enforcingConsecutive5xx: 100
@@ -175,19 +174,17 @@ resources:
       enforcingFailurePercentage: 0
       enforcingSuccessRate: 0
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: api-http2
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
+    commonHttpProtocolOptions:
+      idleTimeout: 0s
     connectTimeout: 10s
     edsClusterConfig:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     lbPolicy: RING_HASH
     name: api-http2
     ringHashLbConfig:
@@ -195,11 +192,6 @@ resources:
       maximumRingSize: "1024"
       minimumRingSize: "64"
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: api-tcp
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
@@ -208,16 +200,12 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     lbPolicy: LEAST_REQUEST
     leastRequestLbConfig:
       choiceCount: 4
     name: api-tcp
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: backend
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
@@ -226,14 +214,10 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     lbPolicy: MAGLEV
     name: backend
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: db
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
@@ -242,6 +226,7 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     lbSubsetConfig:
       fallbackPolicy: ANY_ENDPOINT
       subsetSelectors:
@@ -250,11 +235,6 @@ resources:
         - role
     name: db
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: outbound:127.0.0.1:18080
   resource:
     '@type': type.googleapis.com/envoy.config.listener.v3.Listener
@@ -287,10 +267,8 @@ resources:
           - name: envoy.access_loggers.file
             typedConfig:
               '@type': type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
-              logFormat:
-                textFormatSource:
-                  inlineString: |+
-                    [%START_TIME%] mesh1 "%REQ(:method)% %REQ(x-envoy-original-path?:path)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(x-envoy-upstream-service-time)% "%REQ(x-forwarded-for)%" "%REQ(user-agent)%" "%REQ(x-request-id)%" "%REQ(:authority)%" "gateway" "api-http" "10.0.0.1" "%UPSTREAM_HOST%"
+              format: |+
+                [%START_TIME%] mesh1 "%REQ(:method)% %REQ(x-envoy-original-path?:path)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(x-envoy-upstream-service-time)% "%REQ(x-forwarded-for)%" "%REQ(user-agent)%" "%REQ(x-request-id)%" "%REQ(:authority)%" "gateway" "api-http" "10.0.0.1" "%UPSTREAM_HOST%"
 
               path: /var/log
           httpFilters:
diff --git a/pkg/xds/generator/testdata/outbound-proxy/04.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/04.envoy.golden.yaml
index 67f61262e..7da0e2e3e 100644
--- a/pkg/xds/generator/testdata/outbound-proxy/04.envoy.golden.yaml
+++ b/pkg/xds/generator/testdata/outbound-proxy/04.envoy.golden.yaml
@@ -110,11 +110,14 @@ resources:
 - name: api-http
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
+    commonHttpProtocolOptions:
+      idleTimeout: 0s
     connectTimeout: 10s
     edsClusterConfig:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     name: api-http
     outlierDetection:
       enforcingConsecutive5xx: 100
@@ -163,11 +166,6 @@ resources:
               resourceApiVersion: V3
         sni: api-http{mesh=mesh1}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: api-tcp
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
@@ -176,6 +174,7 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     lbPolicy: LEAST_REQUEST
     leastRequestLbConfig:
       choiceCount: 4
@@ -221,11 +220,6 @@ resources:
               resourceApiVersion: V3
         sni: api-tcp{mesh=mesh1}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: backend
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
@@ -234,6 +228,7 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     lbPolicy: MAGLEV
     name: backend
     transportSocket:
@@ -277,11 +272,6 @@ resources:
               resourceApiVersion: V3
         sni: backend{mesh=mesh1}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: db
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
@@ -290,6 +280,7 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     lbSubsetConfig:
       fallbackPolicy: ANY_ENDPOINT
       subsetSelectors:
@@ -385,11 +376,6 @@ resources:
                 resourceApiVersion: V3
           sni: db{mesh=mesh1,role=replica}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: outbound:127.0.0.1:18080
   resource:
     '@type': type.googleapis.com/envoy.config.listener.v3.Listener
@@ -424,10 +410,8 @@ resources:
           - name: envoy.access_loggers.file
             typedConfig:
               '@type': type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
-              logFormat:
-                textFormatSource:
-                  inlineString: |+
-                    [%START_TIME%] mesh1 "%REQ(:method)% %REQ(x-envoy-original-path?:path)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(x-envoy-upstream-service-time)% "%REQ(x-forwarded-for)%" "%REQ(user-agent)%" "%REQ(x-request-id)%" "%REQ(:authority)%" "web" "api-http" "10.0.0.1" "%UPSTREAM_HOST%"
+              format: |+
+                [%START_TIME%] mesh1 "%REQ(:method)% %REQ(x-envoy-original-path?:path)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(x-envoy-upstream-service-time)% "%REQ(x-forwarded-for)%" "%REQ(user-agent)%" "%REQ(x-request-id)%" "%REQ(:authority)%" "web" "api-http" "10.0.0.1" "%UPSTREAM_HOST%"
 
               path: /var/log
           httpFilters:
diff --git a/pkg/xds/generator/testdata/outbound-proxy/05.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/05.envoy.golden.yaml
index 432ce21eb..c4367bd2b 100644
--- a/pkg/xds/generator/testdata/outbound-proxy/05.envoy.golden.yaml
+++ b/pkg/xds/generator/testdata/outbound-proxy/05.envoy.golden.yaml
@@ -2,6 +2,8 @@ resources:
 - name: es
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
+    commonHttpProtocolOptions:
+      idleTimeout: 0s
     connectTimeout: 10s
     lbSubsetConfig:
       fallbackPolicy: ANY_ENDPOINT
@@ -27,11 +29,6 @@ resources:
                 kuma.io/protocol: http
     name: es
     type: STRICT_DNS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        commonHttpProtocolOptions:
-          idleTimeout: 0s
 - name: outbound:127.0.0.1:18081
   resource:
     '@type': type.googleapis.com/envoy.config.listener.v3.Listener
diff --git a/pkg/xds/generator/testdata/outbound-proxy/06.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/06.envoy.golden.yaml
index 3eef4191b..9de5a3eb2 100644
--- a/pkg/xds/generator/testdata/outbound-proxy/06.envoy.golden.yaml
+++ b/pkg/xds/generator/testdata/outbound-proxy/06.envoy.golden.yaml
@@ -2,7 +2,10 @@ resources:
 - name: es2
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
+    commonHttpProtocolOptions:
+      idleTimeout: 0s
     connectTimeout: 10s
+    http2ProtocolOptions: {}
     lbSubsetConfig:
       fallbackPolicy: ANY_ENDPOINT
       subsetSelectors:
@@ -27,11 +30,6 @@ resources:
                 kuma.io/protocol: http2
     name: es2
     type: STRICT_DNS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: outbound:127.0.0.1:18082
   resource:
     '@type': type.googleapis.com/envoy.config.listener.v3.Listener
diff --git a/pkg/xds/generator/testdata/outbound-proxy/cluster-dots.envoy.golden.yaml b/pkg/xds/generator/testdata/outbound-proxy/cluster-dots.envoy.golden.yaml
index 83b958eca..c729ab488 100644
--- a/pkg/xds/generator/testdata/outbound-proxy/cluster-dots.envoy.golden.yaml
+++ b/pkg/xds/generator/testdata/outbound-proxy/cluster-dots.envoy.golden.yaml
@@ -24,13 +24,9 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     name: backend.kuma-system
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: db
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
@@ -39,6 +35,7 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     lbSubsetConfig:
       fallbackPolicy: ANY_ENDPOINT
       subsetSelectors:
@@ -47,11 +44,6 @@ resources:
         - version
     name: db
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: outbound:127.0.0.1:18080
   resource:
     '@type': type.googleapis.com/envoy.config.listener.v3.Listener
diff --git a/pkg/xds/generator/testdata/profile-source/1-envoy-config.golden.yaml b/pkg/xds/generator/testdata/profile-source/1-envoy-config.golden.yaml
index a2c50908a..baa7bfeb5 100644
--- a/pkg/xds/generator/testdata/profile-source/1-envoy-config.golden.yaml
+++ b/pkg/xds/generator/testdata/profile-source/1-envoy-config.golden.yaml
@@ -37,6 +37,7 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     name: db
     transportSocket:
       name: envoy.transport_sockets.tls
@@ -79,11 +80,6 @@ resources:
               resourceApiVersion: V3
         sni: db{mesh=demo}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: elastic
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
@@ -98,6 +94,7 @@ resources:
       tcpHealthCheck: {}
       timeout: 4s
       unhealthyThreshold: 3
+    http2ProtocolOptions: {}
     name: elastic
     transportSocket:
       name: envoy.transport_sockets.tls
@@ -140,11 +137,6 @@ resources:
               resourceApiVersion: V3
         sni: elastic{mesh=demo}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: kuma:envoy:admin
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
diff --git a/pkg/xds/generator/testdata/profile-source/2-envoy-config.golden.yaml b/pkg/xds/generator/testdata/profile-source/2-envoy-config.golden.yaml
index 2f1d5a083..1e85bd7b9 100644
--- a/pkg/xds/generator/testdata/profile-source/2-envoy-config.golden.yaml
+++ b/pkg/xds/generator/testdata/profile-source/2-envoy-config.golden.yaml
@@ -37,6 +37,7 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     name: db
     transportSocket:
       name: envoy.transport_sockets.tls
@@ -79,11 +80,6 @@ resources:
               resourceApiVersion: V3
         sni: db{mesh=demo}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: elastic
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
@@ -98,6 +94,7 @@ resources:
       tcpHealthCheck: {}
       timeout: 4s
       unhealthyThreshold: 3
+    http2ProtocolOptions: {}
     name: elastic
     transportSocket:
       name: envoy.transport_sockets.tls
@@ -140,11 +137,6 @@ resources:
               resourceApiVersion: V3
         sni: elastic{mesh=demo}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: inbound:passthrough
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
diff --git a/pkg/xds/generator/testdata/profile-source/3-envoy-config.golden.yaml b/pkg/xds/generator/testdata/profile-source/3-envoy-config.golden.yaml
index a9a6dffd3..075b61f97 100644
--- a/pkg/xds/generator/testdata/profile-source/3-envoy-config.golden.yaml
+++ b/pkg/xds/generator/testdata/profile-source/3-envoy-config.golden.yaml
@@ -37,6 +37,7 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     name: db
     transportSocket:
       name: envoy.transport_sockets.tls
@@ -79,11 +80,6 @@ resources:
               resourceApiVersion: V3
         sni: db{mesh=demo}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: elastic
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
@@ -98,6 +94,7 @@ resources:
       tcpHealthCheck: {}
       timeout: 4s
       unhealthyThreshold: 3
+    http2ProtocolOptions: {}
     name: elastic
     transportSocket:
       name: envoy.transport_sockets.tls
@@ -140,11 +137,6 @@ resources:
               resourceApiVersion: V3
         sni: elastic{mesh=demo}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: kuma:envoy:admin
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
diff --git a/pkg/xds/generator/testdata/profile-source/4-envoy-config.golden.yaml b/pkg/xds/generator/testdata/profile-source/4-envoy-config.golden.yaml
index 33c2eb8e5..0807313a1 100644
--- a/pkg/xds/generator/testdata/profile-source/4-envoy-config.golden.yaml
+++ b/pkg/xds/generator/testdata/profile-source/4-envoy-config.golden.yaml
@@ -37,6 +37,7 @@ resources:
       edsConfig:
         ads: {}
         resourceApiVersion: V3
+    http2ProtocolOptions: {}
     name: db
     transportSocket:
       name: envoy.transport_sockets.tls
@@ -79,11 +80,6 @@ resources:
               resourceApiVersion: V3
         sni: db{mesh=demo}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: elastic
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
@@ -98,6 +94,7 @@ resources:
       tcpHealthCheck: {}
       timeout: 4s
       unhealthyThreshold: 3
+    http2ProtocolOptions: {}
     name: elastic
     transportSocket:
       name: envoy.transport_sockets.tls
@@ -140,11 +137,6 @@ resources:
               resourceApiVersion: V3
         sni: elastic{mesh=demo}
     type: EDS
-    typedExtensionProtocolOptions:
-      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
-        '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
-        explicitHttpConfig:
-          http2ProtocolOptions: {}
 - name: inbound:passthrough
   resource:
     '@type': type.googleapis.com/envoy.config.cluster.v3.Cluster
diff --git a/pkg/xds/generator/testdata/transparent-proxy/03.envoy.golden.yaml b/pkg/xds/generator/testdata/transparent-proxy/03.envoy.golden.yaml
index 6c2273875..d77af0855 100644
--- a/pkg/xds/generator/testdata/transparent-proxy/03.envoy.golden.yaml
+++ b/pkg/xds/generator/testdata/transparent-proxy/03.envoy.golden.yaml
@@ -52,10 +52,8 @@ resources:
           - name: envoy.access_loggers.file
             typedConfig:
               '@type': type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
-              logFormat:
-                textFormatSource:
-                  inlineString: |+
-                    [%START_TIME%] %RESPONSE_FLAGS% default (unknown)->%UPSTREAM_HOST%(external) took %DURATION%ms, sent %BYTES_SENT% bytes, received: %BYTES_RECEIVED% bytes
+              format: |+
+                [%START_TIME%] %RESPONSE_FLAGS% default (unknown)->%UPSTREAM_HOST%(external) took %DURATION%ms, sent %BYTES_SENT% bytes, received: %BYTES_RECEIVED% bytes
 
               path: /var/log
           cluster: outbound:passthrough
diff --git a/test/e2e/compatibility/compatibility_suite_test.go b/test/e2e/compatibility/compatibility_suite_test.go
new file mode 100644
index 000000000..6937db660
--- /dev/null
+++ b/test/e2e/compatibility/compatibility_suite_test.go
@@ -0,0 +1,36 @@
+package compatibility_test
+
+import (
+	"testing"
+
+	ginkgo_config "github.com/onsi/ginkgo/config"
+
+	"github.com/kumahq/kuma/test/framework"
+
+	"github.com/go-logr/logr"
+	logf "sigs.k8s.io/controller-runtime/pkg/log"
+	"sigs.k8s.io/controller-runtime/pkg/log/zap"
+
+	"github.com/kumahq/kuma/pkg/core"
+
+	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+)
+
+func TestE2ECompatibility(t *testing.T) {
+	if framework.IsK8sClustersStarted() {
+		RegisterFailHandler(Fail)
+		RunSpecs(t, "E2E Deploy Suite")
+	} else {
+		t.SkipNow()
+	}
+}
+
+var _ = BeforeSuite(func() {
+	core.SetLogger = func(l logr.Logger) {}
+	logf.SetLogger(zap.LoggerTo(GinkgoWriter, true))
+})
+
+func ShouldSkipCleanup() bool {
+	return CurrentGinkgoTestDescription().Failed && ginkgo_config.GinkgoConfig.FailFast
+}
diff --git a/test/e2e/compatibility/dp_compatibility_universal_test.go b/test/e2e/compatibility/dp_compatibility_universal_test.go
new file mode 100644
index 000000000..0d92c54d8
--- /dev/null
+++ b/test/e2e/compatibility/dp_compatibility_universal_test.go
@@ -0,0 +1,53 @@
+package compatibility_test
+
+import (
+	"github.com/gruntwork-io/terratest/modules/retry"
+	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+
+	"github.com/kumahq/kuma/pkg/config/core"
+	. "github.com/kumahq/kuma/test/framework"
+)
+
+var _ = Describe("Test Universal Compatibility", func() {
+
+	var cluster Cluster
+	var deployOptsFuncs []DeployOptionsFunc
+
+	BeforeEach(func() {
+		cluster = NewUniversalCluster(NewTestingT(), Kuma1, Verbose)
+		deployOptsFuncs = []DeployOptionsFunc{}
+
+		err := NewClusterSetup().
+			Install(Kuma(core.Standalone, deployOptsFuncs...)).
+			Setup(cluster)
+		Expect(err).ToNot(HaveOccurred())
+		err = cluster.VerifyKuma()
+		Expect(err).ToNot(HaveOccurred())
+
+		echoServerToken, err := cluster.GetKuma().GenerateDpToken("default", "echo-server_kuma-test_svc_8080")
+		Expect(err).ToNot(HaveOccurred())
+		demoClientToken, err := cluster.GetKuma().GenerateDpToken("default", "demo-client")
+		Expect(err).ToNot(HaveOccurred())
+
+		err = EchoServerUniversal(AppModeEchoServer, "default", "universal", echoServerToken, WithDPVersion("1.0.8"))(cluster)
+		Expect(err).ToNot(HaveOccurred())
+		err = DemoClientUniversal(AppModeDemoClient, "default", demoClientToken, WithDPVersion("1.0.8"))(cluster)
+		Expect(err).ToNot(HaveOccurred())
+	})
+
+	AfterEach(func() {
+		if ShouldSkipCleanup() {
+			return
+		}
+		Expect(cluster.DeleteKuma(deployOptsFuncs...)).To(Succeed())
+		Expect(cluster.DismissCluster()).To(Succeed())
+	})
+
+	It("client should access server", func() {
+		retry.DoWithRetry(cluster.GetTesting(), "check communication between services", DefaultRetries, DefaultTimeout, func() (string, error) {
+			_, _, err := cluster.Exec("", "", "demo-client", "curl", "-v", "-m", "3", "--fail", "localhost:4001")
+			return "", err
+		})
+	})
+})
diff --git a/test/e2e/compatibility/foo.go b/test/e2e/compatibility/foo.go
new file mode 100644
index 000000000..f76975900
--- /dev/null
+++ b/test/e2e/compatibility/foo.go
@@ -0,0 +1,3 @@
+package compatibility
+
+// Keep this one empty here to make go test happy that there are non-test files in this folder
diff --git a/test/framework/interface.go b/test/framework/interface.go
index 349eb0a25..2cf7bc400 100644
--- a/test/framework/interface.go
+++ b/test/framework/interface.go
@@ -46,6 +46,7 @@ type deployOptions struct {
 	transparent bool
 	protocol    string
 	mesh        string
+	dpVersion   string
 }
 
 type DeployOptionsFunc func(*deployOptions)
@@ -92,6 +93,13 @@ func WithGlobalAddress(address string) DeployOptionsFunc {
 	}
 }
 
+// WithDPVersion only works with Universal now
+func WithDPVersion(version string) DeployOptionsFunc {
+	return func(o *deployOptions) {
+		o.dpVersion = version
+	}
+}
+
 // WithCPReplicas works only with HELM now
 func WithCPReplicas(cpReplicas int) DeployOptionsFunc {
 	return func(o *deployOptions) {
diff --git a/test/framework/universal_app.go b/test/framework/universal_app.go
index 47b9c8568..50970c0cf 100644
--- a/test/framework/universal_app.go
+++ b/test/framework/universal_app.go
@@ -283,6 +283,59 @@ func (s *UniversalApp) CreateMainApp(env []string, args []string) {
 	s.mainApp = NewSshApp(s.verbose, s.ports[sshPort], env, args)
 }
 
+func (s *UniversalApp) OverrideDpVersion(version string) error {
+	// It is important to store installation package in /tmp/kuma/, not /tmp/ otherwise root was taking over /tmp/ and Kuma DP could not store /tmp files
+	err := NewSshApp(s.verbose, s.ports[sshPort], []string{}, []string{
+		"wget",
+		fmt.Sprintf("https://kong.bintray.com/kuma/kuma-%s-ubuntu-amd64.tar.gz", version),
+		"-O",
+		fmt.Sprintf("/tmp/kuma-%s-ubuntu-amd64.tar.gz", version),
+	}).Run()
+	if err != nil {
+		return err
+	}
+
+	err = NewSshApp(s.verbose, s.ports[sshPort], []string{}, []string{
+		"mkdir",
+		"-p",
+		"/tmp/kuma/",
+	}).Run()
+	if err != nil {
+		return err
+	}
+
+	err = NewSshApp(s.verbose, s.ports[sshPort], []string{}, []string{
+		"tar",
+		"xvzf",
+		fmt.Sprintf("/tmp/kuma-%s-ubuntu-amd64.tar.gz", version),
+		"-C",
+		"/tmp/kuma/",
+	}).Run()
+	if err != nil {
+		return err
+	}
+
+	err = NewSshApp(s.verbose, s.ports[sshPort], []string{}, []string{
+		"cp",
+		fmt.Sprintf("/tmp/kuma/kuma-%s/bin/kuma-dp", version),
+		"/usr/bin/kuma-dp",
+	}).Run()
+	if err != nil {
+		return err
+	}
+
+	err = NewSshApp(s.verbose, s.ports[sshPort], []string{}, []string{
+		"cp",
+		fmt.Sprintf("/tmp/kuma/kuma-%s/bin/envoy", version),
+		"/usr/local/bin/envoy",
+	}).Run()
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
 func (s *UniversalApp) CreateDP(token, cpAddress, appname, ip, dpyaml string) {
 	// create the token file on the app container
 	err := NewSshApp(s.verbose, s.ports[sshPort], []string{}, []string{"printf ", "\"" + token + "\"", ">", "/kuma/token-" + appname}).Run()
diff --git a/test/framework/universal_cluster.go b/test/framework/universal_cluster.go
index 8a9505375..9e9167abb 100644
--- a/test/framework/universal_cluster.go
+++ b/test/framework/universal_cluster.go
@@ -179,6 +179,12 @@ func (c *UniversalCluster) DeployApp(fs ...DeployOptionsFunc) error {
 
 	ip := app.ip
 
+	if opts.dpVersion != "" {
+		if err := app.OverrideDpVersion(opts.dpVersion); err != nil {
+			return err
+		}
+	}
+
 	err = c.CreateDP(app, opts.name, ip, dpyaml, token)
 	if err != nil {
 		return err