From 7d074617346eb4881acc2768c43150e391ae7282 Mon Sep 17 00:00:00 2001 From: nmittler Date: Sat, 6 Apr 2019 08:04:18 -0700 Subject: [PATCH 1/3] [Test Framework] Expand capability of Echo component The Echo component API was essentially a rewrite of the Apps component, but allows the test author more flexibility in the behavior of the application instances. This PR merges the functionality of the Apps component (including running on Kubernetes as well as running natively with a sidecar) into the Echo component. Once this lands, we can remove the Apps component entirely. --- pkg/test/application/echo/client.go | 80 +- pkg/test/envoy/admin_util.go | 101 +- pkg/test/framework/components/echo/call.go | 67 + .../framework/components/echo/common/call.go | 135 + .../components/echo/common/config.go | 100 + .../framework/components/echo/common/envoy.go | 149 + .../components/echo/common/envoy_test.go | 193 + .../components/echo/common/portgen.go | 114 + .../echo/common/testdata/config_dump.json | 12179 ++++++++++++++++ pkg/test/framework/components/echo/config.go | 79 + pkg/test/framework/components/echo/echo.go | 92 + .../components/echo/echoboot/echoboot.go | 50 + .../framework/components/echo/instance.go | 162 - .../components/echo/kube/deployment.go | 184 + .../components/echo/kube/instance.go | 265 + .../framework/components/echo/kube/sidecar.go | 87 + .../components/echo/kube/workload.go | 95 + pkg/test/framework/components/echo/native.go | 238 - .../components/echo/native/appfilter.go | 99 + .../components/echo/native/discoveryfilter.go | 372 + .../components/echo/native/instance.go | 122 + .../components/echo/native/service.go | 121 + .../components/echo/native/sidecar.go | 294 + .../framework/components/echo/native/util.go | 77 + .../components/echo/native/workload.go | 195 + tests/integration/echo/echo_test.go | 106 +- 26 files changed, 15239 insertions(+), 517 deletions(-) create mode 100644 pkg/test/framework/components/echo/call.go create mode 100644 pkg/test/framework/components/echo/common/call.go create mode 100644 pkg/test/framework/components/echo/common/config.go create mode 100644 pkg/test/framework/components/echo/common/envoy.go create mode 100644 pkg/test/framework/components/echo/common/envoy_test.go create mode 100644 pkg/test/framework/components/echo/common/portgen.go create mode 100644 pkg/test/framework/components/echo/common/testdata/config_dump.json create mode 100644 pkg/test/framework/components/echo/config.go create mode 100644 pkg/test/framework/components/echo/echo.go create mode 100644 pkg/test/framework/components/echo/echoboot/echoboot.go delete mode 100644 pkg/test/framework/components/echo/instance.go create mode 100644 pkg/test/framework/components/echo/kube/deployment.go create mode 100644 pkg/test/framework/components/echo/kube/instance.go create mode 100644 pkg/test/framework/components/echo/kube/sidecar.go create mode 100644 pkg/test/framework/components/echo/kube/workload.go delete mode 100644 pkg/test/framework/components/echo/native.go create mode 100644 pkg/test/framework/components/echo/native/appfilter.go create mode 100644 pkg/test/framework/components/echo/native/discoveryfilter.go create mode 100644 pkg/test/framework/components/echo/native/instance.go create mode 100644 pkg/test/framework/components/echo/native/service.go create mode 100644 pkg/test/framework/components/echo/native/sidecar.go create mode 100644 pkg/test/framework/components/echo/native/util.go create mode 100644 pkg/test/framework/components/echo/native/workload.go diff --git a/pkg/test/application/echo/client.go b/pkg/test/application/echo/client.go index a41095dc1ab7..64410d1af26f 100644 --- a/pkg/test/application/echo/client.go +++ b/pkg/test/application/echo/client.go @@ -16,8 +16,13 @@ package echo import ( "context" + "fmt" "regexp" + "strconv" "strings" + "testing" + + "github.com/hashicorp/go-multierror" "google.golang.org/grpc" @@ -113,9 +118,69 @@ func (r ParsedResponses) Len() int { return len(r) } -// IsOK indicates whether or not the first response was successful. -func (r ParsedResponses) IsOK() bool { - return r.Len() > 0 && r[0].IsOK() +func (r ParsedResponses) Check(check func(int, *ParsedResponse) error) (err error) { + if r.Len() == 0 { + return fmt.Errorf("no responses received") + } + + for i, response := range r { + if e := check(i, response); e != nil { + err = multierror.Append(err, e) + } + } + return +} + +func (r ParsedResponses) CheckOrFail(t testing.TB, check func(int, *ParsedResponse) error) { + if err := r.Check(check); err != nil { + t.Fatal(err) + } +} + +func (r ParsedResponses) CheckOK() error { + return r.Check(func(i int, response *ParsedResponse) error { + if !response.IsOK() { + return fmt.Errorf("response[%d] Status Code: %s", i, response.Code) + } + return nil + }) +} + +func (r ParsedResponses) CheckOKOrFail(t testing.TB) { + if err := r.CheckOK(); err != nil { + t.Fatal(err) + } +} + +func (r ParsedResponses) CheckHost(expected string) error { + return r.Check(func(i int, response *ParsedResponse) error { + if response.Host != expected { + return fmt.Errorf("response[%d] Host: expected %s, received %s", i, expected, response.Host) + } + return nil + }) +} + +func (r ParsedResponses) CheckHostOrFail(t testing.TB, expected string) { + if err := r.CheckHost(expected); err != nil { + t.Fatal(err) + } +} + +func (r ParsedResponses) CheckPort(expected int) error { + expectedStr := strconv.Itoa(expected) + return r.Check(func(i int, response *ParsedResponse) error { + if response.Port != expectedStr { + return fmt.Errorf("response[%d] Port: expected %s, received %s", i, expectedStr, response.Port) + } + return nil + }) +} + +func (r ParsedResponses) CheckPortOrFail(t testing.TB, expected int) { + if err := r.CheckPort(expected); err != nil { + t.Fatal(err) + } } // Count occurrences of the given text within the bodies of all responses. @@ -127,15 +192,6 @@ func (r ParsedResponses) Count(text string) int { return count } -// Body concatenates the bodies of all responses. -func (r ParsedResponses) Body() string { - body := "" - for _, c := range r { - body += c.Body - } - return body -} - func parseForwardedResponse(resp *proto.ForwardEchoResponse) ParsedResponses { responses := make([]*ParsedResponse, len(resp.Output)) for i, output := range resp.Output { diff --git a/pkg/test/envoy/admin_util.go b/pkg/test/envoy/admin_util.go index 93e3a32734ef..d75089859922 100644 --- a/pkg/test/envoy/admin_util.go +++ b/pkg/test/envoy/admin_util.go @@ -21,20 +21,14 @@ import ( "net/http" "time" - envoy_admin_v2alpha "github.com/envoyproxy/go-control-plane/envoy/admin/v2alpha" - routeapi "github.com/envoyproxy/go-control-plane/envoy/api/v2/route" - "github.com/gogo/protobuf/jsonpb" - "github.com/gogo/protobuf/types" + "istio.io/istio/pkg/test/util/retry" - "istio.io/istio/istioctl/pkg/util/configdump" -) + envoyAdmin "github.com/envoyproxy/go-control-plane/envoy/admin/v2alpha" + routeApi "github.com/envoyproxy/go-control-plane/envoy/api/v2/route" -// HealthCheckState represents a health checking state returned from /server_info -type HealthCheckState string + "github.com/gogo/protobuf/jsonpb" -const ( - // HealthCheckLive indicates Envoy is live and ready to serve requests - HealthCheckLive HealthCheckState = "LIVE" + "istio.io/istio/istioctl/pkg/util/configdump" ) const ( @@ -42,79 +36,34 @@ const ( healthCheckInterval = 100 * time.Millisecond ) -var ( - nilServerInfo = ServerInfo{} -) - -// ServerInfo is the result of a request to /server_info -type ServerInfo struct { - ProcessName string - CompiledSHABuildType string - HealthCheckState HealthCheckState - CurrentHotRestartEpochUptime time.Duration - TotalUptime time.Duration - CurrentHotRestartEpoch int -} - // GetServerInfo returns a structure representing a call to /server_info -func GetServerInfo(adminPort int) (ServerInfo, error) { +func GetServerInfo(adminPort int) (*envoyAdmin.ServerInfo, error) { buffer, err := doEnvoyGet("server_info", adminPort) if err != nil { - return nilServerInfo, err + return nil, err } - msg := &envoy_admin_v2alpha.ServerInfo{} + msg := &envoyAdmin.ServerInfo{} if err := jsonpb.Unmarshal(buffer, msg); err != nil { - return nilServerInfo, err - } - - currentHotRestartEpochUptime, err := types.DurationFromProto(msg.UptimeCurrentEpoch) - if err != nil { - return nilServerInfo, err - } - - totalUptime, err := types.DurationFromProto(msg.UptimeAllEpochs) - if err != nil { - return nilServerInfo, err - } - - currentEpoch := 0 - if msg.CommandLineOptions != nil { - currentEpoch = int(msg.CommandLineOptions.RestartEpoch) + return nil, err } - return ServerInfo{ - ProcessName: "envoy", - CompiledSHABuildType: msg.Version, - HealthCheckState: HealthCheckState(msg.State.String()), - CurrentHotRestartEpochUptime: currentHotRestartEpochUptime, - TotalUptime: totalUptime, - CurrentHotRestartEpoch: currentEpoch, - }, nil + return msg, nil } // WaitForHealthCheckLive polls the server info for Envoy and waits for it to transition to "live". func WaitForHealthCheckLive(adminPort int) error { - endTime := time.Now().Add(healthCheckTimeout) - for { - var info ServerInfo + return retry.UntilSuccess(func() error { info, err := GetServerInfo(adminPort) - if err == nil { - if info.HealthCheckState == HealthCheckLive { - // It's running, we can return now. - return nil - } - } - - // Stop trying after the timeout - if time.Now().After(endTime) { - err = fmt.Errorf("failed to start envoy after %ds. Error: %v", healthCheckTimeout/time.Second, err) + if err != nil { return err } - // Sleep a short before retry. - time.Sleep(healthCheckInterval) - } + if info.State != envoyAdmin.ServerInfo_LIVE { + return fmt.Errorf("envoy not live. Server State: %s", info.State) + } + return nil + }, retry.Delay(healthCheckInterval), retry.Timeout(healthCheckTimeout)) } // GetConfigDumpStr polls Envoy admin port for the config dump and returns the response as a string. @@ -127,13 +76,13 @@ func GetConfigDumpStr(adminPort int) (string, error) { } // GetConfigDump polls Envoy admin port for the config dump and returns the response. -func GetConfigDump(adminPort int) (*envoy_admin_v2alpha.ConfigDump, error) { +func GetConfigDump(adminPort int) (*envoyAdmin.ConfigDump, error) { buffer, err := doEnvoyGet("config_dump", adminPort) if err != nil { return nil, err } - msg := &envoy_admin_v2alpha.ConfigDump{} + msg := &envoyAdmin.ConfigDump{} if err := jsonpb.Unmarshal(buffer, msg); err != nil { return nil, err } @@ -150,7 +99,7 @@ func doEnvoyGet(path string, adminPort int) (*bytes.Buffer, error) { } // IsClusterPresent inspects the given Envoy config dump, looking for the given cluster -func IsClusterPresent(cfg *envoy_admin_v2alpha.ConfigDump, clusterName string) bool { +func IsClusterPresent(cfg *envoyAdmin.ConfigDump, clusterName string) bool { wrapper := configdump.Wrapper{ConfigDump: cfg} clusters, err := wrapper.GetClusterConfigDump() if err != nil { @@ -169,7 +118,7 @@ func IsClusterPresent(cfg *envoy_admin_v2alpha.ConfigDump, clusterName string) b } // IsOutboundListenerPresent inspects the given Envoy config dump, looking for the given listener. -func IsOutboundListenerPresent(cfg *envoy_admin_v2alpha.ConfigDump, listenerName string) bool { +func IsOutboundListenerPresent(cfg *envoyAdmin.ConfigDump, listenerName string) bool { wrapper := configdump.Wrapper{ConfigDump: cfg} listeners, err := wrapper.GetListenerConfigDump() if err != nil { @@ -185,7 +134,7 @@ func IsOutboundListenerPresent(cfg *envoy_admin_v2alpha.ConfigDump, listenerName } // IsOutboundRoutePresent inspects the given Envoy config dump, looking for an outbound route which targets the given cluster. -func IsOutboundRoutePresent(cfg *envoy_admin_v2alpha.ConfigDump, clusterName string) bool { +func IsOutboundRoutePresent(cfg *envoyAdmin.ConfigDump, clusterName string) bool { wrapper := configdump.Wrapper{ConfigDump: cfg} routes, err := wrapper.GetRouteConfigDump() if err != nil { @@ -197,12 +146,12 @@ func IsOutboundRoutePresent(cfg *envoy_admin_v2alpha.ConfigDump, clusterName str if r.RouteConfig != nil { for _, vh := range r.RouteConfig.VirtualHosts { for _, route := range vh.Routes { - actionRoute, ok := route.Action.(*routeapi.Route_Route) + actionRoute, ok := route.Action.(*routeApi.Route_Route) if !ok { continue } - cluster, ok := actionRoute.Route.ClusterSpecifier.(*routeapi.RouteAction_Cluster) + cluster, ok := actionRoute.Route.ClusterSpecifier.(*routeApi.RouteAction_Cluster) if !ok { continue } @@ -222,7 +171,7 @@ func doHTTPGet(requestURL string) (*bytes.Buffer, error) { if err != nil { return nil, err } - defer response.Body.Close() + defer func() { _ = response.Body.Close() }() if response.StatusCode != 200 { return nil, fmt.Errorf("unexpected status %d", response.StatusCode) diff --git a/pkg/test/framework/components/echo/call.go b/pkg/test/framework/components/echo/call.go new file mode 100644 index 000000000000..9f5d4e2b279e --- /dev/null +++ b/pkg/test/framework/components/echo/call.go @@ -0,0 +1,67 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package echo + +import "net/http" + +// CallProtocol enumerates the protocol options for calling an Endpoint endpoint. +type CallProtocol string + +const ( + // HTTP calls echo with HTTP + HTTP CallProtocol = "http" + + // GRPC calls echo with GRPC + GRPC CallProtocol = "grpc" + + // TCP calls echo with TCP + TCP CallProtocol = "tcp" + + // WebSocket calls echo with WebSocket + WebSocket CallProtocol = "ws" +) + +// CallOptions defines options for calling a Endpoint. +type CallOptions struct { + // Target instance of the call. Required. + Target Instance + + // Port on the target Instance. Either Port or PortName must be specified. + Port *Port + + // PortName of the port on the target Instance. Either Port or PortName must be specified. + PortName string + + // Protocol to be used when making the call. If not provided, the protocol of the port + // will be used. + Protocol CallProtocol + + // Host specifies the host to be used on the request. If not provided, an appropriate + // default is chosen for the target Instance. + Host string + + // Path specifies the URL path for the request. + Path string + + // Count indicates the number of exchanges that should be made with the service endpoint. + // If Count <= 0, defaults to 1. + Count int + + // Headers indicates headers that should be sent in the request. Ignored for WebSocket calls. + Headers http.Header + + // Secure indicates whether a secure connection should be used. + Secure bool +} diff --git a/pkg/test/framework/components/echo/common/call.go b/pkg/test/framework/components/echo/common/call.go new file mode 100644 index 000000000000..a8bd7824b9e4 --- /dev/null +++ b/pkg/test/framework/components/echo/common/call.go @@ -0,0 +1,135 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package common + +import ( + "errors" + "fmt" + "net" + "net/url" + "reflect" + "strconv" + + appEcho "istio.io/istio/pkg/test/application/echo" + "istio.io/istio/pkg/test/application/echo/proto" + "istio.io/istio/pkg/test/framework/components/echo" +) + +func CallEcho(client *appEcho.Client, opts echo.CallOptions) (appEcho.ParsedResponses, error) { + if err := fillInCallOptions(&opts); err != nil { + return nil, err + } + + // Forward a request from 'this' service to the destination service. + targetURL := makeURL(opts) + targetService := opts.Target.Config().Service + + var headers []*proto.Header + headers = append(headers, &proto.Header{Key: "Host", Value: targetService}) + for key, values := range opts.Headers { + for _, value := range values { + headers = append(headers, &proto.Header{Key: key, Value: value}) + } + } + + req := &proto.ForwardEchoRequest{ + Url: targetURL.String(), + Count: int32(opts.Count), + Headers: headers, + } + + resp, err := client.ForwardEcho(req) + if err != nil { + return nil, err + } + + if len(resp) != opts.Count { + return nil, fmt.Errorf("unexpected number of responses: expected %d, received %d", opts.Count, len(resp)) + } + return resp, err +} + +func fillInCallOptions(opts *echo.CallOptions) error { + if opts.Target == nil { + return errors.New("callOptions: missing Target") + } + + targetPorts := opts.Target.Config().Ports + if opts.PortName == "" { + // Validate the Port value. + + if opts.Port == nil { + return errors.New("callOptions: PortName or Port must be provided") + } + + // Check the specified port for a match against the Target Instance + found := false + for _, port := range targetPorts { + if reflect.DeepEqual(port, opts.Port) { + found = true + break + } + } + if !found { + return fmt.Errorf("callOptions: Port does not match any Target port") + } + } else { + // Look up the port. + found := false + for _, port := range targetPorts { + if opts.PortName == port.Name { + found = true + opts.Port = &port + break + } + } + if !found { + return fmt.Errorf("callOptions: no port named %s available in Target Instance", opts.PortName) + } + } + + if opts.Host == "" { + // No host specified, use the fully qualified domain name for the service. + opts.Host = opts.Target.Config().FQDN() + } + + if opts.Count <= 0 { + opts.Count = 1 + } + + return nil +} + +func makeURL(opts echo.CallOptions) *url.URL { + protocol := string(normalizeProtocol(opts.Protocol)) + if opts.Secure { + protocol += "s" + } + + return &url.URL{ + Scheme: protocol, + Host: net.JoinHostPort(opts.Host, strconv.Itoa(opts.Port.ServicePort)), + Path: opts.Path, + } +} + +func normalizeProtocol(p echo.CallProtocol) echo.CallProtocol { + switch p { + case echo.HTTP, echo.GRPC, echo.WebSocket: + return p + default: + return echo.HTTP + } +} diff --git a/pkg/test/framework/components/echo/common/config.go b/pkg/test/framework/components/echo/common/config.go new file mode 100644 index 000000000000..4b42504683d8 --- /dev/null +++ b/pkg/test/framework/components/echo/common/config.go @@ -0,0 +1,100 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package common + +import ( + "fmt" + + "istio.io/istio/pilot/pkg/model" + "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/framework/components/namespace" + "istio.io/istio/pkg/test/framework/resource" +) + +const ( + defaultService = "echo" + defaultVersion = "v1" + defaultNamespace = "echo" +) + +func FillInDefaults(ctx resource.Context, defaultDomain string, c *echo.Config) (err error) { + if c.Service == "" { + c.Service = defaultService + } + + if c.Version == "" { + c.Version = defaultVersion + } + + if c.Domain == "" { + c.Domain = defaultDomain + } + + // If no namespace was provided, use the default. + if c.Namespace == nil { + if c.Namespace, err = namespace.New(ctx, defaultNamespace, true); err != nil { + return err + } + } + + // Mark all user-defined ports as used, so the port generator won't assign them. + portGen := newPortGenerators() + for _, p := range c.Ports { + if p.ServicePort > 0 { + if portGen.Service.IsUsed(p.ServicePort) { + return fmt.Errorf("failed configuring port %s: service port already used %d", p.Name, p.ServicePort) + } + portGen.Service.SetUsed(p.ServicePort) + } + if p.InstancePort > 0 { + if portGen.Instance.IsUsed(p.InstancePort) { + return fmt.Errorf("failed configuring port %s: instance port already used %d", p.Name, p.InstancePort) + } + portGen.Instance.SetUsed(p.InstancePort) + } + } + + // Append a gRPC port, if none was provided. This is needed + // for controlling the app. + if GetGRPCPort(c) == nil { + c.Ports = append([]echo.Port{ + { + Name: "grpc", + Protocol: model.ProtocolGRPC, + }, + }, c.Ports...) + } + + // Now, assign default values for any ports that haven't been specified. + for i, p := range c.Ports { + if p.ServicePort <= 0 { + c.Ports[i].ServicePort = portGen.Service.Next(p.Protocol) + } + if p.InstancePort <= 0 { + c.Ports[i].InstancePort = portGen.Instance.Next(p.Protocol) + } + } + + return nil +} + +func GetGRPCPort(c *echo.Config) *echo.Port { + for _, p := range c.Ports { + if p.Protocol == model.ProtocolGRPC { + return &p + } + } + return nil +} diff --git a/pkg/test/framework/components/echo/common/envoy.go b/pkg/test/framework/components/echo/common/envoy.go new file mode 100644 index 000000000000..d0fd61706a78 --- /dev/null +++ b/pkg/test/framework/components/echo/common/envoy.go @@ -0,0 +1,149 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package common + +import ( + "errors" + "fmt" + "time" + + envoyAdmin "github.com/envoyproxy/go-control-plane/envoy/admin/v2alpha" + "github.com/gogo/protobuf/jsonpb" + + "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/util/retry" + "istio.io/istio/pkg/test/util/structpath" +) + +const ( + // DefaultTimeout the default timeout for the entire retry operation + defaultTimeout = time.Second * 30 + + // DefaultDelay the default delay between successive retry attempts + defaultDelay = time.Second * 2 +) + +// ConfigFetchFunc retrieves the config dump from Envoy. +type ConfigFetchFunc func() (*envoyAdmin.ConfigDump, error) + +// ConfigAcceptFunc evaluates the Envoy config dump and either accept/reject it. This is used +// by WaitForConfig to control the retry loop. If an error is returned, a retry will be attempted. +// Otherwise the loop is immediately terminated with an error if rejected or none if accepted. +type ConfigAcceptFunc func(*envoyAdmin.ConfigDump) (bool, error) + +func WaitForConfig(fetch ConfigFetchFunc, accept ConfigAcceptFunc, options ...retry.Option) error { + options = append([]retry.Option{retry.Delay(defaultDelay), retry.Timeout(defaultTimeout)}, options...) + + var cfg *envoyAdmin.ConfigDump + _, err := retry.Do(func() (result interface{}, completed bool, err error) { + cfg, err = fetch() + if err != nil { + return nil, false, err + } + + accepted, err := accept(cfg) + if err != nil { + // Accept returned an error - retry. + return nil, false, err + } + + if accepted { + // The configuration was accepted. + return nil, true, nil + } + + // The configuration was rejected, don't try again. + return nil, true, errors.New("envoy config rejected") + }, options...) + + if err != nil { + configDumpStr := "nil" + if cfg != nil { + m := jsonpb.Marshaler{ + Indent: " ", + } + if out, err := m.MarshalToString(cfg); err == nil { + configDumpStr = out + } + } + + return fmt.Errorf("failed waiting for Envoy configuration: %v. Last config_dump:\n%s", err, configDumpStr) + } + return nil +} + +// OutboundConfigAcceptFunc returns a function that accepts Envoy configuration if it contains +// outbound configuration for all of the given instances. +func OutboundConfigAcceptFunc(outboundInstances ...echo.Instance) ConfigAcceptFunc { + return func(cfg *envoyAdmin.ConfigDump) (bool, error) { + validator := structpath.ForProto(cfg) + + for _, target := range outboundInstances { + + // First, wait for the outbound instance to be ready. + if err := target.WaitUntilReady(); err != nil { + return false, err + } + + for _, port := range target.Config().Ports { + // Ensure that we have an outbound configuration for the target port. + if err := CheckOutboundConfig(target, port, validator); err != nil { + return false, err + } + } + } + + return true, nil + } +} + +// CheckOutboundConfig checks the Envoy config dump for outbound configuration to the given target. +func CheckOutboundConfig(target echo.Instance, port echo.Port, validator *structpath.Instance) error { + // Verify that we have an outbound cluster for the target. + clusterName := clusterName(target, port) + if err := validator.Exists("{.configs[*].dynamicActiveClusters[?(@.cluster.name == '%s')]}", clusterName). + Check(); err != nil { + if err := validator.Exists("{.configs[*].dynamicActiveClusters[?(@.cluster.edsClusterConfig.serviceName == '%s')]}", + clusterName).Check(); err != nil { + return err + } + } + + // For HTTP endpoints, verify that we have a route configured. + if port.Protocol.IsHTTP() { + return validator.Exists("{.configs[*].dynamicRouteConfigs[*].routeConfig.virtualHosts[*].routes[?(@.route.cluster == '%s')]}", + clusterName).Check() + } + + // TCP case: Make sure we have an outbound listener configured for each workload. + workloads, err := target.Workloads() + if err != nil { + return err + } + for _, w := range workloads { + listenerName := listenerName(w.Address(), port) + validator.Exists("{.configs[*].dynamicActiveListeners[?(@.listener.name == '%s')]}", listenerName) + } + return validator.Check() +} + +func clusterName(target echo.Instance, port echo.Port) string { + cfg := target.Config() + return fmt.Sprintf("outbound|%d||%s.%s.%s", port.ServicePort, cfg.Service, cfg.Namespace.Name(), cfg.Domain) +} + +func listenerName(address string, port echo.Port) string { + return fmt.Sprintf("%s_%d", address, port.ServicePort) +} diff --git a/pkg/test/framework/components/echo/common/envoy_test.go b/pkg/test/framework/components/echo/common/envoy_test.go new file mode 100644 index 000000000000..8b69e790f972 --- /dev/null +++ b/pkg/test/framework/components/echo/common/envoy_test.go @@ -0,0 +1,193 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package common_test + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + + envoyAdmin "github.com/envoyproxy/go-control-plane/envoy/admin/v2alpha" + + "github.com/gogo/protobuf/jsonpb" + + "istio.io/istio/pilot/pkg/model" + appEcho "istio.io/istio/pkg/test/application/echo" + "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/framework/components/echo/common" + "istio.io/istio/pkg/test/framework/resource" + "istio.io/istio/pkg/test/util/structpath" +) + +func TestCheckOutboundConfig(t *testing.T) { + configDump, err := ioutil.ReadFile("testdata/config_dump.json") + if err != nil { + t.Fatal(err) + } + + cfg := &envoyAdmin.ConfigDump{} + if err := jsonpb.Unmarshal(bytes.NewReader(configDump), cfg); err != nil { + t.Fatal(err) + } + + cfgs := []config{ + { + protocol: model.ProtocolHTTP, + service: "b", + namespace: "apps-1-99281", + domain: "svc.cluster.local", + servicePort: 80, + address: "10.43.241.185", + }, + { + protocol: model.ProtocolHTTP, + service: "b", + namespace: "apps-1-99281", + domain: "svc.cluster.local", + servicePort: 8080, + address: "10.43.241.185", + }, + { + protocol: model.ProtocolTCP, + service: "b", + namespace: "apps-1-99281", + domain: "svc.cluster.local", + servicePort: 90, + address: "10.43.241.185", + }, + { + protocol: model.ProtocolHTTPS, + service: "b", + namespace: "apps-1-99281", + domain: "svc.cluster.local", + servicePort: 9090, + address: "10.43.241.185", + }, + { + protocol: model.ProtocolHTTP2, + service: "b", + namespace: "apps-1-99281", + domain: "svc.cluster.local", + servicePort: 70, + address: "10.43.241.185", + }, + { + protocol: model.ProtocolGRPC, + service: "b", + namespace: "apps-1-99281", + domain: "svc.cluster.local", + servicePort: 7070, + address: "10.43.241.185", + }, + } + + validator := structpath.ForProto(cfg) + + for _, cfg := range cfgs { + t.Run(fmt.Sprintf("%s_%d[%s]", cfg.service, cfg.servicePort, cfg.protocol), func(t *testing.T) { + if err := common.CheckOutboundConfig(&cfg, cfg.Config().Ports[0], validator); err != nil { + t.Fatal(err) + } + }) + } +} + +var _ echo.Instance = &config{} +var _ echo.Workload = &config{} + +type config struct { + protocol model.Protocol + servicePort int + address string + service string + domain string + namespace string +} + +func (e *config) Owner() echo.Instance { + return e +} + +func (e *config) Port() echo.Port { + return echo.Port{ + ServicePort: e.servicePort, + Protocol: e.protocol, + } +} + +func (e *config) Address() string { + return e.address +} + +func (e *config) Config() echo.Config { + return echo.Config{ + Service: e.service, + Namespace: &fakeNamespace{ + name: e.namespace, + }, + Domain: e.domain, + Ports: []echo.Port{ + { + ServicePort: e.servicePort, + Protocol: e.protocol, + }, + }, + } +} + +func (e *config) Workloads() ([]echo.Workload, error) { + return []echo.Workload{e}, nil +} + +func (e *config) ID() resource.ID { + panic("not implemented") +} + +func (e *config) WorkloadsOrFail(t testing.TB) []echo.Workload { + panic("not implemented") +} + +func (e *config) WaitUntilReady(_ ...echo.Instance) error { + panic("not implemented") +} + +func (e *config) WaitUntilReadyOrFail(_ testing.TB, _ ...echo.Instance) { + panic("not implemented") +} + +func (e *config) Call(_ echo.CallOptions) (appEcho.ParsedResponses, error) { + panic("not implemented") +} + +func (e *config) CallOrFail(_ testing.TB, _ echo.CallOptions) appEcho.ParsedResponses { + panic("not implemented") +} + +func (e *config) Sidecar() echo.Sidecar { + panic("not implemented") +} + +type fakeNamespace struct { + name string +} + +func (n *fakeNamespace) Name() string { + return n.name +} + +func (n *fakeNamespace) ID() resource.ID { + panic("not implemented") +} diff --git a/pkg/test/framework/components/echo/common/portgen.go b/pkg/test/framework/components/echo/common/portgen.go new file mode 100644 index 000000000000..921df517d08f --- /dev/null +++ b/pkg/test/framework/components/echo/common/portgen.go @@ -0,0 +1,114 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package common + +import ( + "math" + + "istio.io/istio/pilot/pkg/model" +) + +// portGenerators creates a set of generators for service and instance ports. +type portGenerators struct { + Service *portGenerator + Instance *portGenerator +} + +// newPortGenerators creates a new set of port generators. +func newPortGenerators() *portGenerators { + return &portGenerators{ + Service: newPortGenerator(), + Instance: newPortGenerator(), + } +} + +// portGenerator is a utility that generates reasonable default port values +// for a given protocol. +type portGenerator struct { + nextHTTP []int + httpIndex int + + nextGRPC []int + grpcIndex int + + nextTCP []int + tcpIndex int + + used map[int]struct{} +} + +func newPortGenerator() *portGenerator { + return &portGenerator{ + nextHTTP: []int{80, 8080}, + nextTCP: []int{90, 9090}, + nextGRPC: []int{70, 7070}, + used: make(map[int]struct{}), + } +} + +// SetUsed marks the given port as used, so that it will not be assigned by the +// generator. +func (g *portGenerator) SetUsed(port int) *portGenerator { + g.used[port] = struct{}{} + return g +} + +// IsUsed indicates if the given port has already been used. +func (g *portGenerator) IsUsed(port int) bool { + _, ok := g.used[port] + return ok +} + +// Next assigns the next port for the given protocol. +func (g *portGenerator) Next(p model.Protocol) int { + var next int + + for { + var nextArray []int + var index *int + switch p { + case model.ProtocolHTTP: + nextArray = g.nextHTTP + index = &g.httpIndex + case model.ProtocolGRPC: + nextArray = g.nextGRPC + index = &g.grpcIndex + default: + nextArray = g.nextTCP + index = &g.tcpIndex + } + + // Get the next value + next = nextArray[*index] + + // Update the next. + nextArray[*index]++ + + if *index == math.MaxInt16 { + panic("echo port generator: ran out of ports") + } + + *index++ + + if !g.IsUsed(next) { + // Mark this port as used. + g.SetUsed(next) + break + } + // Otherwise, the port was already used, pick another one. + } + + return next +} diff --git a/pkg/test/framework/components/echo/common/testdata/config_dump.json b/pkg/test/framework/components/echo/common/testdata/config_dump.json new file mode 100644 index 000000000000..439127ec40ca --- /dev/null +++ b/pkg/test/framework/components/echo/common/testdata/config_dump.json @@ -0,0 +1,12179 @@ +{ + "configs": [ + { + "@type": "type.googleapis.com/envoy.admin.v2alpha.BootstrapConfigDump", + "bootstrap": { + "node": { + "id": "sidecar~10.40.3.59~a-6bb6dbdcc5-z58cx.apps-1-99281~apps-1-99281.svc.cluster.local", + "cluster": "a.apps-1-99281", + "metadata": { + "app": "a", + "pod-template-hash": "6bb6dbdcc5", + "INTERCEPTION_MODE": "REDIRECT", + "CONFIG_NAMESPACE": "apps-1-99281", + "version": "v1", + "ISTIO_VERSION": "1.0-dev", + "istio-locality": "region.zone.subzone", + "ISTIO_META_INSTANCE_IPS": "10.40.3.59,10.40.3.59,fe80::7cf5:f9ff:fe8f:48bb", + "POD_NAME": "a-6bb6dbdcc5-z58cx", + "istio": "sidecar", + "ISTIO_PROXY_VERSION": "1.1.0", + "ISTIO_PROXY_SHA": "istio-proxy:ecbd1731cedc5d373766ea6e2f1c2e58623b0e28" + }, + "locality": { + "region": "us-central1", + "zone": "us-central1-a" + }, + "build_version": "ecbd1731cedc5d373766ea6e2f1c2e58623b0e28/1.10.0-dev/Clean/RELEASE/BoringSSL" + }, + "static_resources": { + "listeners": [ + { + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 15090 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "route_config": { + "virtual_hosts": [ + { + "routes": [ + { + "route": { + "cluster": "prometheus_stats" + }, + "match": { + "prefix": "/stats/prometheus" + } + } + ], + "domains": [ + "*" + ], + "name": "backend" + } + ] + }, + "codec_type": "AUTO", + "http_filters": { + "name": "envoy.router" + }, + "stat_prefix": "stats" + } + } + ] + } + ] + } + ], + "clusters": [ + { + "name": "prometheus_stats", + "type": "STATIC", + "connect_timeout": "0.250s", + "hosts": [ + { + "socket_address": { + "address": "127.0.0.1", + "port_value": 15000 + } + } + ] + }, + { + "name": "xds-grpc", + "type": "STRICT_DNS", + "connect_timeout": "10s", + "hosts": [ + { + "socket_address": { + "address": "istio-pilot.istio-system", + "port_value": 15010 + } + } + ], + "circuit_breakers": { + "thresholds": [ + { + "max_connections": 100000, + "max_pending_requests": 100000, + "max_requests": 100000 + }, + { + "priority": "HIGH", + "max_connections": 100000, + "max_pending_requests": 100000, + "max_requests": 100000 + } + ] + }, + "http2_protocol_options": {}, + "dns_lookup_family": "V4_ONLY", + "upstream_connection_options": { + "tcp_keepalive": { + "keepalive_time": 300 + } + } + }, + { + "name": "zipkin", + "type": "STRICT_DNS", + "connect_timeout": "1s", + "hosts": [ + { + "socket_address": { + "address": "zipkin.istio-system", + "port_value": 9411 + } + } + ], + "dns_lookup_family": "V4_ONLY" + } + ] + }, + "dynamic_resources": { + "lds_config": { + "ads": {} + }, + "cds_config": { + "ads": {} + }, + "ads_config": { + "api_type": "GRPC", + "grpc_services": [ + { + "envoy_grpc": { + "cluster_name": "xds-grpc" + } + } + ] + } + }, + "tracing": { + "http": { + "name": "envoy.zipkin", + "config": { + "collector_cluster": "zipkin", + "trace_id_128bit": "true", + "shared_span_context": "false", + "collector_endpoint": "/api/v1/spans" + } + } + }, + "admin": { + "access_log_path": "/dev/null", + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 15000 + } + } + }, + "stats_config": { + "stats_tags": [ + { + "tag_name": "cluster_name", + "regex": "^cluster\\.((.+?(\\..+?\\.svc\\.cluster\\.local)?)\\.)" + }, + { + "tag_name": "tcp_prefix", + "regex": "^tcp\\.((.*?)\\.)\\w+?$" + }, + { + "tag_name": "response_code", + "regex": "_rq(_(\\d{3}))$" + }, + { + "tag_name": "response_code_class", + "regex": "_rq(_(\\dxx))$" + }, + { + "tag_name": "http_conn_manager_listener_prefix", + "regex": "^listener(?=\\.).*?\\.http\\.(((?:[_.[:digit:]]*|[_\\[\\]aAbBcCdDeEfF[:digit:]]*))\\.)" + }, + { + "tag_name": "http_conn_manager_prefix", + "regex": "^http\\.(((?:[_.[:digit:]]*|[_\\[\\]aAbBcCdDeEfF[:digit:]]*))\\.)" + }, + { + "tag_name": "listener_address", + "regex": "^listener\\.(((?:[_.[:digit:]]*|[_\\[\\]aAbBcCdDeEfF[:digit:]]*))\\.)" + }, + { + "tag_name": "mongo_prefix", + "regex": "^mongo\\.(.+?)\\.(collection|cmd|cx_|op_|delays_|decoding_)(.*?)$" + } + ], + "use_all_default_tags": false, + "stats_matcher": { + "inclusion_list": { + "patterns": [ + { + "prefix": "cluster_manager" + }, + { + "prefix": "listener_manager" + }, + { + "prefix": "http_mixer_filter" + }, + { + "prefix": "tcp_mixer_filter" + }, + { + "prefix": "server" + }, + { + "prefix": "cluster.xds-grpc" + } + ] + } + } + } + }, + "last_updated": "2019-04-14T15:36:45.310Z" + }, + { + "@type": "type.googleapis.com/envoy.admin.v2alpha.ClustersConfigDump", + "version_info": "2019-04-14T15:38:43Z/20", + "static_clusters": [ + { + "cluster": { + "name": "prometheus_stats", + "type": "STATIC", + "connect_timeout": "0.250s", + "hosts": [ + { + "socket_address": { + "address": "127.0.0.1", + "port_value": 15000 + } + } + ] + }, + "last_updated": "2019-04-14T15:36:45.313Z" + }, + { + "cluster": { + "name": "xds-grpc", + "type": "STRICT_DNS", + "connect_timeout": "10s", + "hosts": [ + { + "socket_address": { + "address": "istio-pilot.istio-system", + "port_value": 15010 + } + } + ], + "circuit_breakers": { + "thresholds": [ + { + "max_connections": 100000, + "max_pending_requests": 100000, + "max_requests": 100000 + }, + { + "priority": "HIGH", + "max_connections": 100000, + "max_pending_requests": 100000, + "max_requests": 100000 + } + ] + }, + "http2_protocol_options": {}, + "dns_lookup_family": "V4_ONLY", + "upstream_connection_options": { + "tcp_keepalive": { + "keepalive_time": 300 + } + } + }, + "last_updated": "2019-04-14T15:36:45.314Z" + }, + { + "cluster": { + "name": "zipkin", + "type": "STRICT_DNS", + "connect_timeout": "1s", + "hosts": [ + { + "socket_address": { + "address": "zipkin.istio-system", + "port_value": 9411 + } + } + ], + "dns_lookup_family": "V4_ONLY" + }, + "last_updated": "2019-04-14T15:36:45.314Z" + } + ], + "dynamic_active_clusters": [ + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "BlackHoleCluster", + "type": "STATIC", + "connect_timeout": "10s" + }, + "last_updated": "2019-04-14T15:36:46.239Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "PassthroughCluster", + "type": "ORIGINAL_DST", + "connect_timeout": "10s", + "lb_policy": "ORIGINAL_DST_LB" + }, + "last_updated": "2019-04-14T15:36:46.239Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "inbound|15020|mgmt-15020|mgmtCluster", + "type": "STATIC", + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + {} + ] + }, + "load_assignment": { + "cluster_name": "inbound|15020|mgmt-15020|mgmtCluster", + "endpoints": [ + { + "lb_endpoints": [ + { + "endpoint": { + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 15020 + } + } + } + } + ] + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.239Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "inbound|3333|mgmt-3333|mgmtCluster", + "type": "STATIC", + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + {} + ] + }, + "load_assignment": { + "cluster_name": "inbound|3333|mgmt-3333|mgmtCluster", + "endpoints": [ + { + "lb_endpoints": [ + { + "endpoint": { + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 3333 + } + } + } + } + ] + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.238Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "inbound|7070|grpc|a.apps-1-99281.svc.cluster.local", + "type": "STATIC", + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + {} + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + }, + "load_assignment": { + "cluster_name": "inbound|7070|grpc|a.apps-1-99281.svc.cluster.local", + "endpoints": [ + { + "lb_endpoints": [ + { + "endpoint": { + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 70 + } + } + } + } + ] + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.238Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "inbound|70|http2-example|a.apps-1-99281.svc.cluster.local", + "type": "STATIC", + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + {} + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + }, + "load_assignment": { + "cluster_name": "inbound|70|http2-example|a.apps-1-99281.svc.cluster.local", + "endpoints": [ + { + "lb_endpoints": [ + { + "endpoint": { + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 7070 + } + } + } + } + ] + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.237Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "inbound|8080|http-two|a.apps-1-99281.svc.cluster.local", + "type": "STATIC", + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + {} + ] + }, + "load_assignment": { + "cluster_name": "inbound|8080|http-two|a.apps-1-99281.svc.cluster.local", + "endpoints": [ + { + "lb_endpoints": [ + { + "endpoint": { + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 80 + } + } + } + } + ] + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.237Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "inbound|8080|mgmt-8080|mgmtCluster", + "type": "STATIC", + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + {} + ] + }, + "load_assignment": { + "cluster_name": "inbound|8080|mgmt-8080|mgmtCluster", + "endpoints": [ + { + "lb_endpoints": [ + { + "endpoint": { + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 8080 + } + } + } + } + ] + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.238Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "inbound|80|http|a.apps-1-99281.svc.cluster.local", + "type": "STATIC", + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + {} + ] + }, + "load_assignment": { + "cluster_name": "inbound|80|http|a.apps-1-99281.svc.cluster.local", + "endpoints": [ + { + "lb_endpoints": [ + { + "endpoint": { + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 8080 + } + } + } + } + ] + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.237Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "inbound|9090|https|a.apps-1-99281.svc.cluster.local", + "type": "STATIC", + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + {} + ] + }, + "load_assignment": { + "cluster_name": "inbound|9090|https|a.apps-1-99281.svc.cluster.local", + "endpoints": [ + { + "lb_endpoints": [ + { + "endpoint": { + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 90 + } + } + } + } + ] + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.237Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "inbound|90|tcp|a.apps-1-99281.svc.cluster.local", + "type": "STATIC", + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + {} + ] + }, + "load_assignment": { + "cluster_name": "inbound|90|tcp|a.apps-1-99281.svc.cluster.local", + "endpoints": [ + { + "lb_endpoints": [ + { + "endpoint": { + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 9090 + } + } + } + } + ] + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.237Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|10090||headless.apps-1-99281.svc.cluster.local", + "type": "ORIGINAL_DST", + "connect_timeout": "10s", + "lb_policy": "ORIGINAL_DST_LB", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.237Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15004||istio-policy.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15004||istio-policy.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "max_requests_per_connection": 10000, + "circuit_breakers": { + "thresholds": [ + { + "max_requests": 10000, + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + }, + "metadata": { + "filter_metadata": { + "istio": { + "config": "/apis/networking/v1alpha3/namespaces/istio-system/destination-rule/istio-policy" + } + } + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15004||istio-telemetry.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15004||istio-telemetry.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "max_requests_per_connection": 10000, + "circuit_breakers": { + "thresholds": [ + { + "max_requests": 10000, + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + }, + "metadata": { + "filter_metadata": { + "istio": { + "config": "/apis/networking/v1alpha3/namespaces/istio-system/destination-rule/istio-telemetry" + } + } + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15010||istio-pilot.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15010||istio-pilot.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.233Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15011||istio-pilot.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15011||istio-pilot.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.233Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15014||istio-citadel.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15014||istio-citadel.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.233Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15014||istio-galley.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15014||istio-galley.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15014||istio-pilot.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15014||istio-pilot.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.233Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15014||istio-policy.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15014||istio-policy.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "max_requests_per_connection": 10000, + "circuit_breakers": { + "thresholds": [ + { + "max_requests": 10000, + "max_retries": 1024 + } + ] + }, + "metadata": { + "filter_metadata": { + "istio": { + "config": "/apis/networking/v1alpha3/namespaces/istio-system/destination-rule/istio-policy" + } + } + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15014||istio-telemetry.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15014||istio-telemetry.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "max_requests_per_connection": 10000, + "circuit_breakers": { + "thresholds": [ + { + "max_requests": 10000, + "max_retries": 1024 + } + ] + }, + "metadata": { + "filter_metadata": { + "istio": { + "config": "/apis/networking/v1alpha3/namespaces/istio-system/destination-rule/istio-telemetry" + } + } + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15020||istio-ingressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15020||istio-ingressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15029||istio-ingressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15029||istio-ingressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15030||istio-ingressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15030||istio-ingressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15031||istio-ingressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15031||istio-ingressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15032||istio-ingressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15032||istio-ingressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15443||istio-egressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15443||istio-egressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|15443||istio-ingressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|15443||istio-ingressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|31400||istio-ingressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|31400||istio-ingressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|42422||istio-telemetry.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|42422||istio-telemetry.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "max_requests_per_connection": 10000, + "circuit_breakers": { + "thresholds": [ + { + "max_requests": 10000, + "max_retries": 1024 + } + ] + }, + "metadata": { + "filter_metadata": { + "istio": { + "config": "/apis/networking/v1alpha3/namespaces/istio-system/destination-rule/istio-telemetry" + } + } + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|44134||tiller-deploy.kube-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|44134||tiller-deploy.kube-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|443||istio-egressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|443||istio-egressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|443||istio-galley.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|443||istio-galley.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|443||istio-ingressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|443||istio-ingressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|443||istio-sidecar-injector.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|443||istio-sidecar-injector.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.234Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|443||kubernetes-dashboard.kube-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|443||kubernetes-dashboard.kube-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|443||kubernetes.default.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|443||kubernetes.default.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.230Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|443||metrics-server.kube-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|443||metrics-server.kube-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|5000||kube-registry.kube-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|5000||kube-registry.kube-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|53||kube-dns.kube-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|53||kube-dns.kube-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.230Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|7070||a.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|7070||a.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|7070||b.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|7070||b.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|7070||c.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|7070||c.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|7070||d.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|7070||d.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|7070||headless.apps-1-99281.svc.cluster.local", + "type": "ORIGINAL_DST", + "connect_timeout": "10s", + "lb_policy": "ORIGINAL_DST_LB", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.237Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|7070||t.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|7070||t.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|70||a.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|70||a.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|70||b.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|70||b.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|70||c.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|70||c.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|70||d.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|70||d.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|70||headless.apps-1-99281.svc.cluster.local", + "type": "ORIGINAL_DST", + "connect_timeout": "10s", + "lb_policy": "ORIGINAL_DST_LB", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.237Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|70||t.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|70||t.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|8060||istio-citadel.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|8060||istio-citadel.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|8080||a.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|8080||a.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|8080||b.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|8080||b.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|8080||c.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|8080||c.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|8080||d.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|8080||d.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|8080||headless.apps-1-99281.svc.cluster.local", + "type": "ORIGINAL_DST", + "connect_timeout": "10s", + "lb_policy": "ORIGINAL_DST_LB", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.237Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|8080||istio-pilot.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|8080||istio-pilot.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.233Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|8080||t.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|8080||t.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.234Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|80||a.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|80||a.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|80||b.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|80||b.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|80||c.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|80||c.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|80||d.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|80||d.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|80||default-http-backend.kube-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|80||default-http-backend.kube-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.230Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|80||headless.apps-1-99281.svc.cluster.local", + "type": "ORIGINAL_DST", + "connect_timeout": "10s", + "lb_policy": "ORIGINAL_DST_LB", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|80||heapster.kube-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|80||heapster.kube-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.230Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|80||istio-egressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|80||istio-egressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|80||istio-ingressgateway.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|80||istio-ingressgateway.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|80||t.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|80||t.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.234Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|9090||a.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|9090||a.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|9090||b.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|9090||b.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|9090||c.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|9090||c.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|9090||d.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|9090||d.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|9090||prometheus.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|9090||prometheus.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.234Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|9090||t.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|9090||t.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "max_requests_per_connection": 10000, + "circuit_breakers": { + "thresholds": [ + { + "max_requests": 10000, + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + }, + "metadata": { + "filter_metadata": { + "istio": { + "config": "/apis/networking/v1alpha3/namespaces/istio-system/destination-rule/istio-policy" + } + } + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "max_requests_per_connection": 10000, + "circuit_breakers": { + "thresholds": [ + { + "max_requests": 10000, + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + }, + "metadata": { + "filter_metadata": { + "istio": { + "config": "/apis/networking/v1alpha3/namespaces/istio-system/destination-rule/istio-telemetry" + } + } + } + }, + "last_updated": "2019-04-14T15:36:46.232Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|90||a.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|90||a.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|90||b.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|90||b.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|90||c.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|90||c.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|90||d.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|90||d.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.236Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|90||t.apps-1-99281.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|90||t.apps-1-99281.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + } + }, + "last_updated": "2019-04-14T15:36:46.235Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "cluster": { + "name": "outbound|9901||istio-galley.istio-system.svc.cluster.local", + "type": "EDS", + "eds_cluster_config": { + "eds_config": { + "ads": {} + }, + "service_name": "outbound|9901||istio-galley.istio-system.svc.cluster.local" + }, + "connect_timeout": "10s", + "circuit_breakers": { + "thresholds": [ + { + "max_retries": 1024 + } + ] + }, + "http2_protocol_options": { + "max_concurrent_streams": 1073741824 + } + }, + "last_updated": "2019-04-14T15:36:46.231Z" + } + ] + }, + { + "@type": "type.googleapis.com/envoy.admin.v2alpha.ListenersConfigDump", + "version_info": "2019-04-14T15:38:43Z/20", + "static_listeners": [ + { + "listener": { + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 15090 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "codec_type": "AUTO", + "http_filters": { + "name": "envoy.router" + }, + "stat_prefix": "stats", + "route_config": { + "virtual_hosts": [ + { + "domains": [ + "*" + ], + "name": "backend", + "routes": [ + { + "route": { + "cluster": "prometheus_stats" + }, + "match": { + "prefix": "/stats/prometheus" + } + } + ] + } + ] + } + } + } + ] + } + ] + }, + "last_updated": "2019-04-14T15:36:45.323Z" + } + ], + "dynamic_active_listeners": [ + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.40.3.59_8080", + "address": { + "socket_address": { + "address": "10.40.3.59", + "port_value": 8080 + } + }, + "filter_chains": [ + { + "filter_chain_match": { + "application_protocols": [ + "istio" + ] + }, + "tls_context": { + "common_tls_context": { + "tls_certificates": [ + { + "certificate_chain": { + "filename": "/etc/certs/cert-chain.pem" + }, + "private_key": { + "filename": "/etc/certs/key.pem" + } + } + ], + "validation_context": { + "trusted_ca": { + "filename": "/etc/certs/root-cert.pem" + } + }, + "alpn_protocols": [ + "h2", + "http/1.1" + ] + }, + "require_client_certificate": true + }, + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "forward_client_cert_details": "APPEND_FORWARD", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "server_name": "istio-envoy", + "http_filters": [ + { + "name": "istio_authn", + "config": { + "policy": { + "peers": [ + { + "mtls": { + "mode": "PERMISSIVE" + } + } + ] + } + } + }, + { + "name": "envoy.filters.http.rbac", + "config": { + "rules": { + "policies": {} + } + } + }, + { + "config": { + "pass_through_mode": true, + "headers": [ + { + "exact_match": "/", + "name": ":path" + } + ] + }, + "name": "envoy.health_check" + }, + { + "config": { + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "inbound" + }, + "destination.port": { + "int64_value": "8080" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + } + } + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": {} + } + }, + "name": "mixer" + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "route_config": { + "name": "inbound|80|http|a.apps-1-99281.svc.cluster.local", + "validate_clusters": false, + "virtual_hosts": [ + { + "name": "inbound|http|80", + "routes": [ + { + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:80/*" + }, + "route": { + "cluster": "inbound|80|http|a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "max_grpc_timeout": "0s" + }, + "match": { + "prefix": "/" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + } + } + } + } + } + } + ], + "domains": [ + "*" + ] + } + ] + }, + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "tracing": { + "random_sampling": { + "value": 1 + }, + "overall_sampling": { + "value": 100 + }, + "client_sampling": { + "value": 100 + } + }, + "stat_prefix": "10.40.3.59_8080", + "use_remote_address": false, + "set_current_client_cert_details": { + "uri": true, + "subject": true, + "dns": true + }, + "stream_idle_timeout": "0s" + } + } + ] + }, + { + "filter_chain_match": {}, + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "tracing": { + "random_sampling": { + "value": 1 + }, + "overall_sampling": { + "value": 100 + }, + "client_sampling": { + "value": 100 + } + }, + "stat_prefix": "10.40.3.59_8080", + "use_remote_address": false, + "set_current_client_cert_details": { + "dns": true, + "subject": true, + "uri": true + }, + "stream_idle_timeout": "0s", + "forward_client_cert_details": "APPEND_FORWARD", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "server_name": "istio-envoy", + "http_filters": [ + { + "config": { + "policy": { + "peers": [ + { + "mtls": { + "mode": "PERMISSIVE" + } + } + ] + } + }, + "name": "istio_authn" + }, + { + "name": "envoy.filters.http.rbac", + "config": { + "rules": { + "policies": {} + } + } + }, + { + "name": "envoy.health_check", + "config": { + "headers": [ + { + "exact_match": "/", + "name": ":path" + } + ], + "pass_through_mode": true + } + }, + { + "name": "mixer", + "config": { + "transport": { + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": {} + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "context.reporter.kind": { + "string_value": "inbound" + }, + "destination.port": { + "int64_value": "8080" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + }, + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "route_config": { + "name": "inbound|80|http|a.apps-1-99281.svc.cluster.local", + "validate_clusters": false, + "virtual_hosts": [ + { + "routes": [ + { + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:80/*" + }, + "route": { + "max_grpc_timeout": "0s", + "cluster": "inbound|80|http|a.apps-1-99281.svc.cluster.local", + "timeout": "0s" + }, + "match": { + "prefix": "/" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + } + } + } + } + } + } + ], + "domains": [ + "*" + ], + "name": "inbound|http|80" + } + ] + } + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + }, + "listener_filters": [ + { + "name": "envoy.listener.tls_inspector" + } + ] + }, + "last_updated": "2019-04-14T15:36:46.335Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.40.3.59_80", + "address": { + "socket_address": { + "address": "10.40.3.59", + "port_value": 80 + } + }, + "filter_chains": [ + { + "filter_chain_match": { + "application_protocols": [ + "istio" + ] + }, + "tls_context": { + "common_tls_context": { + "tls_certificates": [ + { + "certificate_chain": { + "filename": "/etc/certs/cert-chain.pem" + }, + "private_key": { + "filename": "/etc/certs/key.pem" + } + } + ], + "validation_context": { + "trusted_ca": { + "filename": "/etc/certs/root-cert.pem" + } + }, + "alpn_protocols": [ + "h2", + "http/1.1" + ] + }, + "require_client_certificate": true + }, + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "tracing": { + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + }, + "client_sampling": { + "value": 100 + } + }, + "stat_prefix": "10.40.3.59_80", + "use_remote_address": false, + "set_current_client_cert_details": { + "dns": true, + "uri": true, + "subject": true + }, + "stream_idle_timeout": "0s", + "forward_client_cert_details": "APPEND_FORWARD", + "server_name": "istio-envoy", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "http_filters": [ + { + "name": "istio_authn", + "config": { + "policy": { + "peers": [ + { + "mtls": { + "mode": "PERMISSIVE" + } + } + ] + } + } + }, + { + "name": "envoy.filters.http.rbac", + "config": { + "rules": { + "policies": {} + } + } + }, + { + "name": "mixer", + "config": { + "mixer_attributes": { + "attributes": { + "context.reporter.kind": { + "string_value": "inbound" + }, + "destination.port": { + "int64_value": "80" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + }, + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "service_configs": { + "default": {} + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "default_destination_service": "default" + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "route_config": { + "name": "inbound|8080|http-two|a.apps-1-99281.svc.cluster.local", + "validate_clusters": false, + "virtual_hosts": [ + { + "name": "inbound|http|8080", + "routes": [ + { + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:8080/*" + }, + "route": { + "cluster": "inbound|8080|http-two|a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "max_grpc_timeout": "0s" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + } + } + } + } + }, + "match": { + "prefix": "/" + } + } + ], + "domains": [ + "*" + ] + } + ] + } + } + } + ] + }, + { + "filter_chain_match": {}, + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "route_config": { + "name": "inbound|8080|http-two|a.apps-1-99281.svc.cluster.local", + "validate_clusters": false, + "virtual_hosts": [ + { + "routes": [ + { + "match": { + "prefix": "/" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + } + } + } + } + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:8080/*" + }, + "route": { + "max_grpc_timeout": "0s", + "cluster": "inbound|8080|http-two|a.apps-1-99281.svc.cluster.local", + "timeout": "0s" + } + } + ], + "domains": [ + "*" + ], + "name": "inbound|http|8080" + } + ] + }, + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "tracing": { + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + }, + "client_sampling": { + "value": 100 + } + }, + "stat_prefix": "10.40.3.59_80", + "use_remote_address": false, + "set_current_client_cert_details": { + "uri": true, + "subject": true, + "dns": true + }, + "stream_idle_timeout": "0s", + "forward_client_cert_details": "APPEND_FORWARD", + "server_name": "istio-envoy", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ], + "http_filters": [ + { + "name": "istio_authn", + "config": { + "policy": { + "peers": [ + { + "mtls": { + "mode": "PERMISSIVE" + } + } + ] + } + } + }, + { + "name": "envoy.filters.http.rbac", + "config": { + "rules": { + "policies": {} + } + } + }, + { + "name": "mixer", + "config": { + "service_configs": { + "default": {} + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "inbound" + }, + "destination.port": { + "int64_value": "80" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + }, + "listener_filters": [ + { + "name": "envoy.listener.tls_inspector" + } + ] + }, + "last_updated": "2019-04-14T15:36:46.342Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.40.3.59_9090", + "address": { + "socket_address": { + "address": "10.40.3.59", + "port_value": 9090 + } + }, + "filter_chains": [ + { + "filter_chain_match": { + "application_protocols": [ + "istio" + ] + }, + "tls_context": { + "common_tls_context": { + "tls_certificates": [ + { + "certificate_chain": { + "filename": "/etc/certs/cert-chain.pem" + }, + "private_key": { + "filename": "/etc/certs/key.pem" + } + } + ], + "validation_context": { + "trusted_ca": { + "filename": "/etc/certs/root-cert.pem" + } + }, + "alpn_protocols": [ + "h2", + "http/1.1" + ] + }, + "require_client_certificate": true + }, + "filters": [ + { + "name": "envoy.filters.network.rbac", + "config": { + "stat_prefix": "tcp.", + "rules": { + "policies": {} + } + } + }, + { + "name": "mixer", + "config": { + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.kind": { + "string_value": "inbound" + }, + "destination.port": { + "int64_value": "9090" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + }, + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "cluster": "inbound|90|tcp|a.apps-1-99281.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "inbound|90|tcp|a.apps-1-99281.svc.cluster.local" + } + } + ] + }, + { + "filter_chain_match": {}, + "filters": [ + { + "name": "envoy.filters.network.rbac", + "config": { + "rules": { + "policies": {} + }, + "stat_prefix": "tcp." + } + }, + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "destination.port": { + "int64_value": "9090" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + }, + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "inbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "inbound|90|tcp|a.apps-1-99281.svc.cluster.local", + "cluster": "inbound|90|tcp|a.apps-1-99281.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + }, + "listener_filters": [ + { + "name": "envoy.listener.tls_inspector" + } + ] + }, + "last_updated": "2019-04-14T15:36:46.345Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.40.3.59_90", + "address": { + "socket_address": { + "address": "10.40.3.59", + "port_value": 90 + } + }, + "filter_chains": [ + { + "filter_chain_match": { + "application_protocols": [ + "istio" + ] + }, + "tls_context": { + "common_tls_context": { + "tls_certificates": [ + { + "certificate_chain": { + "filename": "/etc/certs/cert-chain.pem" + }, + "private_key": { + "filename": "/etc/certs/key.pem" + } + } + ], + "validation_context": { + "trusted_ca": { + "filename": "/etc/certs/root-cert.pem" + } + }, + "alpn_protocols": [ + "h2", + "http/1.1" + ] + }, + "require_client_certificate": true + }, + "filters": [ + { + "name": "envoy.filters.network.rbac", + "config": { + "stat_prefix": "tcp.", + "rules": { + "policies": {} + } + } + }, + { + "name": "mixer", + "config": { + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.kind": { + "string_value": "inbound" + }, + "destination.port": { + "int64_value": "90" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + }, + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "inbound|9090|https|a.apps-1-99281.svc.cluster.local", + "cluster": "inbound|9090|https|a.apps-1-99281.svc.cluster.local" + } + } + ] + }, + { + "filter_chain_match": {}, + "filters": [ + { + "name": "envoy.filters.network.rbac", + "config": { + "stat_prefix": "tcp.", + "rules": { + "policies": {} + } + } + }, + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "destination.port": { + "int64_value": "90" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + }, + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "inbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "inbound|9090|https|a.apps-1-99281.svc.cluster.local", + "cluster": "inbound|9090|https|a.apps-1-99281.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + }, + "listener_filters": [ + { + "name": "envoy.listener.tls_inspector" + } + ] + }, + "last_updated": "2019-04-14T15:36:46.348Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.40.3.59_7070", + "address": { + "socket_address": { + "address": "10.40.3.59", + "port_value": 7070 + } + }, + "filter_chains": [ + { + "filter_chain_match": { + "application_protocols": [ + "istio" + ] + }, + "tls_context": { + "common_tls_context": { + "tls_certificates": [ + { + "certificate_chain": { + "filename": "/etc/certs/cert-chain.pem" + }, + "private_key": { + "filename": "/etc/certs/key.pem" + } + } + ], + "validation_context": { + "trusted_ca": { + "filename": "/etc/certs/root-cert.pem" + } + }, + "alpn_protocols": [ + "h2", + "http/1.1" + ] + }, + "require_client_certificate": true + }, + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "tracing": { + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + }, + "client_sampling": { + "value": 100 + } + }, + "stat_prefix": "10.40.3.59_7070", + "use_remote_address": false, + "set_current_client_cert_details": { + "dns": true, + "uri": true, + "subject": true + }, + "stream_idle_timeout": "0s", + "forward_client_cert_details": "APPEND_FORWARD", + "access_log": [ + { + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + }, + "name": "envoy.file_access_log" + } + ], + "server_name": "istio-envoy", + "http_filters": [ + { + "config": { + "policy": { + "peers": [ + { + "mtls": { + "mode": "PERMISSIVE" + } + } + ] + } + }, + "name": "istio_authn" + }, + { + "name": "envoy.filters.http.rbac", + "config": { + "rules": { + "policies": {} + } + } + }, + { + "name": "mixer", + "config": { + "service_configs": { + "default": {} + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + }, + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "inbound" + }, + "destination.port": { + "int64_value": "7070" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "http2_protocol_options": {}, + "route_config": { + "name": "inbound|70|http2-example|a.apps-1-99281.svc.cluster.local", + "validate_clusters": false, + "virtual_hosts": [ + { + "routes": [ + { + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:70/*" + }, + "route": { + "max_grpc_timeout": "0s", + "cluster": "inbound|70|http2-example|a.apps-1-99281.svc.cluster.local", + "timeout": "0s" + }, + "match": { + "prefix": "/" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + } + } + } + } + } + } + ], + "domains": [ + "*" + ], + "name": "inbound|http|70" + } + ] + } + } + } + ] + }, + { + "filter_chain_match": {}, + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "http2_protocol_options": {}, + "route_config": { + "name": "inbound|70|http2-example|a.apps-1-99281.svc.cluster.local", + "validate_clusters": false, + "virtual_hosts": [ + { + "domains": [ + "*" + ], + "name": "inbound|http|70", + "routes": [ + { + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:70/*" + }, + "route": { + "cluster": "inbound|70|http2-example|a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "max_grpc_timeout": "0s" + }, + "match": { + "prefix": "/" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + } + } + } + } + } + } + ] + } + ] + }, + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "tracing": { + "client_sampling": { + "value": 100 + }, + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + } + }, + "use_remote_address": false, + "stat_prefix": "10.40.3.59_7070", + "set_current_client_cert_details": { + "dns": true, + "uri": true, + "subject": true + }, + "stream_idle_timeout": "0s", + "forward_client_cert_details": "APPEND_FORWARD", + "server_name": "istio-envoy", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "http_filters": [ + { + "name": "istio_authn", + "config": { + "policy": { + "peers": [ + { + "mtls": { + "mode": "PERMISSIVE" + } + } + ] + } + } + }, + { + "name": "envoy.filters.http.rbac", + "config": { + "rules": { + "policies": {} + } + } + }, + { + "name": "mixer", + "config": { + "service_configs": { + "default": {} + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "destination.port": { + "int64_value": "7070" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + }, + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "inbound" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + }, + "listener_filters": [ + { + "name": "envoy.listener.tls_inspector" + } + ] + }, + "last_updated": "2019-04-14T15:36:46.355Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.40.3.59_70", + "address": { + "socket_address": { + "address": "10.40.3.59", + "port_value": 70 + } + }, + "filter_chains": [ + { + "filter_chain_match": { + "application_protocols": [ + "istio" + ] + }, + "tls_context": { + "common_tls_context": { + "tls_certificates": [ + { + "certificate_chain": { + "filename": "/etc/certs/cert-chain.pem" + }, + "private_key": { + "filename": "/etc/certs/key.pem" + } + } + ], + "validation_context": { + "trusted_ca": { + "filename": "/etc/certs/root-cert.pem" + } + }, + "alpn_protocols": [ + "h2", + "http/1.1" + ] + }, + "require_client_certificate": true + }, + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "tracing": { + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + }, + "client_sampling": { + "value": 100 + } + }, + "use_remote_address": false, + "stat_prefix": "10.40.3.59_70", + "set_current_client_cert_details": { + "subject": true, + "uri": true, + "dns": true + }, + "stream_idle_timeout": "0s", + "forward_client_cert_details": "APPEND_FORWARD", + "server_name": "istio-envoy", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "http_filters": [ + { + "name": "istio_authn", + "config": { + "policy": { + "peers": [ + { + "mtls": { + "mode": "PERMISSIVE" + } + } + ] + } + } + }, + { + "name": "envoy.filters.http.rbac", + "config": { + "rules": { + "policies": {} + } + } + }, + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": {} + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + }, + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "inbound" + }, + "destination.port": { + "int64_value": "70" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "http2_protocol_options": {}, + "route_config": { + "name": "inbound|7070|grpc|a.apps-1-99281.svc.cluster.local", + "validate_clusters": false, + "virtual_hosts": [ + { + "routes": [ + { + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:7070/*" + }, + "route": { + "max_grpc_timeout": "0s", + "cluster": "inbound|7070|grpc|a.apps-1-99281.svc.cluster.local", + "timeout": "0s" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + } + } + }, + "match": { + "prefix": "/" + } + } + ], + "domains": [ + "*" + ], + "name": "inbound|http|7070" + } + ] + }, + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ] + } + } + ] + }, + { + "filter_chain_match": {}, + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "use_remote_address": false, + "stat_prefix": "10.40.3.59_70", + "set_current_client_cert_details": { + "dns": true, + "uri": true, + "subject": true + }, + "stream_idle_timeout": "0s", + "forward_client_cert_details": "APPEND_FORWARD", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "server_name": "istio-envoy", + "http_filters": [ + { + "name": "istio_authn", + "config": { + "policy": { + "peers": [ + { + "mtls": { + "mode": "PERMISSIVE" + } + } + ] + } + } + }, + { + "name": "envoy.filters.http.rbac", + "config": { + "rules": { + "policies": {} + } + } + }, + { + "name": "mixer", + "config": { + "service_configs": { + "default": {} + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "destination.namespace": { + "string_value": "apps-1-99281" + }, + "destination.ip": { + "bytes_value": "AAAAAAAAAAAAAP//CigDOw==" + }, + "destination.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "inbound" + }, + "destination.port": { + "int64_value": "70" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "http2_protocol_options": {}, + "route_config": { + "virtual_hosts": [ + { + "domains": [ + "*" + ], + "name": "inbound|http|7070", + "routes": [ + { + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:7070/*" + }, + "route": { + "max_grpc_timeout": "0s", + "cluster": "inbound|7070|grpc|a.apps-1-99281.svc.cluster.local", + "timeout": "0s" + }, + "match": { + "prefix": "/" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + } + } + } + } + } + } + ] + } + ], + "name": "inbound|7070|grpc|a.apps-1-99281.svc.cluster.local", + "validate_clusters": false + }, + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "tracing": { + "client_sampling": { + "value": 100 + }, + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + } + } + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + }, + "listener_filters": [ + { + "name": "envoy.listener.tls_inspector" + } + ] + }, + "last_updated": "2019-04-14T15:36:46.361Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.248.28_15031", + "address": { + "socket_address": { + "address": "10.43.248.28", + "port_value": 15031 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-ingressgateway" + }, + "destination.service.host": { + "string_value": "istio-ingressgateway.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-ingressgateway" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "transport": { + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "outbound|15031||istio-ingressgateway.istio-system.svc.cluster.local", + "cluster": "outbound|15031||istio-ingressgateway.istio-system.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.362Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.247.178_9090", + "address": { + "socket_address": { + "address": "10.43.247.178", + "port_value": 9090 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "c.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/c" + }, + "destination.service.name": { + "string_value": "c" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|9090||c.apps-1-99281.svc.cluster.local", + "cluster": "outbound|9090||c.apps-1-99281.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.363Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.254.82_90", + "address": { + "socket_address": { + "address": "10.43.254.82", + "port_value": 90 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/d" + }, + "destination.service.host": { + "string_value": "d.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "d" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "outbound|90||d.apps-1-99281.svc.cluster.local", + "cluster": "outbound|90||d.apps-1-99281.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.364Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.241.25_443", + "address": { + "socket_address": { + "address": "10.43.241.25", + "port_value": 443 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "metrics-server.kube-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://kube-system/services/metrics-server" + }, + "destination.service.name": { + "string_value": "metrics-server" + }, + "destination.service.namespace": { + "string_value": "kube-system" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + }, + "name": "envoy.file_access_log" + } + ], + "stat_prefix": "outbound|443||metrics-server.kube-system.svc.cluster.local", + "cluster": "outbound|443||metrics-server.kube-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.365Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.248.28_443", + "address": { + "socket_address": { + "address": "10.43.248.28", + "port_value": 443 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "istio-ingressgateway.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-ingressgateway" + }, + "destination.service.name": { + "string_value": "istio-ingressgateway" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "cluster": "outbound|443||istio-ingressgateway.istio-system.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|443||istio-ingressgateway.istio-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.366Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.254.82_9090", + "address": { + "socket_address": { + "address": "10.43.254.82", + "port_value": 9090 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/d" + }, + "destination.service.host": { + "string_value": "d.apps-1-99281.svc.cluster.local" + }, + "destination.service.name": { + "string_value": "d" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|9090||d.apps-1-99281.svc.cluster.local", + "cluster": "outbound|9090||d.apps-1-99281.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.367Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.247.178_90", + "address": { + "socket_address": { + "address": "10.43.247.178", + "port_value": 90 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + } + }, + "mixer_attributes": { + "attributes": { + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "c.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/c" + }, + "destination.service.name": { + "string_value": "c" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "disable_check_calls": true + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "outbound|90||c.apps-1-99281.svc.cluster.local", + "cluster": "outbound|90||c.apps-1-99281.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.369Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.240.1_443", + "address": { + "socket_address": { + "address": "10.43.240.1", + "port_value": 443 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + } + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://default/services/kubernetes" + }, + "destination.service.host": { + "string_value": "kubernetes.default.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "default" + }, + "destination.service.name": { + "string_value": "kubernetes" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|443||kubernetes.default.svc.cluster.local", + "cluster": "outbound|443||kubernetes.default.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.370Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.253.48_90", + "address": { + "socket_address": { + "address": "10.43.253.48", + "port_value": 90 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "t.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/t" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "t" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + } + } + }, + "disable_check_calls": true + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ], + "stat_prefix": "outbound|90||t.apps-1-99281.svc.cluster.local", + "cluster": "outbound|90||t.apps-1-99281.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.371Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.245.70_443", + "address": { + "socket_address": { + "address": "10.43.245.70", + "port_value": 443 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-egressgateway.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-egressgateway" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-egressgateway" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + } + } + }, + "transport": { + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|443||istio-egressgateway.istio-system.svc.cluster.local", + "cluster": "outbound|443||istio-egressgateway.istio-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.372Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.248.28_15443", + "address": { + "socket_address": { + "address": "10.43.248.28", + "port_value": 15443 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-ingressgateway" + }, + "destination.service.host": { + "string_value": "istio-ingressgateway.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-ingressgateway" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "cluster": "outbound|15443||istio-ingressgateway.istio-system.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ], + "stat_prefix": "outbound|15443||istio-ingressgateway.istio-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.373Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.248.28_15020", + "address": { + "socket_address": { + "address": "10.43.248.28", + "port_value": 15020 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "istio-ingressgateway.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-ingressgateway" + }, + "destination.service.name": { + "string_value": "istio-ingressgateway" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "outbound|15020||istio-ingressgateway.istio-system.svc.cluster.local", + "cluster": "outbound|15020||istio-ingressgateway.istio-system.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.374Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.252.161_5000", + "address": { + "socket_address": { + "address": "10.43.252.161", + "port_value": 5000 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "destination.service.name": { + "string_value": "kube-registry" + }, + "destination.service.namespace": { + "string_value": "kube-system" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "kube-registry.kube-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://kube-system/services/kube-registry" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ], + "stat_prefix": "outbound|5000||kube-registry.kube-system.svc.cluster.local", + "cluster": "outbound|5000||kube-registry.kube-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.375Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.245.70_15443", + "address": { + "socket_address": { + "address": "10.43.245.70", + "port_value": 15443 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-egressgateway" + }, + "destination.service.host": { + "string_value": "istio-egressgateway.istio-system.svc.cluster.local" + }, + "destination.service.name": { + "string_value": "istio-egressgateway" + }, + "destination.service.namespace": { + "string_value": "istio-system" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "outbound|15443||istio-egressgateway.istio-system.svc.cluster.local", + "cluster": "outbound|15443||istio-egressgateway.istio-system.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.376Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.248.28_15032", + "address": { + "socket_address": { + "address": "10.43.248.28", + "port_value": 15032 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "istio-ingressgateway.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-ingressgateway" + }, + "destination.service.name": { + "string_value": "istio-ingressgateway" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ], + "stat_prefix": "outbound|15032||istio-ingressgateway.istio-system.svc.cluster.local", + "cluster": "outbound|15032||istio-ingressgateway.istio-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.376Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.248.244_15011", + "address": { + "socket_address": { + "address": "10.43.248.244", + "port_value": 15011 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "mixer_attributes": { + "attributes": { + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-pilot" + }, + "destination.service.host": { + "string_value": "istio-pilot.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-pilot" + } + } + }, + "disable_check_calls": true, + "transport": { + "network_fail_policy": { + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "cluster": "outbound|15011||istio-pilot.istio-system.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|15011||istio-pilot.istio-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.379Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.255.211_443", + "address": { + "socket_address": { + "address": "10.43.255.211", + "port_value": 443 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "istio-sidecar-injector.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-sidecar-injector" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-sidecar-injector" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ], + "stat_prefix": "outbound|443||istio-sidecar-injector.istio-system.svc.cluster.local", + "cluster": "outbound|443||istio-sidecar-injector.istio-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.379Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.241.185_90", + "address": { + "socket_address": { + "address": "10.43.241.185", + "port_value": 90 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/b" + }, + "destination.service.host": { + "string_value": "b.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "b" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ], + "stat_prefix": "outbound|90||b.apps-1-99281.svc.cluster.local", + "cluster": "outbound|90||b.apps-1-99281.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.380Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.252.166_80", + "address": { + "socket_address": { + "address": "10.43.252.166", + "port_value": 80 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://kube-system/services/heapster" + }, + "destination.service.host": { + "string_value": "heapster.kube-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "kube-system" + }, + "destination.service.name": { + "string_value": "heapster" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|80||heapster.kube-system.svc.cluster.local", + "cluster": "outbound|80||heapster.kube-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.381Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.240.10_53", + "address": { + "socket_address": { + "address": "10.43.240.10", + "port_value": 53 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "kube-dns.kube-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://kube-system/services/kube-dns" + }, + "destination.service.name": { + "string_value": "kube-dns" + }, + "destination.service.namespace": { + "string_value": "kube-system" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|53||kube-dns.kube-system.svc.cluster.local", + "cluster": "outbound|53||kube-dns.kube-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.382Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.240.145_443", + "address": { + "socket_address": { + "address": "10.43.240.145", + "port_value": 443 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "destination.service.name": { + "string_value": "istio-galley" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-galley" + }, + "destination.service.host": { + "string_value": "istio-galley.istio-system.svc.cluster.local" + } + } + }, + "transport": { + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "outbound|443||istio-galley.istio-system.svc.cluster.local", + "cluster": "outbound|443||istio-galley.istio-system.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.383Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.248.28_31400", + "address": { + "socket_address": { + "address": "10.43.248.28", + "port_value": 31400 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-ingressgateway" + }, + "destination.service.host": { + "string_value": "istio-ingressgateway.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-ingressgateway" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + }, + "disable_check_calls": true + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|31400||istio-ingressgateway.istio-system.svc.cluster.local", + "cluster": "outbound|31400||istio-ingressgateway.istio-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.384Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.255.188_42422", + "address": { + "socket_address": { + "address": "10.43.255.188", + "port_value": 42422 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "istio-telemetry.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-telemetry" + }, + "destination.service.name": { + "string_value": "istio-telemetry" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|42422||istio-telemetry.istio-system.svc.cluster.local", + "cluster": "outbound|42422||istio-telemetry.istio-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.385Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.253.48_9090", + "address": { + "socket_address": { + "address": "10.43.253.48", + "port_value": 9090 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "t.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/t" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "t" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|9090||t.apps-1-99281.svc.cluster.local", + "cluster": "outbound|9090||t.apps-1-99281.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.386Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.242.41_9090", + "address": { + "socket_address": { + "address": "10.43.242.41", + "port_value": 9090 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + } + } + }, + "disable_check_calls": true + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "outbound|9090||a.apps-1-99281.svc.cluster.local", + "cluster": "outbound|9090||a.apps-1-99281.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.388Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.241.185_9090", + "address": { + "socket_address": { + "address": "10.43.241.185", + "port_value": 9090 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/b" + }, + "destination.service.host": { + "string_value": "b.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "b" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|9090||b.apps-1-99281.svc.cluster.local", + "cluster": "outbound|9090||b.apps-1-99281.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.389Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.247.229_443", + "address": { + "socket_address": { + "address": "10.43.247.229", + "port_value": 443 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + }, + "mixer_attributes": { + "attributes": { + "destination.service.name": { + "string_value": "kubernetes-dashboard" + }, + "destination.service.namespace": { + "string_value": "kube-system" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "kubernetes-dashboard.kube-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://kube-system/services/kubernetes-dashboard" + } + } + }, + "disable_check_calls": true + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "cluster": "outbound|443||kubernetes-dashboard.kube-system.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|443||kubernetes-dashboard.kube-system.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.390Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.252.202_44134", + "address": { + "socket_address": { + "address": "10.43.252.202", + "port_value": 44134 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "destination.service.name": { + "string_value": "tiller-deploy" + }, + "destination.service.namespace": { + "string_value": "kube-system" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "tiller-deploy.kube-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://kube-system/services/tiller-deploy" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "outbound|44134||tiller-deploy.kube-system.svc.cluster.local", + "cluster": "outbound|44134||tiller-deploy.kube-system.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.391Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.248.28_15029", + "address": { + "socket_address": { + "address": "10.43.248.28", + "port_value": 15029 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "istio-ingressgateway.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-ingressgateway" + }, + "destination.service.name": { + "string_value": "istio-ingressgateway" + }, + "destination.service.namespace": { + "string_value": "istio-system" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "outbound|15029||istio-ingressgateway.istio-system.svc.cluster.local", + "cluster": "outbound|15029||istio-ingressgateway.istio-system.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.392Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.248.28_15030", + "address": { + "socket_address": { + "address": "10.43.248.28", + "port_value": 15030 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s" + } + }, + "mixer_attributes": { + "attributes": { + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-ingressgateway" + }, + "destination.service.host": { + "string_value": "istio-ingressgateway.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-ingressgateway" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "disable_check_calls": true + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "outbound|15030||istio-ingressgateway.istio-system.svc.cluster.local", + "cluster": "outbound|15030||istio-ingressgateway.istio-system.svc.cluster.local", + "access_log": [ + { + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + }, + "name": "envoy.file_access_log" + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.393Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.43.242.41_90", + "address": { + "socket_address": { + "address": "10.43.242.41", + "port_value": 90 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "outbound|90||a.apps-1-99281.svc.cluster.local", + "cluster": "outbound|90||a.apps-1-99281.svc.cluster.local" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.395Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_10090", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 10090 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "disable_check_calls": true, + "mixer_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/headless" + }, + "destination.service.host": { + "string_value": "headless.apps-1-99281.svc.cluster.local" + }, + "destination.service.name": { + "string_value": "headless" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "outbound|10090||headless.apps-1-99281.svc.cluster.local", + "cluster": "outbound|10090||headless.apps-1-99281.svc.cluster.local", + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.396Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_9901", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 9901 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "http_filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": { + "disable_check_calls": true + } + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "forward_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "tracing": { + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + }, + "operation_name": "EGRESS", + "client_sampling": { + "value": 100 + } + }, + "use_remote_address": false, + "rds": { + "route_config_name": "9901", + "config_source": { + "ads": {} + } + }, + "stat_prefix": "0.0.0.0_9901", + "stream_idle_timeout": "0s", + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.399Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_15004", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 15004 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "tracing": { + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + }, + "client_sampling": { + "value": 100 + }, + "operation_name": "EGRESS" + }, + "stat_prefix": "0.0.0.0_15004", + "rds": { + "route_config_name": "15004", + "config_source": { + "ads": {} + } + }, + "use_remote_address": false, + "generate_request_id": true, + "stream_idle_timeout": "0s", + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "http_filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": { + "disable_check_calls": true + } + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "source.namespace": { + "string_value": "apps-1-99281" + } + } + }, + "forward_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.409Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_8060", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 8060 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "tracing": { + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + }, + "client_sampling": { + "value": 100 + }, + "operation_name": "EGRESS" + }, + "use_remote_address": false, + "stat_prefix": "0.0.0.0_8060", + "rds": { + "config_source": { + "ads": {} + }, + "route_config_name": "8060" + }, + "generate_request_id": true, + "stream_idle_timeout": "0s", + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "http_filters": [ + { + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": { + "disable_check_calls": true + } + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "forward_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + }, + "name": "mixer" + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.411Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_15010", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 15010 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "tracing": { + "client_sampling": { + "value": 100 + }, + "operation_name": "EGRESS", + "random_sampling": { + "value": 1 + }, + "overall_sampling": { + "value": 100 + } + }, + "use_remote_address": false, + "rds": { + "route_config_name": "15010", + "config_source": { + "ads": {} + } + }, + "stat_prefix": "0.0.0.0_15010", + "stream_idle_timeout": "0s", + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ], + "http_filters": [ + { + "name": "mixer", + "config": { + "transport": { + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": { + "disable_check_calls": true + } + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "forward_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.413Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_70", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 70 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "stat_prefix": "0.0.0.0_70", + "use_remote_address": false, + "rds": { + "route_config_name": "70", + "config_source": { + "ads": {} + } + }, + "generate_request_id": true, + "stream_idle_timeout": "0s", + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + } + } + ], + "http_filters": [ + { + "name": "mixer", + "config": { + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": { + "disable_check_calls": true + } + }, + "default_destination_service": "default", + "forward_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "mixer_attributes": { + "attributes": { + "context.reporter.kind": { + "string_value": "outbound" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "tracing": { + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + }, + "operation_name": "EGRESS", + "client_sampling": { + "value": 100 + } + } + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.415Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_7070", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 7070 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "rds": { + "config_source": { + "ads": {} + }, + "route_config_name": "7070" + }, + "stat_prefix": "0.0.0.0_7070", + "use_remote_address": false, + "generate_request_id": true, + "stream_idle_timeout": "0s", + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "access_log": [ + { + "config": { + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n", + "path": "/dev/stdout" + }, + "name": "envoy.file_access_log" + } + ], + "http_filters": [ + { + "name": "mixer", + "config": { + "transport": { + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": { + "disable_check_calls": true + } + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "forward_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "tracing": { + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + }, + "operation_name": "EGRESS", + "client_sampling": { + "value": 100 + } + } + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.416Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_15014", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 15014 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "stat_prefix": "0.0.0.0_15014", + "use_remote_address": false, + "rds": { + "route_config_name": "15014", + "config_source": { + "ads": {} + } + }, + "generate_request_id": true, + "stream_idle_timeout": "0s", + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "http_filters": [ + { + "name": "mixer", + "config": { + "service_configs": { + "default": { + "disable_check_calls": true + } + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "forward_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "tracing": { + "client_sampling": { + "value": 100 + }, + "operation_name": "EGRESS", + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + } + } + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.418Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_9090", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 9090 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "generate_request_id": true, + "stream_idle_timeout": "0s", + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "http_filters": [ + { + "name": "mixer", + "config": { + "transport": { + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": { + "disable_check_calls": true + } + }, + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "forward_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "tracing": { + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + }, + "client_sampling": { + "value": 100 + }, + "operation_name": "EGRESS" + }, + "rds": { + "route_config_name": "9090", + "config_source": { + "ads": {} + } + }, + "stat_prefix": "0.0.0.0_9090", + "use_remote_address": false + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.419Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_8080", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 8080 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "tracing": { + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + }, + "client_sampling": { + "value": 100 + }, + "operation_name": "EGRESS" + }, + "use_remote_address": false, + "rds": { + "config_source": { + "ads": {} + }, + "route_config_name": "8080" + }, + "stat_prefix": "0.0.0.0_8080", + "stream_idle_timeout": "0s", + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "http_filters": [ + { + "name": "mixer", + "config": { + "mixer_attributes": { + "attributes": { + "source.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + } + } + }, + "forward_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "transport": { + "network_fail_policy": { + "max_retry_wait": "1s", + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": { + "disable_check_calls": true + } + }, + "default_destination_service": "default" + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.422Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_80", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 80 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "http_filters": [ + { + "name": "mixer", + "config": { + "mixer_attributes": { + "attributes": { + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "context.reporter.kind": { + "string_value": "outbound" + }, + "source.namespace": { + "string_value": "apps-1-99281" + } + } + }, + "forward_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s", + "base_retry_wait": "0.080s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": { + "disable_check_calls": true + } + }, + "default_destination_service": "default" + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "tracing": { + "operation_name": "EGRESS", + "client_sampling": { + "value": 100 + }, + "overall_sampling": { + "value": 100 + }, + "random_sampling": { + "value": 1 + } + }, + "use_remote_address": false, + "rds": { + "route_config_name": "80", + "config_source": { + "ads": {} + } + }, + "stat_prefix": "0.0.0.0_80", + "generate_request_id": true, + "stream_idle_timeout": "0s", + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "access_log": [ + { + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + }, + "name": "envoy.file_access_log" + } + ] + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.423Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "0.0.0.0_9091", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 9091 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.http_connection_manager", + "config": { + "stream_idle_timeout": "0s", + "generate_request_id": true, + "upgrade_configs": [ + { + "upgrade_type": "websocket" + } + ], + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "http_filters": [ + { + "name": "mixer", + "config": { + "default_destination_service": "default", + "mixer_attributes": { + "attributes": { + "context.reporter.kind": { + "string_value": "outbound" + }, + "source.namespace": { + "string_value": "apps-1-99281" + }, + "context.reporter.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + }, + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "forward_attributes": { + "attributes": { + "source.uid": { + "string_value": "kubernetes://a-6bb6dbdcc5-z58cx.apps-1-99281" + } + } + }, + "transport": { + "check_cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "network_fail_policy": { + "base_retry_wait": "0.080s", + "policy": "FAIL_CLOSE", + "max_retry_wait": "1s" + }, + "report_cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local" + }, + "service_configs": { + "default": { + "disable_check_calls": true + } + } + } + }, + { + "name": "envoy.cors" + }, + { + "name": "envoy.fault" + }, + { + "name": "envoy.router" + } + ], + "tracing": { + "random_sampling": { + "value": 1 + }, + "overall_sampling": { + "value": 100 + }, + "client_sampling": { + "value": 100 + }, + "operation_name": "EGRESS" + }, + "use_remote_address": false, + "stat_prefix": "0.0.0.0_9091", + "rds": { + "route_config_name": "9091", + "config_source": { + "ads": {} + } + } + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.425Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.40.3.59_3333", + "address": { + "socket_address": { + "address": "10.40.3.59", + "port_value": 3333 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + }, + "name": "envoy.file_access_log" + } + ], + "stat_prefix": "inbound|3333|mgmt-3333|mgmtCluster", + "cluster": "inbound|3333|mgmt-3333|mgmtCluster" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.425Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "10.40.3.59_15020", + "address": { + "socket_address": { + "address": "10.40.3.59", + "port_value": 15020 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.tcp_proxy", + "config": { + "access_log": [ + { + "name": "envoy.file_access_log", + "config": { + "path": "/dev/stdout", + "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME%\n" + } + } + ], + "stat_prefix": "inbound|15020|mgmt-15020|mgmtCluster", + "cluster": "inbound|15020|mgmt-15020|mgmtCluster" + } + } + ] + } + ], + "deprecated_v1": { + "bind_to_port": false + } + }, + "last_updated": "2019-04-14T15:36:46.426Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "listener": { + "name": "virtual", + "address": { + "socket_address": { + "address": "0.0.0.0", + "port_value": 15001 + } + }, + "filter_chains": [ + { + "filters": [ + { + "name": "envoy.tcp_proxy", + "config": { + "stat_prefix": "BlackHoleCluster", + "cluster": "BlackHoleCluster" + } + } + ] + } + ], + "use_original_dst": true + }, + "last_updated": "2019-04-14T15:36:46.426Z" + } + ] + }, + { + "@type": "type.googleapis.com/envoy.admin.v2alpha.RoutesConfigDump", + "static_route_configs": [ + { + "route_config": { + "name": "inbound|7070|grpc|a.apps-1-99281.svc.cluster.local", + "virtual_hosts": [ + { + "name": "inbound|http|7070", + "domains": [ + "*" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "inbound|7070|grpc|a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:7070/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.name": { + "string_value": "a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:36:46.360Z" + }, + { + "route_config": { + "name": "inbound|7070|grpc|a.apps-1-99281.svc.cluster.local", + "virtual_hosts": [ + { + "name": "inbound|http|7070", + "domains": [ + "*" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "inbound|7070|grpc|a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:7070/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:36:46.358Z" + }, + { + "route_config": { + "name": "inbound|70|http2-example|a.apps-1-99281.svc.cluster.local", + "virtual_hosts": [ + { + "name": "inbound|http|70", + "domains": [ + "*" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "inbound|70|http2-example|a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:70/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.name": { + "string_value": "a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:36:46.354Z" + }, + { + "route_config": { + "name": "inbound|70|http2-example|a.apps-1-99281.svc.cluster.local", + "virtual_hosts": [ + { + "name": "inbound|http|70", + "domains": [ + "*" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "inbound|70|http2-example|a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:70/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:36:46.352Z" + }, + { + "route_config": { + "name": "inbound|8080|http-two|a.apps-1-99281.svc.cluster.local", + "virtual_hosts": [ + { + "name": "inbound|http|8080", + "domains": [ + "*" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "inbound|8080|http-two|a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:8080/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:36:46.341Z" + }, + { + "route_config": { + "virtual_hosts": [ + { + "name": "backend", + "domains": [ + "*" + ], + "routes": [ + { + "match": { + "prefix": "/stats/prometheus" + }, + "route": { + "cluster": "prometheus_stats" + } + } + ] + } + ] + }, + "last_updated": "2019-04-14T15:36:45.323Z" + }, + { + "route_config": { + "name": "inbound|80|http|a.apps-1-99281.svc.cluster.local", + "virtual_hosts": [ + { + "name": "inbound|http|80", + "domains": [ + "*" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "inbound|80|http|a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:80/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:36:46.334Z" + }, + { + "route_config": { + "name": "inbound|80|http|a.apps-1-99281.svc.cluster.local", + "virtual_hosts": [ + { + "name": "inbound|http|80", + "domains": [ + "*" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "inbound|80|http|a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:80/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:36:46.331Z" + }, + { + "route_config": { + "name": "inbound|8080|http-two|a.apps-1-99281.svc.cluster.local", + "virtual_hosts": [ + { + "name": "inbound|http|8080", + "domains": [ + "*" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "inbound|8080|http-two|a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:8080/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:36:46.339Z" + } + ], + "dynamic_route_configs": [ + { + "version_info": "2019-04-14T15:36:44Z/18", + "route_config": { + "name": "8060", + "virtual_hosts": [ + { + "name": "istio-citadel.istio-system.svc.cluster.local:8060", + "domains": [ + "istio-citadel.istio-system.svc.cluster.local", + "istio-citadel.istio-system.svc.cluster.local:8060", + "istio-citadel.istio-system", + "istio-citadel.istio-system:8060", + "istio-citadel.istio-system.svc.cluster", + "istio-citadel.istio-system.svc.cluster:8060", + "istio-citadel.istio-system.svc", + "istio-citadel.istio-system.svc:8060", + "10.43.251.158", + "10.43.251.158:8060" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|8060||istio-citadel.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-citadel.istio-system.svc.cluster.local:8060/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-citadel.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-citadel" + }, + "destination.service.name": { + "string_value": "istio-citadel" + }, + "destination.service.namespace": { + "string_value": "istio-system" + } + } + }, + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-citadel" + }, + "destination.service.host": { + "string_value": "istio-citadel.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-citadel" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:38:43.541Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "route_config": { + "name": "70", + "virtual_hosts": [ + { + "name": "a.apps-1-99281.svc.cluster.local:70", + "domains": [ + "a.apps-1-99281.svc.cluster.local", + "a.apps-1-99281.svc.cluster.local:70", + "a", + "a:70", + "a.apps-1-99281.svc.cluster", + "a.apps-1-99281.svc.cluster:70", + "a.apps-1-99281.svc", + "a.apps-1-99281.svc:70", + "a.apps-1-99281", + "a.apps-1-99281:70", + "10.43.242.41", + "10.43.242.41:70" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|70||a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:70/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "b.apps-1-99281.svc.cluster.local:70", + "domains": [ + "b.apps-1-99281.svc.cluster.local", + "b.apps-1-99281.svc.cluster.local:70", + "b", + "b:70", + "b.apps-1-99281.svc.cluster", + "b.apps-1-99281.svc.cluster:70", + "b.apps-1-99281.svc", + "b.apps-1-99281.svc:70", + "b.apps-1-99281", + "b.apps-1-99281:70", + "10.43.241.185", + "10.43.241.185:70" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|70||b.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "b.apps-1-99281.svc.cluster.local:70/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/b" + }, + "destination.service.host": { + "string_value": "b.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "b" + } + } + }, + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "b.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/b" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "b" + } + } + } + } + } + } + ] + }, + { + "name": "c.apps-1-99281.svc.cluster.local:70", + "domains": [ + "c.apps-1-99281.svc.cluster.local", + "c.apps-1-99281.svc.cluster.local:70", + "c", + "c:70", + "c.apps-1-99281.svc.cluster", + "c.apps-1-99281.svc.cluster:70", + "c.apps-1-99281.svc", + "c.apps-1-99281.svc:70", + "c.apps-1-99281", + "c.apps-1-99281:70", + "10.43.247.178", + "10.43.247.178:70" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|70||c.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "c.apps-1-99281.svc.cluster.local:70/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/c" + }, + "destination.service.host": { + "string_value": "c.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "c" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/c" + }, + "destination.service.host": { + "string_value": "c.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "c" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "d.apps-1-99281.svc.cluster.local:70", + "domains": [ + "d.apps-1-99281.svc.cluster.local", + "d.apps-1-99281.svc.cluster.local:70", + "d", + "d:70", + "d.apps-1-99281.svc.cluster", + "d.apps-1-99281.svc.cluster:70", + "d.apps-1-99281.svc", + "d.apps-1-99281.svc:70", + "d.apps-1-99281", + "d.apps-1-99281:70", + "10.43.254.82", + "10.43.254.82:70" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|70||d.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "d.apps-1-99281.svc.cluster.local:70/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "d.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/d" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "d" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "d" + }, + "destination.service.host": { + "string_value": "d.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/d" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "headless.apps-1-99281.svc.cluster.local:70", + "domains": [ + "headless.apps-1-99281.svc.cluster.local", + "headless.apps-1-99281.svc.cluster.local:70", + "headless", + "headless:70", + "headless.apps-1-99281.svc.cluster", + "headless.apps-1-99281.svc.cluster:70", + "headless.apps-1-99281.svc", + "headless.apps-1-99281.svc:70", + "headless.apps-1-99281", + "headless.apps-1-99281:70" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|70||headless.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "headless.apps-1-99281.svc.cluster.local:70/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "headless" + }, + "destination.service.host": { + "string_value": "headless.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/headless" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "headless.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/headless" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "headless" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "t.apps-1-99281.svc.cluster.local:70", + "domains": [ + "t.apps-1-99281.svc.cluster.local", + "t.apps-1-99281.svc.cluster.local:70", + "t", + "t:70", + "t.apps-1-99281.svc.cluster", + "t.apps-1-99281.svc.cluster:70", + "t.apps-1-99281.svc", + "t.apps-1-99281.svc:70", + "t.apps-1-99281", + "t.apps-1-99281:70", + "10.43.253.48", + "10.43.253.48:70" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|70||t.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "t.apps-1-99281.svc.cluster.local:70/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "t" + }, + "destination.service.host": { + "string_value": "t.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/t" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "t.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/t" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "t" + } + } + }, + "disable_check_calls": true + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:38:43.540Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "route_config": { + "name": "15004", + "virtual_hosts": [ + { + "name": "istio-policy.istio-system.svc.cluster.local:15004", + "domains": [ + "istio-policy.istio-system.svc.cluster.local", + "istio-policy.istio-system.svc.cluster.local:15004", + "istio-policy.istio-system", + "istio-policy.istio-system:15004", + "istio-policy.istio-system.svc.cluster", + "istio-policy.istio-system.svc.cluster:15004", + "istio-policy.istio-system.svc", + "istio-policy.istio-system.svc:15004", + "10.43.251.210", + "10.43.251.210:15004" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|15004||istio-policy.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-policy.istio-system.svc.cluster.local:15004/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-policy.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-policy" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-policy" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-policy.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-policy" + }, + "destination.service.name": { + "string_value": "istio-policy" + }, + "destination.service.namespace": { + "string_value": "istio-system" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "istio-telemetry.istio-system.svc.cluster.local:15004", + "domains": [ + "istio-telemetry.istio-system.svc.cluster.local", + "istio-telemetry.istio-system.svc.cluster.local:15004", + "istio-telemetry.istio-system", + "istio-telemetry.istio-system:15004", + "istio-telemetry.istio-system.svc.cluster", + "istio-telemetry.istio-system.svc.cluster:15004", + "istio-telemetry.istio-system.svc", + "istio-telemetry.istio-system.svc:15004", + "10.43.255.188", + "10.43.255.188:15004" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|15004||istio-telemetry.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-telemetry.istio-system.svc.cluster.local:15004/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.name": { + "string_value": "istio-telemetry" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.host": { + "string_value": "istio-telemetry.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-telemetry" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-telemetry.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-telemetry" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-telemetry" + } + } + }, + "disable_check_calls": true + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:38:43.541Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "route_config": { + "name": "15010", + "virtual_hosts": [ + { + "name": "istio-pilot.istio-system.svc.cluster.local:15010", + "domains": [ + "istio-pilot.istio-system.svc.cluster.local", + "istio-pilot.istio-system.svc.cluster.local:15010", + "istio-pilot.istio-system", + "istio-pilot.istio-system:15010", + "istio-pilot.istio-system.svc.cluster", + "istio-pilot.istio-system.svc.cluster:15010", + "istio-pilot.istio-system.svc", + "istio-pilot.istio-system.svc:15010", + "10.43.248.244", + "10.43.248.244:15010" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|15010||istio-pilot.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-pilot.istio-system.svc.cluster.local:15010/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-pilot.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-pilot" + }, + "destination.service.name": { + "string_value": "istio-pilot" + }, + "destination.service.namespace": { + "string_value": "istio-system" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-pilot" + }, + "destination.service.host": { + "string_value": "istio-pilot.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-pilot" + } + } + }, + "disable_check_calls": true + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:38:43.541Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "route_config": { + "name": "9901", + "virtual_hosts": [ + { + "name": "istio-galley.istio-system.svc.cluster.local:9901", + "domains": [ + "istio-galley.istio-system.svc.cluster.local", + "istio-galley.istio-system.svc.cluster.local:9901", + "istio-galley.istio-system", + "istio-galley.istio-system:9901", + "istio-galley.istio-system.svc.cluster", + "istio-galley.istio-system.svc.cluster:9901", + "istio-galley.istio-system.svc", + "istio-galley.istio-system.svc:9901", + "10.43.240.145", + "10.43.240.145:9901" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|9901||istio-galley.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-galley.istio-system.svc.cluster.local:9901/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-galley" + }, + "destination.service.host": { + "string_value": "istio-galley.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-galley" + } + } + }, + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-galley" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-galley" + }, + "destination.service.host": { + "string_value": "istio-galley.istio-system.svc.cluster.local" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:38:43.541Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "route_config": { + "name": "9090", + "virtual_hosts": [ + { + "name": "prometheus.istio-system.svc.cluster.local:9090", + "domains": [ + "prometheus.istio-system.svc.cluster.local", + "prometheus.istio-system.svc.cluster.local:9090", + "prometheus.istio-system", + "prometheus.istio-system:9090", + "prometheus.istio-system.svc.cluster", + "prometheus.istio-system.svc.cluster:9090", + "prometheus.istio-system.svc", + "prometheus.istio-system.svc:9090", + "10.43.240.118", + "10.43.240.118:9090" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|9090||prometheus.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "prometheus.istio-system.svc.cluster.local:9090/*" + }, + "per_filter_config": { + "mixer": { + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://istio-system/services/prometheus" + }, + "destination.service.host": { + "string_value": "prometheus.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "prometheus" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://istio-system/services/prometheus" + }, + "destination.service.host": { + "string_value": "prometheus.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "prometheus" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:38:43.539Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "route_config": { + "name": "7070", + "virtual_hosts": [ + { + "name": "a.apps-1-99281.svc.cluster.local:7070", + "domains": [ + "a.apps-1-99281.svc.cluster.local", + "a.apps-1-99281.svc.cluster.local:7070", + "a", + "a:7070", + "a.apps-1-99281.svc.cluster", + "a.apps-1-99281.svc.cluster:7070", + "a.apps-1-99281.svc", + "a.apps-1-99281.svc:7070", + "a.apps-1-99281", + "a.apps-1-99281:7070", + "10.43.242.41", + "10.43.242.41:7070" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|7070||a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:7070/*" + }, + "per_filter_config": { + "mixer": { + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + } + } + } + } + } + } + ] + }, + { + "name": "b.apps-1-99281.svc.cluster.local:7070", + "domains": [ + "b.apps-1-99281.svc.cluster.local", + "b.apps-1-99281.svc.cluster.local:7070", + "b", + "b:7070", + "b.apps-1-99281.svc.cluster", + "b.apps-1-99281.svc.cluster:7070", + "b.apps-1-99281.svc", + "b.apps-1-99281.svc:7070", + "b.apps-1-99281", + "b.apps-1-99281:7070", + "10.43.241.185", + "10.43.241.185:7070" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|7070||b.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "b.apps-1-99281.svc.cluster.local:7070/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "b.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/b" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "b" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "b.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/b" + }, + "destination.service.name": { + "string_value": "b" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "c.apps-1-99281.svc.cluster.local:7070", + "domains": [ + "c.apps-1-99281.svc.cluster.local", + "c.apps-1-99281.svc.cluster.local:7070", + "c", + "c:7070", + "c.apps-1-99281.svc.cluster", + "c.apps-1-99281.svc.cluster:7070", + "c.apps-1-99281.svc", + "c.apps-1-99281.svc:7070", + "c.apps-1-99281", + "c.apps-1-99281:7070", + "10.43.247.178", + "10.43.247.178:7070" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|7070||c.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "c.apps-1-99281.svc.cluster.local:7070/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "c.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/c" + }, + "destination.service.name": { + "string_value": "c" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "c.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/c" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "c" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "d.apps-1-99281.svc.cluster.local:7070", + "domains": [ + "d.apps-1-99281.svc.cluster.local", + "d.apps-1-99281.svc.cluster.local:7070", + "d", + "d:7070", + "d.apps-1-99281.svc.cluster", + "d.apps-1-99281.svc.cluster:7070", + "d.apps-1-99281.svc", + "d.apps-1-99281.svc:7070", + "d.apps-1-99281", + "d.apps-1-99281:7070", + "10.43.254.82", + "10.43.254.82:7070" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|7070||d.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "d.apps-1-99281.svc.cluster.local:7070/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "d.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/d" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "d" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "d.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/d" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "d" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "headless.apps-1-99281.svc.cluster.local:7070", + "domains": [ + "headless.apps-1-99281.svc.cluster.local", + "headless.apps-1-99281.svc.cluster.local:7070", + "headless", + "headless:7070", + "headless.apps-1-99281.svc.cluster", + "headless.apps-1-99281.svc.cluster:7070", + "headless.apps-1-99281.svc", + "headless.apps-1-99281.svc:7070", + "headless.apps-1-99281", + "headless.apps-1-99281:7070" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|7070||headless.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "headless.apps-1-99281.svc.cluster.local:7070/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "headless.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/headless" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "headless" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "headless" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/headless" + }, + "destination.service.host": { + "string_value": "headless.apps-1-99281.svc.cluster.local" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "t.apps-1-99281.svc.cluster.local:7070", + "domains": [ + "t.apps-1-99281.svc.cluster.local", + "t.apps-1-99281.svc.cluster.local:7070", + "t", + "t:7070", + "t.apps-1-99281.svc.cluster", + "t.apps-1-99281.svc.cluster:7070", + "t.apps-1-99281.svc", + "t.apps-1-99281.svc:7070", + "t.apps-1-99281", + "t.apps-1-99281:7070", + "10.43.253.48", + "10.43.253.48:7070" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|7070||t.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "t.apps-1-99281.svc.cluster.local:7070/*" + }, + "per_filter_config": { + "mixer": { + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/t" + }, + "destination.service.host": { + "string_value": "t.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "t" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "t" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/t" + }, + "destination.service.host": { + "string_value": "t.apps-1-99281.svc.cluster.local" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:38:43.539Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "route_config": { + "name": "8080", + "virtual_hosts": [ + { + "name": "a.apps-1-99281.svc.cluster.local:8080", + "domains": [ + "a.apps-1-99281.svc.cluster.local", + "a.apps-1-99281.svc.cluster.local:8080", + "a", + "a:8080", + "a.apps-1-99281.svc.cluster", + "a.apps-1-99281.svc.cluster:8080", + "a.apps-1-99281.svc", + "a.apps-1-99281.svc:8080", + "a.apps-1-99281", + "a.apps-1-99281:8080", + "10.43.242.41", + "10.43.242.41:8080" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|8080||a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:8080/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + } + } + }, + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + } + } + } + } + } + } + ] + }, + { + "name": "b.apps-1-99281.svc.cluster.local:8080", + "domains": [ + "b.apps-1-99281.svc.cluster.local", + "b.apps-1-99281.svc.cluster.local:8080", + "b", + "b:8080", + "b.apps-1-99281.svc.cluster", + "b.apps-1-99281.svc.cluster:8080", + "b.apps-1-99281.svc", + "b.apps-1-99281.svc:8080", + "b.apps-1-99281", + "b.apps-1-99281:8080", + "10.43.241.185", + "10.43.241.185:8080" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|8080||b.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "b.apps-1-99281.svc.cluster.local:8080/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "b.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/b" + }, + "destination.service.name": { + "string_value": "b" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "b" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/b" + }, + "destination.service.host": { + "string_value": "b.apps-1-99281.svc.cluster.local" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "c.apps-1-99281.svc.cluster.local:8080", + "domains": [ + "c.apps-1-99281.svc.cluster.local", + "c.apps-1-99281.svc.cluster.local:8080", + "c", + "c:8080", + "c.apps-1-99281.svc.cluster", + "c.apps-1-99281.svc.cluster:8080", + "c.apps-1-99281.svc", + "c.apps-1-99281.svc:8080", + "c.apps-1-99281", + "c.apps-1-99281:8080", + "10.43.247.178", + "10.43.247.178:8080" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|8080||c.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "c.apps-1-99281.svc.cluster.local:8080/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/c" + }, + "destination.service.host": { + "string_value": "c.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "c" + } + } + }, + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/c" + }, + "destination.service.host": { + "string_value": "c.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "c" + } + } + } + } + } + } + ] + }, + { + "name": "d.apps-1-99281.svc.cluster.local:8080", + "domains": [ + "d.apps-1-99281.svc.cluster.local", + "d.apps-1-99281.svc.cluster.local:8080", + "d", + "d:8080", + "d.apps-1-99281.svc.cluster", + "d.apps-1-99281.svc.cluster:8080", + "d.apps-1-99281.svc", + "d.apps-1-99281.svc:8080", + "d.apps-1-99281", + "d.apps-1-99281:8080", + "10.43.254.82", + "10.43.254.82:8080" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|8080||d.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "d.apps-1-99281.svc.cluster.local:8080/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/d" + }, + "destination.service.host": { + "string_value": "d.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "d" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/d" + }, + "destination.service.host": { + "string_value": "d.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "d" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "headless.apps-1-99281.svc.cluster.local:8080", + "domains": [ + "headless.apps-1-99281.svc.cluster.local", + "headless.apps-1-99281.svc.cluster.local:8080", + "headless", + "headless:8080", + "headless.apps-1-99281.svc.cluster", + "headless.apps-1-99281.svc.cluster:8080", + "headless.apps-1-99281.svc", + "headless.apps-1-99281.svc:8080", + "headless.apps-1-99281", + "headless.apps-1-99281:8080" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|8080||headless.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "headless.apps-1-99281.svc.cluster.local:8080/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "headless.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/headless" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "headless" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "headless" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/headless" + }, + "destination.service.host": { + "string_value": "headless.apps-1-99281.svc.cluster.local" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "istio-pilot.istio-system.svc.cluster.local:8080", + "domains": [ + "istio-pilot.istio-system.svc.cluster.local", + "istio-pilot.istio-system.svc.cluster.local:8080", + "istio-pilot.istio-system", + "istio-pilot.istio-system:8080", + "istio-pilot.istio-system.svc.cluster", + "istio-pilot.istio-system.svc.cluster:8080", + "istio-pilot.istio-system.svc", + "istio-pilot.istio-system.svc:8080", + "10.43.248.244", + "10.43.248.244:8080" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|8080||istio-pilot.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-pilot.istio-system.svc.cluster.local:8080/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-pilot.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-pilot" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-pilot" + } + } + }, + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-pilot.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-pilot" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-pilot" + } + } + } + } + } + } + ] + }, + { + "name": "t.apps-1-99281.svc.cluster.local:8080", + "domains": [ + "t.apps-1-99281.svc.cluster.local", + "t.apps-1-99281.svc.cluster.local:8080", + "t", + "t:8080", + "t.apps-1-99281.svc.cluster", + "t.apps-1-99281.svc.cluster:8080", + "t.apps-1-99281.svc", + "t.apps-1-99281.svc:8080", + "t.apps-1-99281", + "t.apps-1-99281:8080", + "10.43.253.48", + "10.43.253.48:8080" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|8080||t.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "t.apps-1-99281.svc.cluster.local:8080/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "t" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/t" + }, + "destination.service.host": { + "string_value": "t.apps-1-99281.svc.cluster.local" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "t.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/t" + }, + "destination.service.name": { + "string_value": "t" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + }, + "disable_check_calls": true + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:38:43.538Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "route_config": { + "name": "15014", + "virtual_hosts": [ + { + "name": "istio-citadel.istio-system.svc.cluster.local:15014", + "domains": [ + "istio-citadel.istio-system.svc.cluster.local", + "istio-citadel.istio-system.svc.cluster.local:15014", + "istio-citadel.istio-system", + "istio-citadel.istio-system:15014", + "istio-citadel.istio-system.svc.cluster", + "istio-citadel.istio-system.svc.cluster:15014", + "istio-citadel.istio-system.svc", + "istio-citadel.istio-system.svc:15014", + "10.43.251.158", + "10.43.251.158:15014" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|15014||istio-citadel.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-citadel.istio-system.svc.cluster.local:15014/*" + }, + "per_filter_config": { + "mixer": { + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-citadel" + }, + "destination.service.host": { + "string_value": "istio-citadel.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-citadel" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-citadel" + }, + "destination.service.host": { + "string_value": "istio-citadel.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-citadel" + } + } + } + } + } + } + ] + }, + { + "name": "istio-galley.istio-system.svc.cluster.local:15014", + "domains": [ + "istio-galley.istio-system.svc.cluster.local", + "istio-galley.istio-system.svc.cluster.local:15014", + "istio-galley.istio-system", + "istio-galley.istio-system:15014", + "istio-galley.istio-system.svc.cluster", + "istio-galley.istio-system.svc.cluster:15014", + "istio-galley.istio-system.svc", + "istio-galley.istio-system.svc:15014", + "10.43.240.145", + "10.43.240.145:15014" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|15014||istio-galley.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-galley.istio-system.svc.cluster.local:15014/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-galley" + }, + "destination.service.host": { + "string_value": "istio-galley.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-galley" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-galley.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-galley" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-galley" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "istio-pilot.istio-system.svc.cluster.local:15014", + "domains": [ + "istio-pilot.istio-system.svc.cluster.local", + "istio-pilot.istio-system.svc.cluster.local:15014", + "istio-pilot.istio-system", + "istio-pilot.istio-system:15014", + "istio-pilot.istio-system.svc.cluster", + "istio-pilot.istio-system.svc.cluster:15014", + "istio-pilot.istio-system.svc", + "istio-pilot.istio-system.svc:15014", + "10.43.248.244", + "10.43.248.244:15014" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|15014||istio-pilot.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-pilot.istio-system.svc.cluster.local:15014/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-pilot" + }, + "destination.service.host": { + "string_value": "istio-pilot.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-pilot" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-pilot" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-pilot" + }, + "destination.service.host": { + "string_value": "istio-pilot.istio-system.svc.cluster.local" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "istio-policy.istio-system.svc.cluster.local:15014", + "domains": [ + "istio-policy.istio-system.svc.cluster.local", + "istio-policy.istio-system.svc.cluster.local:15014", + "istio-policy.istio-system", + "istio-policy.istio-system:15014", + "istio-policy.istio-system.svc.cluster", + "istio-policy.istio-system.svc.cluster:15014", + "istio-policy.istio-system.svc", + "istio-policy.istio-system.svc:15014", + "10.43.251.210", + "10.43.251.210:15014" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|15014||istio-policy.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-policy.istio-system.svc.cluster.local:15014/*" + }, + "per_filter_config": { + "mixer": { + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-policy.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-policy" + }, + "destination.service.name": { + "string_value": "istio-policy" + }, + "destination.service.namespace": { + "string_value": "istio-system" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-policy" + }, + "destination.service.host": { + "string_value": "istio-policy.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-policy" + } + } + } + } + } + } + ] + }, + { + "name": "istio-telemetry.istio-system.svc.cluster.local:15014", + "domains": [ + "istio-telemetry.istio-system.svc.cluster.local", + "istio-telemetry.istio-system.svc.cluster.local:15014", + "istio-telemetry.istio-system", + "istio-telemetry.istio-system:15014", + "istio-telemetry.istio-system.svc.cluster", + "istio-telemetry.istio-system.svc.cluster:15014", + "istio-telemetry.istio-system.svc", + "istio-telemetry.istio-system.svc:15014", + "10.43.255.188", + "10.43.255.188:15014" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|15014||istio-telemetry.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-telemetry.istio-system.svc.cluster.local:15014/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-telemetry.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-telemetry" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-telemetry" + } + } + }, + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.name": { + "string_value": "istio-telemetry" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.host": { + "string_value": "istio-telemetry.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-telemetry" + } + } + } + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:38:43.539Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "route_config": { + "name": "9091", + "virtual_hosts": [ + { + "name": "istio-policy.istio-system.svc.cluster.local:9091", + "domains": [ + "istio-policy.istio-system.svc.cluster.local", + "istio-policy.istio-system.svc.cluster.local:9091", + "istio-policy.istio-system", + "istio-policy.istio-system:9091", + "istio-policy.istio-system.svc.cluster", + "istio-policy.istio-system.svc.cluster:9091", + "istio-policy.istio-system.svc", + "istio-policy.istio-system.svc:9091", + "10.43.251.210", + "10.43.251.210:9091" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|9091||istio-policy.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-policy.istio-system.svc.cluster.local:9091/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-policy.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-policy" + }, + "destination.service.name": { + "string_value": "istio-policy" + }, + "destination.service.namespace": { + "string_value": "istio-system" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-policy.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-policy" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-policy" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "istio-telemetry.istio-system.svc.cluster.local:9091", + "domains": [ + "istio-telemetry.istio-system.svc.cluster.local", + "istio-telemetry.istio-system.svc.cluster.local:9091", + "istio-telemetry.istio-system", + "istio-telemetry.istio-system:9091", + "istio-telemetry.istio-system.svc.cluster", + "istio-telemetry.istio-system.svc.cluster:9091", + "istio-telemetry.istio-system.svc", + "istio-telemetry.istio-system.svc:9091", + "10.43.255.188", + "10.43.255.188:9091" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|9091||istio-telemetry.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-telemetry.istio-system.svc.cluster.local:9091/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-telemetry.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-telemetry" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-telemetry" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-telemetry.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-telemetry" + }, + "destination.service.name": { + "string_value": "istio-telemetry" + }, + "destination.service.namespace": { + "string_value": "istio-system" + } + } + }, + "disable_check_calls": true + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:38:43.536Z" + }, + { + "version_info": "2019-04-14T15:36:44Z/18", + "route_config": { + "name": "80", + "virtual_hosts": [ + { + "name": "a.apps-1-99281.svc.cluster.local:80", + "domains": [ + "a.apps-1-99281.svc.cluster.local", + "a.apps-1-99281.svc.cluster.local:80", + "a", + "a:80", + "a.apps-1-99281.svc.cluster", + "a.apps-1-99281.svc.cluster:80", + "a.apps-1-99281.svc", + "a.apps-1-99281.svc:80", + "a.apps-1-99281", + "a.apps-1-99281:80", + "10.43.242.41", + "10.43.242.41:80" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|80||a.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "a.apps-1-99281.svc.cluster.local:80/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + } + } + }, + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "a" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/a" + }, + "destination.service.host": { + "string_value": "a.apps-1-99281.svc.cluster.local" + } + } + } + } + } + } + ] + }, + { + "name": "b.apps-1-99281.svc.cluster.local:80", + "domains": [ + "b.apps-1-99281.svc.cluster.local", + "b.apps-1-99281.svc.cluster.local:80", + "b", + "b:80", + "b.apps-1-99281.svc.cluster", + "b.apps-1-99281.svc.cluster:80", + "b.apps-1-99281.svc", + "b.apps-1-99281.svc:80", + "b.apps-1-99281", + "b.apps-1-99281:80", + "10.43.241.185", + "10.43.241.185:80" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|80||b.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "b.apps-1-99281.svc.cluster.local:80/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "b.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/b" + }, + "destination.service.name": { + "string_value": "b" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + }, + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "b.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/b" + }, + "destination.service.name": { + "string_value": "b" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + } + } + } + } + ] + }, + { + "name": "c.apps-1-99281.svc.cluster.local:80", + "domains": [ + "c.apps-1-99281.svc.cluster.local", + "c.apps-1-99281.svc.cluster.local:80", + "c", + "c:80", + "c.apps-1-99281.svc.cluster", + "c.apps-1-99281.svc.cluster:80", + "c.apps-1-99281.svc", + "c.apps-1-99281.svc:80", + "c.apps-1-99281", + "c.apps-1-99281:80", + "10.43.247.178", + "10.43.247.178:80" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|80||c.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "c.apps-1-99281.svc.cluster.local:80/*" + }, + "per_filter_config": { + "mixer": { + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "c.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/c" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "c" + } + } + }, + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "c.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/c" + }, + "destination.service.name": { + "string_value": "c" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + } + } + } + } + ] + }, + { + "name": "d.apps-1-99281.svc.cluster.local:80", + "domains": [ + "d.apps-1-99281.svc.cluster.local", + "d.apps-1-99281.svc.cluster.local:80", + "d", + "d:80", + "d.apps-1-99281.svc.cluster", + "d.apps-1-99281.svc.cluster:80", + "d.apps-1-99281.svc", + "d.apps-1-99281.svc:80", + "d.apps-1-99281", + "d.apps-1-99281:80", + "10.43.254.82", + "10.43.254.82:80" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|80||d.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "d.apps-1-99281.svc.cluster.local:80/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "d.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/d" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "d" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "d.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/d" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "d" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "default-http-backend.kube-system.svc.cluster.local:80", + "domains": [ + "default-http-backend.kube-system.svc.cluster.local", + "default-http-backend.kube-system.svc.cluster.local:80", + "default-http-backend.kube-system", + "default-http-backend.kube-system:80", + "default-http-backend.kube-system.svc.cluster", + "default-http-backend.kube-system.svc.cluster:80", + "default-http-backend.kube-system.svc", + "default-http-backend.kube-system.svc:80", + "10.43.255.10", + "10.43.255.10:80" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|80||default-http-backend.kube-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "default-http-backend.kube-system.svc.cluster.local:80/*" + }, + "per_filter_config": { + "mixer": { + "disable_check_calls": true, + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "default-http-backend.kube-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://kube-system/services/default-http-backend" + }, + "destination.service.name": { + "string_value": "default-http-backend" + }, + "destination.service.namespace": { + "string_value": "kube-system" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "default-http-backend.kube-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://kube-system/services/default-http-backend" + }, + "destination.service.namespace": { + "string_value": "kube-system" + }, + "destination.service.name": { + "string_value": "default-http-backend" + } + } + } + } + } + } + ] + }, + { + "name": "headless.apps-1-99281.svc.cluster.local:80", + "domains": [ + "headless.apps-1-99281.svc.cluster.local", + "headless.apps-1-99281.svc.cluster.local:80", + "headless", + "headless:80", + "headless.apps-1-99281.svc.cluster", + "headless.apps-1-99281.svc.cluster:80", + "headless.apps-1-99281.svc", + "headless.apps-1-99281.svc:80", + "headless.apps-1-99281", + "headless.apps-1-99281:80" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|80||headless.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "headless.apps-1-99281.svc.cluster.local:80/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "headless.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/headless" + }, + "destination.service.name": { + "string_value": "headless" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/headless" + }, + "destination.service.host": { + "string_value": "headless.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "headless" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "istio-egressgateway.istio-system.svc.cluster.local:80", + "domains": [ + "istio-egressgateway.istio-system.svc.cluster.local", + "istio-egressgateway.istio-system.svc.cluster.local:80", + "istio-egressgateway.istio-system", + "istio-egressgateway.istio-system:80", + "istio-egressgateway.istio-system.svc.cluster", + "istio-egressgateway.istio-system.svc.cluster:80", + "istio-egressgateway.istio-system.svc", + "istio-egressgateway.istio-system.svc:80", + "10.43.245.70", + "10.43.245.70:80" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|80||istio-egressgateway.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-egressgateway.istio-system.svc.cluster.local:80/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-egressgateway.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-egressgateway" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-egressgateway" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-egressgateway" + }, + "destination.service.host": { + "string_value": "istio-egressgateway.istio-system.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-egressgateway" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "istio-ingressgateway.istio-system.svc.cluster.local:80", + "domains": [ + "istio-ingressgateway.istio-system.svc.cluster.local", + "istio-ingressgateway.istio-system.svc.cluster.local:80", + "istio-ingressgateway.istio-system", + "istio-ingressgateway.istio-system:80", + "istio-ingressgateway.istio-system.svc.cluster", + "istio-ingressgateway.istio-system.svc.cluster:80", + "istio-ingressgateway.istio-system.svc", + "istio-ingressgateway.istio-system.svc:80", + "10.43.248.28", + "10.43.248.28:80" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|80||istio-ingressgateway.istio-system.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "istio-ingressgateway.istio-system.svc.cluster.local:80/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-ingressgateway.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-ingressgateway" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-ingressgateway" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.host": { + "string_value": "istio-ingressgateway.istio-system.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://istio-system/services/istio-ingressgateway" + }, + "destination.service.namespace": { + "string_value": "istio-system" + }, + "destination.service.name": { + "string_value": "istio-ingressgateway" + } + } + }, + "disable_check_calls": true + } + } + } + ] + }, + { + "name": "t.apps-1-99281.svc.cluster.local:80", + "domains": [ + "t.apps-1-99281.svc.cluster.local", + "t.apps-1-99281.svc.cluster.local:80", + "t", + "t:80", + "t.apps-1-99281.svc.cluster", + "t.apps-1-99281.svc.cluster:80", + "t.apps-1-99281.svc", + "t.apps-1-99281.svc:80", + "t.apps-1-99281", + "t.apps-1-99281:80", + "10.43.253.48", + "10.43.253.48:80" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "outbound|80||t.apps-1-99281.svc.cluster.local", + "timeout": "0s", + "retry_policy": { + "retry_on": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes", + "num_retries": 2, + "retry_host_predicate": [ + { + "name": "envoy.retry_host_predicates.previous_hosts" + } + ], + "host_selection_retry_max_attempts": "3", + "retriable_status_codes": [ + 503 + ] + }, + "max_grpc_timeout": "0s" + }, + "decorator": { + "operation": "t.apps-1-99281.svc.cluster.local:80/*" + }, + "per_filter_config": { + "mixer": { + "forward_attributes": { + "attributes": { + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "t" + }, + "destination.service.host": { + "string_value": "t.apps-1-99281.svc.cluster.local" + }, + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/t" + } + } + }, + "mixer_attributes": { + "attributes": { + "destination.service.uid": { + "string_value": "istio://apps-1-99281/services/t" + }, + "destination.service.host": { + "string_value": "t.apps-1-99281.svc.cluster.local" + }, + "destination.service.namespace": { + "string_value": "apps-1-99281" + }, + "destination.service.name": { + "string_value": "t" + } + } + }, + "disable_check_calls": true + } + } + } + ] + } + ], + "validate_clusters": false + }, + "last_updated": "2019-04-14T15:38:43.536Z" + } + ] + } + ] +} diff --git a/pkg/test/framework/components/echo/config.go b/pkg/test/framework/components/echo/config.go new file mode 100644 index 000000000000..f95344602921 --- /dev/null +++ b/pkg/test/framework/components/echo/config.go @@ -0,0 +1,79 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package echo + +import ( + "fmt" + + "istio.io/istio/pkg/test/framework/components/galley" + "istio.io/istio/pkg/test/framework/components/namespace" + "istio.io/istio/pkg/test/framework/components/pilot" +) + +// Config defines the options for creating an Echo component. +// nolint: maligned +type Config struct { + // Namespace of the echo Instance. If not provided, a default namespace "apps" is used. + Namespace namespace.Instance + + // Domain of the echo Instance. If not provided, a default will be selected. + Domain string + + // Galley component (may be required, depending on the environment/configuration). + Galley galley.Instance + + // Pilot component reference (may be required, depending on the environment/configuration). + Pilot pilot.Instance + + // Service indicates the service name of the Echo application. + Service string + + // Version indicates the version path for calls to the Echo application. + Version string + + // Locality (k8s only) indicates the locality of the deployed app. + Locality string + + // Headless (k8s only) indicates that no ClusterIP should be specified. + Headless bool + + // Sidecar indicates that no Envoy sidecar should be created for the instance. + Sidecar bool + + // ServiceAccount (k8s only) indicates that a service account should be created + // for the deployment. + ServiceAccount bool + + // Ports for this application. Port numbers may or may not be used, depending + // on the implementation. + Ports []Port +} + +// String implements the Configuration interface (which implements fmt.Stringer) +func (c Config) String() string { + return fmt.Sprint("{service: ", c.Service, ", version: ", c.Version, "}") +} + +// FQDN returns the fully qualified domain name for the service. +func (c Config) FQDN() string { + out := c.Service + if c.Namespace != nil { + out += "." + c.Namespace.Name() + } + if c.Domain != "" { + out += "." + c.Domain + } + return out +} diff --git a/pkg/test/framework/components/echo/echo.go b/pkg/test/framework/components/echo/echo.go new file mode 100644 index 000000000000..02671d1801e0 --- /dev/null +++ b/pkg/test/framework/components/echo/echo.go @@ -0,0 +1,92 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package echo + +import ( + "testing" + + envoyAdmin "github.com/envoyproxy/go-control-plane/envoy/admin/v2alpha" + + "istio.io/istio/pilot/pkg/model" + "istio.io/istio/pkg/test/application/echo" + "istio.io/istio/pkg/test/framework/resource" + "istio.io/istio/pkg/test/util/retry" +) + +// Instance is a component that provides access to a deployed echo service. +type Instance interface { + resource.Resource + + // Config returns the configuration of the Echo instance. + Config() Config + + // WaitUntilReady waits until this instance is up and ready to receive traffic. If + // outbound are specified, the wait also includes readiness for each + // outbound instance as well as waiting for receipt of outbound Envoy configuration + // (i.e. clusters, routes, listeners from Pilot) in order to enable outbound + // communication from this instance to each instance in the list. + WaitUntilReady(outbound ...Instance) error + WaitUntilReadyOrFail(t testing.TB, outbound ...Instance) + + // Workloads retrieves the list of all deployed workloads for this Echo service. + // Guarantees at least one workload, if error == nil. + Workloads() ([]Workload, error) + WorkloadsOrFail(t testing.TB) []Workload + + // Call makes a call from this Instance to a target Instance. + Call(options CallOptions) (echo.ParsedResponses, error) + CallOrFail(t testing.TB, options CallOptions) echo.ParsedResponses +} + +// Port exposed by an Echo Instance +type Port struct { + // Name of this port + Name string + + // Protocol to be used for the port. + Protocol model.Protocol + + // ServicePort number where the service can be reached. Does not necessarily + // map to the corresponding port numbers for the instances behind the + // service. + ServicePort int + + // InstancePort number where this instance is listening for connections. + // This need not be the same as the ServicePort where the service is accessed. + InstancePort int +} + +// Workload provides an interface for a single deployed echo server. +type Workload interface { + // Address returns the network address of the endpoint. + Address() string + + // Sidecar if one was specified. + Sidecar() Sidecar +} + +// Sidecar provides an interface to execute queries against a single Envoy sidecar. +type Sidecar interface { + // Info about the Envoy instance. + Info() (*envoyAdmin.ServerInfo, error) + + // Config of the Envoy instance. + Config() (*envoyAdmin.ConfigDump, error) + + // WaitForConfig queries the Envoy configuration an executes the given accept handler. If the + // response is not accepted, the request will be retried until either a timeout or a response + // has been accepted. + WaitForConfig(accept func(*envoyAdmin.ConfigDump) (bool, error), options ...retry.Option) error +} diff --git a/pkg/test/framework/components/echo/echoboot/echoboot.go b/pkg/test/framework/components/echo/echoboot/echoboot.go new file mode 100644 index 000000000000..4ed5e36655cb --- /dev/null +++ b/pkg/test/framework/components/echo/echoboot/echoboot.go @@ -0,0 +1,50 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package echoboot + +import ( + "testing" + + "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/framework/components/echo/kube" + "istio.io/istio/pkg/test/framework/components/echo/native" + "istio.io/istio/pkg/test/framework/components/environment" + "istio.io/istio/pkg/test/framework/resource" +) + +// New returns a new instance of echo. +func New(ctx resource.Context, cfg echo.Config) (i echo.Instance, err error) { + err = resource.UnsupportedEnvironment(ctx.Environment()) + + ctx.Environment().Case(environment.Native, func() { + i, err = native.New(ctx, cfg) + }) + + ctx.Environment().Case(environment.Kube, func() { + i, err = kube.New(ctx, cfg) + }) + return +} + +// NewOrFail returns a new instance of echo, or fails t if there is an error. +func NewOrFail(ctx resource.Context, t *testing.T, cfg echo.Config) echo.Instance { + t.Helper() + i, err := New(ctx, cfg) + if err != nil { + t.Fatalf("echo.NewOrFail: %v", err) + } + + return i +} diff --git a/pkg/test/framework/components/echo/instance.go b/pkg/test/framework/components/echo/instance.go deleted file mode 100644 index 66b644b65006..000000000000 --- a/pkg/test/framework/components/echo/instance.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2019 Istio Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package echo - -import ( - "fmt" - "net/http" - "testing" - - "istio.io/istio/pilot/pkg/model" - "istio.io/istio/pkg/test/application/echo" - "istio.io/istio/pkg/test/framework/components/environment" - "istio.io/istio/pkg/test/framework/resource" -) - -// Protocol enumerates the protocol options for calling an Endpoint endpoint. -type Protocol string - -const ( - // HTTP calls echo with HTTP - HTTP Protocol = "http" - - // GRPC calls echo with GRPC - GRPC Protocol = "grpc" - - // WebSocket calls echo with WebSocket - WebSocket Protocol = "ws" -) - -func (p Protocol) normalize() Protocol { - switch p { - case HTTP, GRPC, WebSocket: - return p - default: - return HTTP - } -} - -// Instance is a component that provides access to the deployed echo service. -type Instance interface { - resource.Resource - - // Config returns the configuration of the Echo instance. - Config() Config - - // Endpoints returns the endpoints that are available for calling the Echo instance. - Endpoints() []Endpoint - - // EndpointsForProtocol return the endpoints filtered for a specific protocol (e.g. GRPC) - EndpointsForProtocol(protocol model.Protocol) []Endpoint - - // Call makes a call from this Echo instance to an Endpoint from another instance. - Call(e Endpoint, opts CallOptions) ([]*echo.ParsedResponse, error) - CallOrFail(e Endpoint, opts CallOptions, t testing.TB) []*echo.ParsedResponse -} - -// Config defines the options for creating an Echo component. -type Config struct { - // Service indicates the service name of the Echo application. - Service string - - // Version indicates the version path for calls to the Echo application. - Version string - - // Ports for this application. Port numbers may or may not be used, depending - // on the implementation. - Ports model.PortList -} - -func (c Config) fillInDefaults() Config { - if c.Service == "" { - c.Service = "echo" - } - - if c.Version == "" { - c.Version = "v1" - } - - // Append a gRPC port, if none was provided. This is needed - // for controlling the app. - if c.getGRPCPort() == nil { - c.Ports = append([]*model.Port{ - { - Name: "grpc", - Protocol: model.ProtocolGRPC, - }, - }, c.Ports...) - } - - return c -} - -func (c Config) getGRPCPort() *model.Port { - for _, p := range c.Ports { - if p.Protocol == model.ProtocolGRPC { - return p - } - } - return nil -} - -// String implements the Configuration interface (which implements fmt.Stringer) -func (c Config) String() string { - return fmt.Sprint("{service: ", c.Service, ", version: ", c.Version, "}") -} - -// CallOptions defines options for calling a Endpoint. -type CallOptions struct { - // Protocol indicates the protocol to be used. - Protocol Protocol - - // Count indicates the number of exchanges that should be made with the service endpoint. If not set (i.e. 0), defaults to 1. - Count int - - // Headers indicates headers that should be sent in the request. Ingnored for WebSocket calls. - Headers http.Header - - // Secure indicates whether a secure connection should be established to the endpoint. - Secure bool - - // UseShortHostname indicates whether shortened hostnames should be used. This may be ignored by the environment. - UseShortHostname bool -} - -// Endpoint represents a single endpoint in an Echo instance. -type Endpoint interface { - Name() string - Owner() Instance - Protocol() model.Protocol -} - -// New returns a new instance of echo. -func New(ctx resource.Context, cfg Config) (i Instance, err error) { - err = resource.UnsupportedEnvironment(ctx.Environment()) - ctx.Environment().Case(environment.Native, func() { - i, err = newNative(ctx, cfg) - }) - return -} - -// NewOrFail returns a new instance of echo, or fails t if there is an error. -func NewOrFail(ctx resource.Context, t *testing.T, cfg Config) Instance { - t.Helper() - i, err := New(ctx, cfg) - if err != nil { - t.Fatalf("echo.NewOrFail: %v", err) - } - - return i -} diff --git a/pkg/test/framework/components/echo/kube/deployment.go b/pkg/test/framework/components/echo/kube/deployment.go new file mode 100644 index 000000000000..ddb3b9a1e9db --- /dev/null +++ b/pkg/test/framework/components/echo/kube/deployment.go @@ -0,0 +1,184 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kube + +import ( + "bufio" + "bytes" + "fmt" + "text/template" + + "istio.io/istio/pkg/test/framework/components/deployment" + "istio.io/istio/pkg/test/framework/components/echo" +) + +const ( + deploymentYAML = ` +{{- if .ServiceAccount }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Service }} +--- +{{- end }} +apiVersion: v1 +kind: Service +metadata: + name: {{ .Service }} + labels: + app: {{ .Service }} +spec: +{{- if .Headless }} + clusterIP: None +{{- end }} + ports: +{{- range $i, $p := .Ports }} + - name: {{ $p.Name }} + port: {{ $p.ServicePort }} + targetPort: {{ $p.InstancePort }} +{{- end }} + selector: + app: {{ .Service }} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Service }}-{{ .Version }} +spec: + replicas: 1 + selector: + matchLabels: + app: {{ .Service }} + version: {{ .Version }} +{{- if ne .Locality "" }} + istio-locality: {{ .Locality }} +{{- end }} + template: + metadata: + labels: + app: {{ .Service }} + version: {{ .Version }} +{{- if ne .Locality "" }} + istio-locality: {{ .Locality }} +{{- end }} +{{- if not .Sidecar }} + annotations: + sidecar.istio.io/inject: "false" +{{- end }} + spec: +{{- if .ServiceAccount }} + serviceAccountName: {{ .Service }} +{{- end }} + containers: + - name: app + image: {{ .Hub }}/app:{{ .Tag }} + imagePullPolicy: {{ .PullPolicy }} + args: +{{- range $i, $p := .ContainerPorts }} +{{- if eq .Protocol "GRPC" }} + - --grpc +{{- else }} + - --port +{{- end }} + - "{{ $p.Port }}" +{{- end }} + - --version + - "{{ .Version }}" + ports: +{{- range $i, $p := .ContainerPorts }} + - containerPort: {{ $p.Port }} +{{- if eq .Port 3333 }} + name: tcp-health-port +{{- end }} +{{- end }} + readinessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 10 + periodSeconds: 10 + failureThreshold: 10 + livenessProbe: + tcpSocket: + port: tcp-health-port + initialDelaySeconds: 10 + periodSeconds: 10 + failureThreshold: 10 +--- +apiVersion: v1 +kind: Secret +metadata: + name: sdstokensecret +type: Opaque +stringData: + sdstoken: "eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2\ +VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Ii\ +wia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InZhdWx0LWNpdGFkZWwtc2\ +EtdG9rZW4tcmZxZGoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC\ +5uYW1lIjoidmF1bHQtY2l0YWRlbC1zYSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2Vydm\ +ljZS1hY2NvdW50LnVpZCI6IjIzOTk5YzY1LTA4ZjMtMTFlOS1hYzAzLTQyMDEwYThhMDA3OSIsInN1Yi\ +I6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnZhdWx0LWNpdGFkZWwtc2EifQ.RNH1QbapJKP\ +mktV3tCnpiz7hoYpv1TM6LXzThOtaDp7LFpeANZcJ1zVQdys3EdnlkrykGMepEjsdNuT6ndHfh8jRJAZ\ +uNWNPGrhxz4BeUaOqZg3v7AzJlMeFKjY_fiTYYd2gBZZxkpv1FvAPihHYng2NeN2nKbiZbsnZNU1qFdv\ +bgCISaFqTf0dh75OzgCX_1Fh6HOA7ANf7p522PDW_BRln0RTwUJovCpGeiNCGdujGiNLDZyBcdtikY5r\ +y_KXTdrVAcTUvI6lxwRbONNfuN8hrIDl95vJjhUlE-O-_cx8qWtXNdqJlMje1SsiPCL4uq70OepG_I4a\ +SzC2o8aDtlQ" +--- +` +) + +var ( + deploymentTemplate *template.Template +) + +func init() { + deploymentTemplate = template.New("echo_deployment") + if _, err := deploymentTemplate.Parse(deploymentYAML); err != nil { + panic(fmt.Sprintf("unable to parse echo deployment template: %v", err)) + } +} + +func generateYAML(cfg echo.Config) (string, error) { + // Create the parameters for the YAML template. + settings, err := deployment.SettingsFromCommandLine() + if err != nil { + return "", err + } + + params := map[string]interface{}{ + "Hub": settings.Hub, + "Tag": settings.Tag, + "PullPolicy": settings.PullPolicy, + "Service": cfg.Service, + "Version": cfg.Version, + "Sidecar": cfg.Sidecar, + "Headless": cfg.Headless, + "Locality": cfg.Locality, + "ServiceAccount": cfg.ServiceAccount, + "Ports": cfg.Ports, + "ContainerPorts": getContainerPorts(cfg.Ports), + } + + // Generate the YAML content. + var filled bytes.Buffer + w := bufio.NewWriter(&filled) + if err := deploymentTemplate.Execute(w, params); err != nil { + return "", err + } + if err := w.Flush(); err != nil { + return "", err + } + return filled.String(), nil +} diff --git a/pkg/test/framework/components/echo/kube/instance.go b/pkg/test/framework/components/echo/kube/instance.go new file mode 100644 index 000000000000..d40c647cd0b4 --- /dev/null +++ b/pkg/test/framework/components/echo/kube/instance.go @@ -0,0 +1,265 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kube + +import ( + "errors" + "fmt" + "io" + "sync" + "testing" + + "github.com/hashicorp/go-multierror" + + "istio.io/istio/pilot/pkg/model" + appEcho "istio.io/istio/pkg/test/application/echo" + "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/framework/components/echo/common" + kubeEnv "istio.io/istio/pkg/test/framework/components/environment/kube" + "istio.io/istio/pkg/test/framework/resource" + testKube "istio.io/istio/pkg/test/kube" +) + +const ( + tcpHealthPort = 3333 + httpReadinessPort = 8080 + defaultDomain = "svc.cluster.local" +) + +var ( + _ echo.Instance = &instance{} + _ io.Closer = &instance{} +) + +type instance struct { + id resource.ID + cfg echo.Config + env *kubeEnv.Environment + workloads []*workload + grpcPort uint16 + mutex sync.Mutex +} + +func New(ctx resource.Context, cfg echo.Config) (out echo.Instance, err error) { + // Fill in defaults for any missing values. + if err = common.FillInDefaults(ctx, defaultDomain, &cfg); err != nil { + return nil, err + } + + // Validate the configuration. + if cfg.Galley == nil { + // Galley is not actually required currently, but it will be once Pilot gets + // all resources from Galley. Requiring now for forward-compatibility. + return nil, errors.New("galley must be provided") + } + + env := ctx.Environment().(*kubeEnv.Environment) + c := &instance{ + env: env, + cfg: cfg, + } + c.id = ctx.TrackResource(c) + + // Save the GRPC port. + grpcPort := common.GetGRPCPort(&cfg) + if grpcPort == nil { + return nil, errors.New("unable fo find GRPC command port") + } + c.grpcPort = uint16(grpcPort.InstancePort) + + // Generate the deployment YAML. + generatedYAML, err := generateYAML(cfg) + if err != nil { + return nil, err + } + + // Deploy the YAML. + if err = env.ApplyContents(cfg.Namespace.Name(), generatedYAML); err != nil { + return nil, err + } + + return c, nil +} + +// getContainerPorts converts the ports to a port list of container ports. +// Adds ports for health/readiness if necessary. +func getContainerPorts(ports []echo.Port) model.PortList { + containerPorts := make(model.PortList, 0, len(ports)) + var healthPort *model.Port + var readyPort *model.Port + for _, p := range ports { + // Add the port to the set of application ports. + cport := &model.Port{ + Name: p.Name, + Protocol: p.Protocol, + Port: p.InstancePort, + } + containerPorts = append(containerPorts, cport) + + switch p.Protocol { + case model.ProtocolGRPC: + continue + case model.ProtocolHTTP: + if p.InstancePort == httpReadinessPort { + readyPort = cport + } + default: + if p.InstancePort == tcpHealthPort { + healthPort = cport + } + } + } + + // If we haven't added the readiness/health ports, do so now. + if readyPort == nil { + containerPorts = append(containerPorts, &model.Port{ + Name: "http-readiness-port", + Protocol: model.ProtocolHTTP, + Port: httpReadinessPort, + }) + } + if healthPort == nil { + containerPorts = append(containerPorts, &model.Port{ + Name: "tcp-health-port", + Protocol: model.ProtocolHTTP, + Port: tcpHealthPort, + }) + } + return containerPorts +} + +func (c *instance) ID() resource.ID { + return c.id +} + +func (c *instance) Workloads() ([]echo.Workload, error) { + c.mutex.Lock() + defer c.mutex.Unlock() + + if err := c.initWorkloads(); err != nil { + return nil, err + } + + out := make([]echo.Workload, 0, len(c.workloads)) + for _, w := range c.workloads { + out = append(out, w) + } + return out, nil +} + +func (c *instance) WorkloadsOrFail(t testing.TB) []echo.Workload { + out, err := c.Workloads() + if err != nil { + t.Fatal(err) + } + return out +} + +func (c *instance) WaitUntilReady(outboundInstances ...echo.Instance) error { + // Initialize if we haven't already. + if err := c.initWorkloads(); err != nil { + return err + } + + // Wait for the outbound config to be received by each workload from Pilot. + for _, w := range c.workloads { + if w.sidecar != nil { + if err := w.sidecar.WaitForConfig(common.OutboundConfigAcceptFunc(outboundInstances...)); err != nil { + return err + } + } + } + + return nil +} + +func (c *instance) WaitUntilReadyOrFail(t testing.TB, outboundInstances ...echo.Instance) { + if err := c.WaitUntilReady(); err != nil { + t.Fatal(err) + } +} + +func (c *instance) initWorkloads() error { + c.mutex.Lock() + defer c.mutex.Unlock() + + if c.workloads != nil { + // Already ready. + return nil + } + + // Wait until the pods for this service have been assigned IP Addresses. + pods, err := c.env.WaitUntilPodsAreReady(c.newPodFetch()) + if err != nil { + return err + } + + workloads := make([]*workload, 0, len(pods)) + for _, pod := range pods { + workload, err := newWorkload(pod, c.cfg.Sidecar, c.grpcPort, c.env.Accessor) + if err != nil { + return err + } + + workloads = append(workloads, workload) + } + + c.workloads = workloads + return nil +} + +func (c *instance) Close() (err error) { + c.mutex.Lock() + defer c.mutex.Unlock() + + for _, w := range c.workloads { + err = multierror.Append(err, w.Close()).ErrorOrNil() + } + c.workloads = nil + return +} + +func (c *instance) Config() echo.Config { + return c.cfg +} + +func (c *instance) Call(opts echo.CallOptions) (appEcho.ParsedResponses, error) { + // If we haven't already initialized the client, do so now. + if err := c.initWorkloads(); err != nil { + return nil, err + } + + return common.CallEcho(c.workloads[0].Client, opts) +} + +func (c *instance) CallOrFail(t testing.TB, opts echo.CallOptions) appEcho.ParsedResponses { + r, err := c.Call(opts) + if err != nil { + t.Fatal(err) + } + return r +} + +func (c *instance) newPodFetch() testKube.PodFetchFunc { + // TODO: change this once we support multiple replicas. + return c.env.NewSinglePodFetch(c.cfg.Namespace.Name(), c.selectors()...) +} + +func (c *instance) selectors() []string { + return []string{ + fmt.Sprintf("app=%s", c.cfg.Service), + fmt.Sprintf("version=%s", c.cfg.Version), + } +} diff --git a/pkg/test/framework/components/echo/kube/sidecar.go b/pkg/test/framework/components/echo/kube/sidecar.go new file mode 100644 index 000000000000..f7eed7530071 --- /dev/null +++ b/pkg/test/framework/components/echo/kube/sidecar.go @@ -0,0 +1,87 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kube + +import ( + "fmt" + "strings" + + envoyAdmin "github.com/envoyproxy/go-control-plane/envoy/admin/v2alpha" + "github.com/gogo/protobuf/jsonpb" + "github.com/gogo/protobuf/proto" + + "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/framework/components/echo/common" + "istio.io/istio/pkg/test/kube" + "istio.io/istio/pkg/test/util/retry" +) + +const ( + proxyContainerName = "istio-proxy" + proxyAdminPort = 15000 +) + +var _ echo.Sidecar = &sidecar{} + +type sidecar struct { + podNamespace string + podName string + accessor *kube.Accessor +} + +func (s *sidecar) Info() (*envoyAdmin.ServerInfo, error) { + msg := &envoyAdmin.ServerInfo{} + if err := s.adminRequest("server_info", msg); err != nil { + return nil, err + } + + return msg, nil +} + +func (s *sidecar) Config() (*envoyAdmin.ConfigDump, error) { + msg := &envoyAdmin.ConfigDump{} + if err := s.adminRequest("config_dump", msg); err != nil { + return nil, err + } + + return msg, nil +} + +func (s *sidecar) WaitForConfig(accept func(*envoyAdmin.ConfigDump) (bool, error), options ...retry.Option) error { + return common.WaitForConfig(s.Config, accept, options...) +} + +func (s *sidecar) adminRequest(path string, out proto.Message) error { + // Exec onto the pod and make a curl request to the admin port, writing + command := fmt.Sprintf("curl http://127.0.0.1:%d/%s", proxyAdminPort, path) + response, err := s.accessor.Exec(s.podNamespace, s.podName, proxyContainerName, command) + if err != nil { + return fmt.Errorf("failed exec on pod %s/%s: %v. Command: %s. Output:\n%s", + s.podNamespace, s.podName, err, command, response) + } + + // Scan forward to the start of the JSON document. + startIndex := strings.IndexByte(response, '{') + if startIndex < 0 { + return fmt.Errorf("unable to locate start of Envoy config_dump. Response:\n%s", response) + } + endIndex := strings.LastIndexByte(response, '}') + if endIndex < 0 { + return fmt.Errorf("unable to locate end of Envoy config_dump. Response:\n%s", response) + } + response = response[startIndex : endIndex+1] + + return jsonpb.Unmarshal(strings.NewReader(response), out) +} diff --git a/pkg/test/framework/components/echo/kube/workload.go b/pkg/test/framework/components/echo/kube/workload.go new file mode 100644 index 000000000000..c18d16c0680e --- /dev/null +++ b/pkg/test/framework/components/echo/kube/workload.go @@ -0,0 +1,95 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kube + +import ( + "fmt" + + "github.com/hashicorp/go-multierror" + + appEcho "istio.io/istio/pkg/test/application/echo" + "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/kube" + + coreV1 "k8s.io/api/core/v1" +) + +var ( + _ echo.Workload = &workload{} +) + +type workload struct { + *appEcho.Client + + pod coreV1.Pod + forwarder kube.PortForwarder + sidecar *sidecar +} + +func newWorkload(pod coreV1.Pod, useSidecar bool, grpcPort uint16, accessor *kube.Accessor) (*workload, error) { + if pod.Status.HostIP == "" { + return nil, fmt.Errorf("no IP available for pod %s/%s", pod.Namespace, pod.Name) + } + + // Create a forwarder to the command port of the app. + forwarder, err := accessor.NewPortForwarder(pod, 0, grpcPort) + if err != nil { + return nil, err + } + if err = forwarder.Start(); err != nil { + return nil, err + } + + // Create a gRPC client to this workload. + client, err := appEcho.NewClient(forwarder.Address()) + if err != nil { + _ = forwarder.Close() + return nil, err + } + + var s *sidecar + if useSidecar { + s = &sidecar{ + podNamespace: pod.Namespace, + podName: pod.Name, + accessor: accessor, + } + } + + return &workload{ + pod: pod, + forwarder: forwarder, + Client: client, + sidecar: s, + }, nil +} + +func (w *workload) Close() (err error) { + if w.Client != nil { + err = multierror.Append(err, w.Client.Close()).ErrorOrNil() + } + if w.forwarder != nil { + err = multierror.Append(err, w.forwarder.Close()).ErrorOrNil() + } + return +} + +func (w *workload) Address() string { + return w.pod.Status.HostIP +} + +func (w *workload) Sidecar() echo.Sidecar { + return w.sidecar +} diff --git a/pkg/test/framework/components/echo/native.go b/pkg/test/framework/components/echo/native.go deleted file mode 100644 index 293fab5db914..000000000000 --- a/pkg/test/framework/components/echo/native.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2019 Istio Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package echo - -import ( - gocontext "context" - "errors" - "fmt" - "io" - "net" - "net/http" - "net/url" - "strconv" - "testing" - - "github.com/gorilla/websocket" - "google.golang.org/grpc" - - "istio.io/istio/pilot/pkg/model" - "istio.io/istio/pkg/test/application" - "istio.io/istio/pkg/test/application/echo" - "istio.io/istio/pkg/test/application/echo/proto" - "istio.io/istio/pkg/test/framework/resource" -) - -var ( - _ Instance = &nativeComponent{} - _ io.Closer = &nativeComponent{} -) - -type nativeComponent struct { - id resource.ID - endpoints []Endpoint - client *echo.Client - config Config -} - -func newNative(ctx resource.Context, cfg Config) (Instance, error) { - // Fill in defaults for any missing values. - cfg = cfg.fillInDefaults() - - c := &nativeComponent{ - config: cfg, - } - c.id = ctx.TrackResource(c) - - echoFactory := (&echo.Factory{ - Ports: cfg.Ports, - Version: c.config.Version, - }).NewApplication - - dialer := application.Dialer{ - GRPC: c.dialGRPC, - Websocket: c.dialWebsocket, - HTTP: c.doHTTP, - } - - // Start the echo application and assign ports, if unassigned. - app, err := echoFactory(dialer) - if err != nil { - return nil, err - } - - // Create the endpoints for the app. - var grpcEndpoint *nativeEndpoint - ports := app.GetPorts() - endpoints := make([]Endpoint, len(ports)) - for i, port := range ports { - ep := &nativeEndpoint{ - owner: c, - port: port, - } - endpoints[i] = ep - - if ep.Protocol() == model.ProtocolGRPC { - grpcEndpoint = ep - } - } - c.endpoints = endpoints - - // Create the client for sending forward requests. - if grpcEndpoint == nil { - // This should never happen, since we're manually adding a GRPC port if one doesn't exist. - return nil, errors.New("unable to find grpc port for application") - } - - c.client, err = echo.NewClient(fmt.Sprintf("127.0.0.1:%d", grpcEndpoint.port.Port)) - if err != nil { - return nil, err - } - - return c, nil -} - -func (c *nativeComponent) ID() resource.ID { - return c.id -} - -// function for establishing GRPC connections from the application. -func (c *nativeComponent) dialGRPC(ctx gocontext.Context, address string, opts ...grpc.DialOption) (*grpc.ClientConn, error) { - return grpc.DialContext(ctx, address, opts...) -} - -// function for establishing Websocket connections from the application. -func (c *nativeComponent) dialWebsocket(dialer *websocket.Dialer, urlStr string, requestHeader http.Header) (*websocket.Conn, *http.Response, error) { - return dialer.Dial(urlStr, requestHeader) -} - -// function for making outbound HTTP requests from the application. -func (c *nativeComponent) doHTTP(client *http.Client, req *http.Request) (*http.Response, error) { - return client.Do(req) -} - -// Close implements io.Closer -func (c *nativeComponent) Close() (err error) { - if c.client != nil { - err = c.client.Close() - } - return -} - -func (c *nativeComponent) Config() Config { - return c.config -} - -func (c *nativeComponent) Endpoints() []Endpoint { - return c.endpoints -} - -func (c *nativeComponent) EndpointsForProtocol(protocol model.Protocol) []Endpoint { - eps := make([]Endpoint, 0, len(c.endpoints)) - for _, ep := range c.endpoints { - if ep.Protocol() == protocol { - eps = append(eps, ep) - } - } - return eps -} - -func (c *nativeComponent) Call(ee Endpoint, opts CallOptions) ([]*echo.ParsedResponse, error) { - dst, ok := ee.(*nativeEndpoint) - if !ok { - return nil, fmt.Errorf("supplied endpoint was not created by this environment") - } - - // Normalize the count. - if opts.Count <= 0 { - opts.Count = 1 - } - - // Forward a request from 'this' service to the destination service. - dstURL := dst.makeURL(opts) - dstService := dst.owner.Config().Service - - var headers []*proto.Header - headers = append(headers, &proto.Header{Key: "Host", Value: dstService}) - for key, values := range opts.Headers { - for _, value := range values { - headers = append(headers, &proto.Header{Key: key, Value: value}) - } - } - request := &proto.ForwardEchoRequest{ - Url: dstURL.String(), - Count: int32(opts.Count), - Headers: headers, - } - - resp, err := c.client.ForwardEcho(request) - if err != nil { - return nil, err - } - - if len(resp) != 1 { - return nil, fmt.Errorf("unexpected number of responses: %d", len(resp)) - } - if !resp[0].IsOK() { - return nil, fmt.Errorf("unexpected response status code: %s", resp[0].Code) - } - if resp[0].Host != dstService { - return nil, fmt.Errorf("unexpected host: %s (expected %s)", resp[0].Host, dstService) - } - if resp[0].Port != strconv.Itoa(dst.port.Port) { - return nil, fmt.Errorf("unexpected port: %s (expected %s)", resp[0].Port, strconv.Itoa(dst.port.Port)) - } - - return resp, nil -} - -func (c *nativeComponent) CallOrFail(ee Endpoint, opts CallOptions, t testing.TB) []*echo.ParsedResponse { - r, err := c.Call(ee, opts) - if err != nil { - t.Fatal(err) - } - return r -} - -type nativeEndpoint struct { - owner *nativeComponent - port *model.Port -} - -func (e *nativeEndpoint) Name() string { - return e.port.Name -} - -func (e *nativeEndpoint) Owner() Instance { - return e.owner -} - -func (e *nativeEndpoint) Protocol() model.Protocol { - return e.port.Protocol -} - -func (e *nativeEndpoint) makeURL(opts CallOptions) *url.URL { - protocol := string(opts.Protocol.normalize()) - if opts.Secure { - protocol += "s" - } - - host := "127.0.0.1" - port := e.port.Port - return &url.URL{ - Scheme: protocol, - Host: net.JoinHostPort(host, strconv.Itoa(port)), - } -} diff --git a/pkg/test/framework/components/echo/native/appfilter.go b/pkg/test/framework/components/echo/native/appfilter.go new file mode 100644 index 000000000000..cc9682efc873 --- /dev/null +++ b/pkg/test/framework/components/echo/native/appfilter.go @@ -0,0 +1,99 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package native + +import ( + "context" + "net" + "net/http" + netUrl "net/url" + "strconv" + + "github.com/gorilla/websocket" + + "google.golang.org/grpc" + + "istio.io/istio/pkg/test/application" + "istio.io/istio/pkg/test/application/echo" +) + +// newAppFilter creates a wrapper around the echo application that modifies ports on +// outbound requests in order to route them through Envoy. +func newAppFilter(filter discoveryFilter, factory *echo.Factory) (application.Application, error) { + a := &appFilterImpl{ + filter: filter, + } + + dialer := application.Dialer{ + GRPC: a.dialGRPC, + Websocket: a.dialWebsocket, + HTTP: a.doHTTP, + } + + var err error + a.Application, err = factory.NewApplication(dialer) + if err != nil { + return nil, err + } + return a, nil +} + +type appFilterImpl struct { + application.Application + filter discoveryFilter +} + +// function for establishing GRPC connections from the application. +func (a *appFilterImpl) dialGRPC(ctx context.Context, address string, opts ...grpc.DialOption) (*grpc.ClientConn, error) { + // Modify the outbound URL being created by the application + address = a.modifyClientURLString(address) + return grpc.DialContext(ctx, address, opts...) +} + +// function for establishing Websocket connections from the application. +func (a *appFilterImpl) dialWebsocket(dialer *websocket.Dialer, urlStr string, requestHeader http.Header) (*websocket.Conn, *http.Response, error) { + // Modify the outbound URL being created by the application + urlStr = a.modifyClientURLString(urlStr) + return dialer.Dial(urlStr, requestHeader) +} + +// function for making outbound HTTP requests from the application. +func (a *appFilterImpl) doHTTP(client *http.Client, req *http.Request) (*http.Response, error) { + a.modifyClientURL(req.URL) + return client.Do(req) +} + +func (a *appFilterImpl) modifyClientURLString(url string) string { + parsedURL, err := netUrl.Parse(url) + if err != nil { + // Failed to parse the URL, just use the original. + return url + } + a.modifyClientURL(parsedURL) + return parsedURL.String() +} + +func (a *appFilterImpl) modifyClientURL(url *netUrl.URL) { + port, err := strconv.Atoi(url.Port()) + if err != nil { + // No port was specified. Nothing to do. + return + } + + boundPort, ok := a.filter.GetBoundOutboundListenerPort(port) + if ok { + url.Host = net.JoinHostPort(localhost, strconv.Itoa(boundPort)) + } +} diff --git a/pkg/test/framework/components/echo/native/discoveryfilter.go b/pkg/test/framework/components/echo/native/discoveryfilter.go new file mode 100644 index 000000000000..3f9c1cecb6ac --- /dev/null +++ b/pkg/test/framework/components/echo/native/discoveryfilter.go @@ -0,0 +1,372 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package native + +import ( + "errors" + "fmt" + "net" + "regexp" + "strconv" + "strings" + + xdsapi "github.com/envoyproxy/go-control-plane/envoy/api/v2" + xdsapiCore "github.com/envoyproxy/go-control-plane/envoy/api/v2/core" + xdsapiListener "github.com/envoyproxy/go-control-plane/envoy/api/v2/listener" + envoyFilterHttp "github.com/envoyproxy/go-control-plane/envoy/config/filter/network/http_connection_manager/v2" + envoyFilterTcp "github.com/envoyproxy/go-control-plane/envoy/config/filter/network/tcp_proxy/v2" + envoyUtil "github.com/envoyproxy/go-control-plane/pkg/util" + googleProtobuf6 "github.com/gogo/protobuf/types" + + "google.golang.org/grpc" + + "istio.io/istio/pkg/log" + "istio.io/istio/pkg/test/envoy/discovery" + "istio.io/istio/pkg/test/util/reserveport" +) + +const ( + maxStreams = 100000 + listenerType = "type.googleapis.com/envoy.api.v2.Listener" + routeType = "type.googleapis.com/envoy.api.v2.RouteConfiguration" + clusterType = "type.googleapis.com/envoy.api.v2.Cluster" +) + +var ( + outboundHTTPListenerNamePattern = regexp.MustCompile("0.0.0.0_[0-9]+") +) + +// discoveryFilter is an XDS filter sitting between Pilot and Envoy that injects changes into the +// Envoy config to support running applications natively (i.e. no iptables). +type discoveryFilter interface { + // Stop the discoveryFilter + Stop() + + // GetDiscoveryPort returns the port for the discovery filter server. + GetDiscoveryAddress() *net.TCPAddr + + // GetBoundOutboundListenerPort returns a port bound to the agent's Envoy listener. Traffic + // sent to this port will automatically be sent to the outbound cluster. Pilot assumes that + // outbound traffic will automatically be redirected to Envoy, so it just sends the unbound + // port for the remote service. To make outbound requests go through Envoy, however, the + // native agent needs to bind a real outbound port for the listener and all outbound requests + // must pass through that port. + GetBoundOutboundListenerPort(portFromPilot int) (int, bool) +} + +func newDiscoverFilter(discoveryAddress string, portManager reserveport.PortManager) (f discoveryFilter, err error) { + out := &discoveryFilterImpl{ + discoveryAddress: discoveryAddress, + portManager: portManager, + boundPortMap: make(map[int]int), + } + + defer func() { + if err != nil { + out.Stop() + } + }() + + out.discoveryFilter = &discovery.Filter{ + DiscoveryAddr: discoveryAddress, + FilterFunc: out.filterDiscoveryResponse, + } + + // Start a GRPC server and register the handlers. + out.discoveryFilterGrpcServer = grpc.NewServer(grpc.MaxConcurrentStreams(uint32(maxStreams))) + // get the grpc server wired up + grpc.EnableTracing = true + out.discoveryFilter.Register(out.discoveryFilterGrpcServer) + + // Dynamically assign a port for the GRPC server. + var listener net.Listener + listener, err = net.Listen("tcp", ":0") + if err != nil { + return nil, err + } + + // Start the gRPC server for the discovery filter. + out.discoveryFilterAddr = listener.Addr().(*net.TCPAddr) + go func() { + if err := out.discoveryFilterGrpcServer.Serve(listener); err != nil { + log.Warna(err) + } + }() + return out, nil +} + +type discoveryFilterImpl struct { + portManager reserveport.PortManager + discoveryFilterGrpcServer *grpc.Server + discoveryFilter *discovery.Filter + discoveryFilterAddr *net.TCPAddr + boundPortMap map[int]int + discoveryAddress string +} + +func (a *discoveryFilterImpl) GetBoundOutboundListenerPort(portFromPilot int) (int, bool) { + p, ok := a.boundPortMap[portFromPilot] + return p, ok +} + +func (a *discoveryFilterImpl) Stop() { + if a.discoveryFilterGrpcServer != nil { + a.discoveryFilterGrpcServer.Stop() + } +} + +func (a *discoveryFilterImpl) GetDiscoveryAddress() *net.TCPAddr { + return a.discoveryFilterAddr +} + +func (a *discoveryFilterImpl) filterDiscoveryResponse(resp *xdsapi.DiscoveryResponse) (*xdsapi.DiscoveryResponse, error) { + newResponse := xdsapi.DiscoveryResponse{ + TypeUrl: resp.TypeUrl, + Canary: resp.Canary, + VersionInfo: resp.VersionInfo, + Nonce: resp.Nonce, + } + + for _, any := range resp.Resources { + switch any.TypeUrl { + case listenerType: + l := &xdsapi.Listener{} + if err := l.Unmarshal(any.Value); err != nil { + return nil, err + } + + if isVirtualListener(l) { + // Exclude the iptables-mapped listener from the Envoy configuration. It's hard-coded to port 15001, + // which will likely fail to be bound. + continue + } + + inbound, err := isInboundListener(l) + if err != nil { + return nil, err + } + if inbound { + // This is a dynamic listener generated by Pilot for an inbound port. All inbound ports for the local + // proxy are built into the static config, so we can safely ignore this listener. + // + // In addition, since we're using 127.0.0.1 as the IP address for all services/instances, the external + // service registry's GetProxyServiceInstances() will mistakenly return instances for all services. + // This is due to the fact that it uses IP address alone to map the instances. This results in Pilot + // incorrectly generating inbound listeners for other services. These listeners shouldn't cause any + // problems, but filtering them out here for correctness and clarity of the Envoy config. + continue + } + + outbound, err := isOutboundListener(l) + if err != nil { + return nil, err + } + if outbound { + // Bind a real outbound port for this listener. + if err := a.bindOutboundPort(&any, l); err != nil { + return nil, err + } + } + + case clusterType: + // Remove any management clusters. + c := &xdsapi.Cluster{} + if err := c.Unmarshal(any.Value); err != nil { + return nil, err + } + switch { + case strings.Contains(c.Name, "mgmtCluster"): + continue + } + } + newResponse.Resources = append(newResponse.Resources, any) + } + + // Take a second pass to update routes to use updated listener ports. + for i, any := range newResponse.Resources { + switch any.TypeUrl { + case routeType: + r := &xdsapi.RouteConfiguration{} + if err := r.Unmarshal(any.Value); err != nil { + return nil, err + } + + // Dynamic routes for outbound ports are named with their port. + port, err := strconv.Atoi(r.Name) + if err != nil { + continue + } + + // Look up the port to see if we have a custom bound port + boundPort, ok := a.boundPortMap[port] + if !ok { + continue + } + + modified := false + for i, vh := range r.VirtualHosts { + for domainIndex, domain := range vh.Domains { + parts := strings.Split(domain, ":") + if len(parts) == 2 { + modified = true + r.VirtualHosts[i].Domains[domainIndex] = fmt.Sprintf("%s:%d", parts[0], boundPort) + } + } + } + + if modified { + // Update the resource. + b, err := r.Marshal() + if err != nil { + return nil, err + } + newResponse.Resources[i].Value = b + } + } + } + + return &newResponse, nil +} + +func (a *discoveryFilterImpl) bindOutboundPort(any *googleProtobuf6.Any, l *xdsapi.Listener) error { + portFromPilot := int(l.Address.GetSocketAddress().GetPortValue()) + boundPort, ok := a.boundPortMap[portFromPilot] + + // Bind a real port for the outbound listener if we haven't already. + if !ok { + var err error + boundPort, err = findFreePort(a.portManager) + if err != nil { + return err + } + a.boundPortMap[portFromPilot] = boundPort + } + + // Store the bound port in the listener. + l.Address.GetSocketAddress().PortSpecifier.(*xdsapiCore.SocketAddress_PortValue).PortValue = uint32(boundPort) + l.DeprecatedV1.BindToPort.Value = true + + // Output this content of the any. + b, err := l.Marshal() + if err != nil { + return err + } + any.Value = b + return nil +} + +func isVirtualListener(l *xdsapi.Listener) bool { + return l.Name == "virtual" +} + +// nolint: staticcheck +func getTCPProxyClusterName(filter *xdsapiListener.Filter) (string, error) { + // First, check if it's using the deprecated v1 format. + config := filter.GetConfig() + if config == nil { + config, _ = envoyUtil.MessageToStruct(filter.GetTypedConfig()) + } + fields := config.Fields + deprecatedV1, ok := fields["deprecated_v1"] + if ok && deprecatedV1.GetBoolValue() { + v, ok := fields["value"] + if !ok { + return "", errors.New("value field missing") + } + v, ok = v.GetStructValue().Fields["route_config"] + if !ok { + return "", errors.New("route_config field missing") + } + v, ok = v.GetStructValue().Fields["routes"] + if !ok { + return "", errors.New("routes field missing") + } + vs := v.GetListValue().Values + for _, v = range vs { + v, ok = v.GetStructValue().Fields["cluster"] + if ok { + return v.GetStringValue(), nil + } + } + return "", errors.New("cluster field missing") + } + + cfg := &envoyFilterTcp.TcpProxy{} + var err error + if filter.GetConfig() != nil { + err = envoyUtil.StructToMessage(filter.GetConfig(), cfg) + } else { + err = cfg.Unmarshal(filter.GetTypedConfig().GetValue()) + } + if err != nil { + return "", err + } + clusterSpec := cfg.ClusterSpecifier.(*envoyFilterTcp.TcpProxy_Cluster) + if clusterSpec == nil { + return "", fmt.Errorf("expected TCPProxy cluster") + } + return clusterSpec.Cluster, nil +} + +// nolint: staticcheck +func isInboundListener(l *xdsapi.Listener) (bool, error) { + for _, filter := range l.FilterChains[0].Filters { + switch filter.Name { + case envoyUtil.HTTPConnectionManager: + cfg := &envoyFilterHttp.HttpConnectionManager{} + var err error + if filter.GetConfig() != nil { + err = envoyUtil.StructToMessage(filter.GetConfig(), cfg) + } else { + err = cfg.Unmarshal(filter.GetTypedConfig().GetValue()) + } + if err != nil { + return false, err + } + rcfg := cfg.GetRouteConfig() + if rcfg != nil { + if strings.HasPrefix(rcfg.Name, "inbound") { + return true, nil + } + } + return false, nil + case envoyUtil.TCPProxy: + clusterName, err := getTCPProxyClusterName(&filter) + if err != nil { + return false, err + } + return strings.HasPrefix(clusterName, "inbound"), nil + } + } + + return false, fmt.Errorf("unable to determine whether the listener is inbound: %s", pb2Json(l)) +} + +func isOutboundListener(l *xdsapi.Listener) (bool, error) { + for _, filter := range l.FilterChains[0].Filters { + switch filter.Name { + case envoyUtil.HTTPConnectionManager: + return outboundHTTPListenerNamePattern.MatchString(l.Name), nil + case envoyUtil.TCPProxy: + clusterName, err := getTCPProxyClusterName(&filter) + if err != nil { + return false, err + } + return strings.HasPrefix(clusterName, "outbound"), nil + } + } + + return false, fmt.Errorf("unable to determine whether the listener is outbound: %s", pb2Json(l)) +} diff --git a/pkg/test/framework/components/echo/native/instance.go b/pkg/test/framework/components/echo/native/instance.go new file mode 100644 index 000000000000..a3c156cec875 --- /dev/null +++ b/pkg/test/framework/components/echo/native/instance.go @@ -0,0 +1,122 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package native + +import ( + "io" + "testing" + + "github.com/hashicorp/go-multierror" + + appEcho "istio.io/istio/pkg/test/application/echo" + "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/framework/components/echo/common" + "istio.io/istio/pkg/test/framework/components/environment/native" + "istio.io/istio/pkg/test/framework/resource" +) + +var ( + _ echo.Instance = &instance{} + _ io.Closer = &instance{} +) + +type instance struct { + id resource.ID + config echo.Config + workload *workload +} + +// New creates a new native echo instance. +func New(ctx resource.Context, cfg echo.Config) (out echo.Instance, err error) { + env := ctx.Environment().(*native.Environment) + + // Fill in defaults for any missing values. + if err = common.FillInDefaults(ctx, env.Domain, &cfg); err != nil { + return nil, err + } + + c := &instance{ + config: cfg, + } + c.id = ctx.TrackResource(c) + + // Create the workload for this configuration and assign ports. + c.workload, err = newWorkload(ctx, &c.config) + if err != nil { + return nil, err + } + + return c, nil +} + +func (c *instance) ID() resource.ID { + return c.id +} + +func (c *instance) WaitUntilReady(outboundInstances ...echo.Instance) error { + // No need to check for inbound readiness, since inbound ports for the native echo instance + // are configured by bootstrap. + + if c.workload.sidecar == nil { + // No sidecar, nothing to do. + return nil + } + + return c.workload.sidecar.WaitForConfig(common.OutboundConfigAcceptFunc(outboundInstances...)) +} + +func (c *instance) WaitUntilReadyOrFail(t testing.TB, outboundInstance ...echo.Instance) { + if err := c.WaitUntilReady(); err != nil { + t.Fatal(err) + } +} + +func (c *instance) Config() echo.Config { + return c.config +} + +func (c *instance) Workloads() ([]echo.Workload, error) { + return []echo.Workload{c.workload}, nil +} + +func (c *instance) WorkloadsOrFail(t testing.TB) []echo.Workload { + out, err := c.Workloads() + if err != nil { + t.Fatal(err) + } + return out +} + +func (c *instance) Call(opts echo.CallOptions) (appEcho.ParsedResponses, error) { + // Override the Host. + opts.Host = localhost + + return common.CallEcho(c.workload.Client, opts) +} + +func (c *instance) CallOrFail(t testing.TB, opts echo.CallOptions) appEcho.ParsedResponses { + r, err := c.Call(opts) + if err != nil { + t.Fatal(err) + } + return r +} + +func (c *instance) Close() (err error) { + if c.workload != nil { + err = multierror.Append(err, c.workload.Close()).ErrorOrNil() + } + return +} diff --git a/pkg/test/framework/components/echo/native/service.go b/pkg/test/framework/components/echo/native/service.go new file mode 100644 index 000000000000..18226be7fbae --- /dev/null +++ b/pkg/test/framework/components/echo/native/service.go @@ -0,0 +1,121 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package native + +import ( + "bufio" + "bytes" + "fmt" + "text/template" + + "istio.io/istio/galley/pkg/metadata" + "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/framework/components/galley" + "istio.io/istio/pkg/test/framework/components/namespace" +) + +const ( + serviceEntryYAML = ` +apiVersion: networking.istio.io/v1alpha3 +kind: ServiceEntry +metadata: + name: {{.ServiceName}} + labels: + app: {{.ServiceName}} + version: {{.Version}} +spec: + hosts: + - {{.ServiceName}}.{{.Namespace}}.{{.Domain}} + addresses: + - 127.0.0.1/32 + ports: + {{ range $i, $p := .Ports -}} + - number: {{$p.ServicePort}} + name: {{$p.Name}} + protocol: {{$p.Protocol}} + {{ end -}} + resolution: STATIC + location: MESH_INTERNAL + endpoints: + - address: 127.0.0.1 + ports: + {{ range $i, $p := .Ports -}} + {{$p.Name}}: {{$p.ServicePort}} + {{ end -}} +` +) + +var ( + serviceEntryTemplate *template.Template + + serviceEntryCollection = metadata.IstioNetworkingV1alpha3Serviceentries.Collection.String() +) + +func init() { + serviceEntryTemplate = template.New("service_entry") + if _, err := serviceEntryTemplate.Parse(serviceEntryYAML); err != nil { + panic("unable to parse Service Entry template") + } +} + +type serviceConfig struct { + ns namespace.Instance + ports []echo.Port + service string + domain string + version string +} + +func (c serviceConfig) applyTo(g galley.Instance) (*galley.SnapshotObject, error) { + // Generate the ServiceEntry YAML. + var filled bytes.Buffer + w := bufio.NewWriter(&filled) + if err := serviceEntryTemplate.Execute(w, map[string]interface{}{ + "ServiceName": c.service, + "Version": c.version, + "Namespace": c.ns.Name(), + "Domain": c.domain, + "Ports": c.ports, + }); err != nil { + return nil, err + } + if err := w.Flush(); err != nil { + return nil, err + } + serviceEntryYAML := filled.String() + + // Apply the config to Galley. + if err := g.ApplyConfig(c.ns, serviceEntryYAML); err != nil { + return nil, err + } + + // Wait for the ServiceEntry to be made available by Galley. + var out *galley.SnapshotObject + mcpName := c.ns.Name() + "/" + c.service + err := g.WaitForSnapshot(serviceEntryCollection, func(actuals []*galley.SnapshotObject) error { + for _, actual := range actuals { + if actual.Metadata.Name == mcpName { + out = actual + return nil + } + } + return fmt.Errorf("never received ServiceEntry %s from Galley", mcpName) + }) + + if err != nil { + return nil, err + } + return out, nil +} diff --git a/pkg/test/framework/components/echo/native/sidecar.go b/pkg/test/framework/components/echo/native/sidecar.go new file mode 100644 index 000000000000..3e9cb71c8579 --- /dev/null +++ b/pkg/test/framework/components/echo/native/sidecar.go @@ -0,0 +1,294 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package native + +import ( + "bufio" + "bytes" + "fmt" + "io/ioutil" + "net" + "strings" + "text/template" + + envoyAdmin "github.com/envoyproxy/go-control-plane/envoy/admin/v2alpha" + + "istio.io/istio/pilot/pkg/model" + "istio.io/istio/pkg/test/envoy" + "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/framework/components/echo/common" + "istio.io/istio/pkg/test/util/reserveport" + "istio.io/istio/pkg/test/util/retry" +) + +const ( + serviceNodeSeparator = "~" + serviceCluster = "local" + proxyType = "sidecar" + + envoyBootstrapYAML = ` +{{- $serviceName := .ServiceName -}} +stats_config: + use_all_default_tags: false +node: + id: {{ .NodeID }} + cluster: {{ .Cluster }} +admin: + access_log_path: "/dev/null" + address: + socket_address: + address: 127.0.0.1 + port_value: {{.AdminPort}} +dynamic_resources: + lds_config: + ads: {} + cds_config: + ads: {} + ads_config: + api_type: GRPC + refresh_delay: 1s + grpc_services: + - envoy_grpc: + cluster_name: xds-grpc +static_resources: + clusters: + - name: xds-grpc + type: STATIC + connect_timeout: 1s + lb_policy: ROUND_ROBIN + http2_protocol_options: {} + hosts: + - socket_address: + address: 127.0.0.1 + port_value: {{.DiscoveryPort}} + {{ range $i, $p := .Ports -}} + - name: service_{{$serviceName}}_{{$p.InstancePort}} + connect_timeout: 0.25s + type: STATIC + lb_policy: ROUND_ROBIN + hosts: + - socket_address: + address: 127.0.0.1 + port_value: {{$p.InstancePort}} + {{ end -}} + listeners: + {{- range $i, $p := .Ports }} + - address: + socket_address: + address: 127.0.0.1 + port_value: {{$p.ServicePort}} + use_original_dst: true + filter_chains: + - filters: + {{- if $p.Protocol.IsHTTP }} + - name: envoy.http_connection_manager + config: + codec_type: auto + {{- if $p.Protocol.IsHTTP2 }} + http2_protocol_options: + max_concurrent_streams: 1073741824 + {{- end }} + stat_prefix: ingress_http + route_config: + name: service_{{$serviceName}}_{{$p.ServicePort}}_to_{{$p.InstancePort}} + virtual_hosts: + - name: service_{{$serviceName}} + domains: + - "*" + routes: + - match: + prefix: "/" + route: + cluster: service_{{$serviceName}}_{{$p.InstancePort}} + http_filters: + - name: envoy.cors + config: {} + - name: envoy.fault + config: {} + - name: envoy.router + config: {} + {{- else }} + - name: envoy.tcp_proxy + config: + stat_prefix: ingress_tcp + cluster: service_{{$serviceName}}_{{$p.InstancePort}} + {{- end }} + {{- end -}} +` +) + +var ( + envoyBootstrapTemplate *template.Template + + _ echo.Sidecar = &sidecar{} +) + +func init() { + envoyBootstrapTemplate = template.New("istio_agent_envoy_config") + _, err := envoyBootstrapTemplate.Parse(envoyBootstrapYAML) + if err != nil { + panic("unable to parse Envoy bootstrap config") + } +} + +type sidecarConfig struct { + service string + namespace string + domain string + outDir string + servicePorts model.PortList + portManager reserveport.PortManager + discoveryAddress *net.TCPAddr + envoyLogLevel envoy.LogLevel +} + +func newSidecar(cfg sidecarConfig) (*sidecar, error) { + // Generate the port mappings between Envoy and the backend service. + adminPort, mappedPorts, err := createEnvoyPorts(cfg.portManager, cfg.servicePorts) + if err != nil { + return nil, err + } + + nodeID := generateEnvoyServiceNode(cfg.service, cfg.namespace, cfg.domain) + + // Create the YAML configuration file for Envoy. + yamlFile, err := createEnvoyBootstrapFile(cfg.outDir, cfg.service, nodeID, + adminPort, cfg.discoveryAddress.Port, mappedPorts) + if err != nil { + return nil, err + } + + // Start Envoy with the configuration + e := &envoy.Envoy{ + YamlFile: yamlFile, + LogLevel: cfg.envoyLogLevel, + LogEntryPrefix: fmt.Sprintf("[ENVOY-%s]", nodeID), + } + if err = e.Start(); err != nil { + return nil, err + } + + // Wait for Envoy to become healthy. + if err = envoy.WaitForHealthCheckLive(adminPort); err != nil { + _ = e.Stop() + return nil, err + } + + return &sidecar{ + adminPort: adminPort, + ports: mappedPorts, + nodeID: nodeID, + yamlFile: yamlFile, + envoy: e, + }, nil +} + +type sidecar struct { + adminPort int + ports []echo.Port + nodeID string + yamlFile string + envoy *envoy.Envoy +} + +func (s *sidecar) GetPorts() []echo.Port { + return s.ports +} + +// FindFirstPortForProtocol is a utility method to simplify lookup of a port for a given protocol. +func (s *sidecar) FindFirstPortForProtocol(protocol model.Protocol) (echo.Port, error) { + for _, port := range s.GetPorts() { + if port.Protocol == protocol { + return port, nil + } + } + return echo.Port{}, fmt.Errorf("no port found matching protocol %v", protocol) +} + +func (s *sidecar) Info() (*envoyAdmin.ServerInfo, error) { + return envoy.GetServerInfo(s.adminPort) +} + +func (s *sidecar) Config() (*envoyAdmin.ConfigDump, error) { + return envoy.GetConfigDump(s.adminPort) +} + +func (s *sidecar) WaitForConfig(accept func(*envoyAdmin.ConfigDump) (bool, error), options ...retry.Option) error { + return common.WaitForConfig(s.Config, accept, options...) +} + +func (s *sidecar) Stop() { + _ = s.envoy.Stop() +} + +func generateEnvoyServiceNode(serviceName, namespace, domain string) string { + id := fmt.Sprintf("%s.%s", serviceName, randomBase64String(10)) + return strings.Join([]string{proxyType, localhost, id, namespace + "." + domain}, serviceNodeSeparator) +} + +func createEnvoyPorts(portManager reserveport.PortManager, servicePorts model.PortList) (adminPort int, mappedPorts []echo.Port, err error) { + if adminPort, err = findFreePort(portManager); err != nil { + return + } + + mappedPorts = make([]echo.Port, len(servicePorts)) + for i, servicePort := range servicePorts { + var envoyPort int + envoyPort, err = findFreePort(portManager) + if err != nil { + return + } + + mappedPorts[i] = echo.Port{ + Name: servicePort.Name, + Protocol: servicePort.Protocol, + ServicePort: envoyPort, + InstancePort: servicePort.Port, + } + } + return +} + +func createEnvoyBootstrapFile(outDir, serviceName, nodeID string, adminPort, discoveryPort int, ports []echo.Port) (string, error) { + // Create an output file to hold the generated configuration. + yamlFile, err := createTempFile(outDir, "envoy_bootstrap", ".yaml") + if err != nil { + return "", err + } + + // Apply the template with the current configuration + var filled bytes.Buffer + w := bufio.NewWriter(&filled) + if err := envoyBootstrapTemplate.Execute(w, map[string]interface{}{ + "ServiceName": serviceName, + "NodeID": nodeID, + "Cluster": serviceCluster, + "AdminPort": adminPort, + "Ports": ports, + "DiscoveryPort": discoveryPort, + }); err != nil { + return "", err + } + if err := w.Flush(); err != nil { + return "", err + } + configBytes := filled.Bytes() + + // Write the content of the file. + if err := ioutil.WriteFile(yamlFile, configBytes, 0644); err != nil { + return "", err + } + return yamlFile, nil +} diff --git a/pkg/test/framework/components/echo/native/util.go b/pkg/test/framework/components/echo/native/util.go new file mode 100644 index 000000000000..dae4f9523a96 --- /dev/null +++ b/pkg/test/framework/components/echo/native/util.go @@ -0,0 +1,77 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package native + +import ( + "crypto/rand" + "encoding/base64" + "io/ioutil" + "os" + "path/filepath" + + "github.com/gogo/protobuf/jsonpb" + "github.com/gogo/protobuf/proto" + + "istio.io/istio/pkg/test/util/reserveport" +) + +const ( + localhost = "127.0.0.1" +) + +func findFreePort(portMgr reserveport.PortManager) (int, error) { + reservedPort, err := portMgr.ReservePort() + if err != nil { + return 0, err + } + defer func() { + _ = reservedPort.Close() + }() + + return int(reservedPort.GetPort()), nil +} + +func randomBase64String(length int) string { + buff := make([]byte, length) + _, _ = rand.Read(buff) + str := base64.URLEncoding.EncodeToString(buff) + return str[:length] +} + +func createTempFile(tmpDir, prefix, suffix string) (string, error) { + f, err := ioutil.TempFile(tmpDir, prefix) + if err != nil { + return "", err + } + var tmpName string + if tmpName, err = filepath.Abs(f.Name()); err != nil { + return "", err + } + if err = f.Close(); err != nil { + return "", err + } + if err = os.Remove(tmpName); err != nil { + return "", err + } + return tmpName + suffix, nil +} + +func pb2Json(pb proto.Message) string { + m := jsonpb.Marshaler{ + Indent: " ", + } + str, _ := m.MarshalToString(pb) + return str +} diff --git a/pkg/test/framework/components/echo/native/workload.go b/pkg/test/framework/components/echo/native/workload.go new file mode 100644 index 000000000000..c5c71145422c --- /dev/null +++ b/pkg/test/framework/components/echo/native/workload.go @@ -0,0 +1,195 @@ +// Copyright 2019 Istio Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package native + +import ( + "errors" + "fmt" + + "github.com/hashicorp/go-multierror" + + "istio.io/istio/pilot/pkg/model" + "istio.io/istio/pkg/test/application" + appEcho "istio.io/istio/pkg/test/application/echo" + "istio.io/istio/pkg/test/envoy" + "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/framework/components/environment/native" + "istio.io/istio/pkg/test/framework/components/pilot" + "istio.io/istio/pkg/test/framework/resource" +) + +const ( + envoyLogLovel = envoy.LogLevelWarning +) + +var _ echo.Workload = &workload{} + +type workload struct { + *appEcho.Client + + discoveryFilter discoveryFilter + app application.Application + sidecar *sidecar +} + +func newWorkload(ctx resource.Context, cfg *echo.Config) (w *workload, err error) { + env := ctx.Environment().(*native.Environment) + + w = &workload{} + + defer func() { + if err != nil { + _ = w.Close() + } + }() + + // Convert the configured ports for the echo application. Ignore any specified port numbers. + appPorts := make(model.PortList, 0, len(cfg.Ports)) + for _, p := range cfg.Ports { + appPorts = append(appPorts, &model.Port{ + Name: p.Name, + Protocol: p.Protocol, + }) + } + appFactory := &appEcho.Factory{ + Ports: appPorts, + Version: cfg.Version, + } + + if cfg.Sidecar { + // Using a sidecar Envoy proxy. Need to wire up a custom discovery filter and start Envoy... + + if cfg.Galley == nil { + return nil, fmt.Errorf("galley must be provided when running echo with a sidecar") + } + if cfg.Pilot == nil { + return nil, fmt.Errorf("pilot must be provided when running echo with a sidecar") + } + + // Get Pilot's discovery address. + pilotDiscoveryAddress := cfg.Pilot.(pilot.Native).GetDiscoveryAddress() + + // Create the discovery filter that modifies the XDS from Pilot to allow the application run + // run natively. + w.discoveryFilter, err = newDiscoverFilter(pilotDiscoveryAddress.String(), env.PortManager) + if err != nil { + return nil, err + } + + // Create and start the application. + w.app, err = newAppFilter(w.discoveryFilter, appFactory) + if err != nil { + return nil, err + } + + // Create a temp directory for the Envoy boostrap YAML file. + tmpDir, err := ctx.CreateTmpDirectory("echo_" + cfg.Service) + if err != nil { + return nil, err + } + + // Create an start a new sidecar. + if w.sidecar, err = newSidecar(sidecarConfig{ + discoveryAddress: w.discoveryFilter.GetDiscoveryAddress(), + portManager: env.PortManager, + outDir: tmpDir, + domain: env.Domain, + service: cfg.Service, + envoyLogLevel: envoyLogLovel, + namespace: cfg.Namespace.Name(), + servicePorts: w.app.GetPorts(), + }); err != nil { + return nil, err + } + + // Apply the service config to Galley. + svcCfg := serviceConfig{ + service: cfg.Service, + ns: cfg.Namespace, + domain: env.Domain, + version: cfg.Version, + ports: w.sidecar.GetPorts(), + } + if _, err = svcCfg.applyTo(cfg.Galley); err != nil { + return nil, err + } + + // Update the ports in the configuration to reflect the port mapping between Envoy and the Application. + cfg.Ports = w.sidecar.GetPorts() + } else { + // No sidecar is simple - just create the app... + + w.app, err = appFactory.NewApplication(application.DefaultDialer) + if err != nil { + return nil, err + } + + // Update the configuration with the ports assigned by the application. + cfg.Ports = cfg.Ports[:0] + for _, p := range w.app.GetPorts() { + cfg.Ports = append(cfg.Ports, echo.Port{ + Name: p.Name, + Protocol: p.Protocol, + ServicePort: p.Port, + InstancePort: p.Port, + }) + } + } + + // Get the GRPC port. + var grpcPort uint16 + for _, p := range cfg.Ports { + if p.Protocol == model.ProtocolGRPC { + grpcPort = uint16(p.InstancePort) + break + } + } + + // Create the client for sending forward requests. + if grpcPort == 0 { + // This should never happen, since we're manually adding a GRPC port if one doesn't exist. + return nil, errors.New("unable to find grpc port for application") + } + + w.Client, err = appEcho.NewClient(fmt.Sprintf("%s:%d", localhost, grpcPort)) + if err != nil { + return nil, err + } + return w, nil +} + +func (w *workload) Address() string { + return localhost +} + +func (w *workload) Sidecar() echo.Sidecar { + return w.sidecar +} + +func (w *workload) Close() (err error) { + if w.Client != nil { + err = multierror.Append(err, w.Client.Close()).ErrorOrNil() + } + if w.sidecar != nil { + w.sidecar.Stop() + } + if w.discoveryFilter != nil { + w.discoveryFilter.Stop() + } + if w.app != nil { + err = multierror.Append(err, w.app.Close()).ErrorOrNil() + } + return +} diff --git a/tests/integration/echo/echo_test.go b/tests/integration/echo/echo_test.go index 91d3db747992..20ea4d4ee35d 100644 --- a/tests/integration/echo/echo_test.go +++ b/tests/integration/echo/echo_test.go @@ -20,46 +20,94 @@ import ( "istio.io/istio/pilot/pkg/model" "istio.io/istio/pkg/test/framework" "istio.io/istio/pkg/test/framework/components/echo" - "istio.io/istio/pkg/test/framework/components/environment" + "istio.io/istio/pkg/test/framework/components/echo/echoboot" + "istio.io/istio/pkg/test/framework/components/galley" + "istio.io/istio/pkg/test/framework/components/istio" + "istio.io/istio/pkg/test/framework/components/namespace" + "istio.io/istio/pkg/test/framework/components/pilot" +) + +var ( + ist istio.Instance ) // TODO(sven): Add additional testing of the echo component, this is just the basics. func TestEcho(t *testing.T) { - ctx := framework.NewContext(t) + framework.Run(t, func(ctx framework.TestContext) { + g := galley.NewOrFail(t, ctx, galley.Config{}) + p := pilot.NewOrFail(t, ctx, pilot.Config{ + Galley: g, + }) + + ns := namespace.NewOrFail(t, ctx, "test", true) + a := echoboot.NewOrFail(ctx, t, echo.Config{ + Pilot: p, + Galley: g, + Namespace: ns, + Sidecar: true, + Service: "a", + Version: "v1", + }) + b := echoboot.NewOrFail(ctx, t, echo.Config{ + Pilot: p, + Galley: g, + Namespace: ns, + Sidecar: true, + Service: "b", + Version: "v2", + Ports: []echo.Port{ + { + Name: "http", + Protocol: model.ProtocolHTTP, + }, + }}) - // Echo is only supported on native environment right now, skip if we can't load that. - ctx.RequireOrSkip(t, environment.Native) + a.WaitUntilReadyOrFail(t, b) - echoA := echo.NewOrFail(ctx, t, echo.Config{ - Service: "a.echo", - Version: "v1", + a.CallOrFail(t, echo.CallOptions{ + Target: b, + PortName: "http", + }).CheckOKOrFail(t) }) - echoB := echo.NewOrFail(ctx, t, echo.Config{ - Service: "b.echo", - Version: "v2", - Ports: model.PortList{ - { - Name: "http", - Protocol: model.ProtocolHTTP, - }, - }}) +} + +func TestEchoNoSidecar(t *testing.T) { + framework.Run(t, func(ctx framework.TestContext) { + g := galley.NewOrFail(t, ctx, galley.Config{}) + p := pilot.NewOrFail(t, ctx, pilot.Config{ + Galley: g, + }) - // Verify the configuration was set appropriately. - if echoA.Config().Service != "a.echo" { - t.Fatalf("expected 'a.echo' but echoA service was %s", echoA.Config().Service) - } - if echoB.Config().Service != "b.echo" { - t.Fatalf("expected 'b.echo' but echoB service was %s", echoB.Config().Service) - } + ns := namespace.NewOrFail(t, ctx, "test", true) + a := echoboot.NewOrFail(ctx, t, echo.Config{ + Pilot: p, + Galley: g, + Namespace: ns, + Service: "a", + Version: "v1", + }) + b := echoboot.NewOrFail(ctx, t, echo.Config{ + Pilot: p, + Galley: g, + Namespace: ns, + Service: "b", + Version: "v2", + Ports: []echo.Port{ + { + Name: "http", + Protocol: model.ProtocolHTTP, + }, + }}) - be := echoB.EndpointsForProtocol(model.ProtocolHTTP)[0] - result := echoA.CallOrFail(be, echo.CallOptions{}, t)[0] + a.WaitUntilReadyOrFail(t, b) - if !result.IsOK() { - t.Fatalf("HTTP Request unsuccessful: %s", result.Body) - } + a.CallOrFail(t, echo.CallOptions{ + Target: b, + PortName: "http", + }).CheckOKOrFail(t) + }) } func TestMain(m *testing.M) { - framework.Main("echo_test", m) + framework.Main("echo_test", m, istio.SetupOnKube(&ist, nil)) } From 53003637b5d2eb653ba9d4b96459d5bf52f83444 Mon Sep 17 00:00:00 2001 From: nmittler Date: Fri, 19 Apr 2019 20:45:09 -0700 Subject: [PATCH 2/3] addressing comments --- pkg/test/framework/components/echo/call.go | 20 ++--- .../framework/components/echo/common/call.go | 50 ++++++------ .../components/echo/common/config.go | 28 ++++--- .../components/echo/common/portgen.go | 77 ++++++++----------- .../components/echo/native/service.go | 29 ++++--- .../components/echo/native/workload.go | 11 +-- 6 files changed, 108 insertions(+), 107 deletions(-) diff --git a/pkg/test/framework/components/echo/call.go b/pkg/test/framework/components/echo/call.go index 9f5d4e2b279e..d1dfc1f72d7d 100644 --- a/pkg/test/framework/components/echo/call.go +++ b/pkg/test/framework/components/echo/call.go @@ -20,17 +20,12 @@ import "net/http" type CallProtocol string const ( - // HTTP calls echo with HTTP - HTTP CallProtocol = "http" - - // GRPC calls echo with GRPC - GRPC CallProtocol = "grpc" - - // TCP calls echo with TCP - TCP CallProtocol = "tcp" - - // WebSocket calls echo with WebSocket - WebSocket CallProtocol = "ws" + HTTP CallProtocol = "http" + HTTPS CallProtocol = "https" + GRPC CallProtocol = "grpc" + GRPCS CallProtocol = "grpcs" + WebSocket CallProtocol = "ws" + WebSocketS CallProtocol = "wss" ) // CallOptions defines options for calling a Endpoint. @@ -61,7 +56,4 @@ type CallOptions struct { // Headers indicates headers that should be sent in the request. Ignored for WebSocket calls. Headers http.Header - - // Secure indicates whether a secure connection should be used. - Secure bool } diff --git a/pkg/test/framework/components/echo/common/call.go b/pkg/test/framework/components/echo/common/call.go index a8bd7824b9e4..793b91cc8f02 100644 --- a/pkg/test/framework/components/echo/common/call.go +++ b/pkg/test/framework/components/echo/common/call.go @@ -17,14 +17,14 @@ package common import ( "errors" "fmt" + "istio.io/istio/pilot/pkg/model" + appEcho "istio.io/istio/pkg/test/application/echo" + "istio.io/istio/pkg/test/application/echo/proto" + "istio.io/istio/pkg/test/framework/components/echo" "net" "net/url" "reflect" "strconv" - - appEcho "istio.io/istio/pkg/test/application/echo" - "istio.io/istio/pkg/test/application/echo/proto" - "istio.io/istio/pkg/test/framework/components/echo" ) func CallEcho(client *appEcho.Client, opts echo.CallOptions) (appEcho.ParsedResponses, error) { @@ -33,7 +33,11 @@ func CallEcho(client *appEcho.Client, opts echo.CallOptions) (appEcho.ParsedResp } // Forward a request from 'this' service to the destination service. - targetURL := makeURL(opts) + targetURL := &url.URL{ + Scheme: string(opts.Protocol), + Host: net.JoinHostPort(opts.Host, strconv.Itoa(opts.Port.ServicePort)), + Path: opts.Path, + } targetService := opts.Target.Config().Service var headers []*proto.Header @@ -100,6 +104,14 @@ func fillInCallOptions(opts *echo.CallOptions) error { } } + if opts.Protocol == "" { + // No protocol, fill it in. + var err error + if opts.Protocol, err = protocolForPort(opts.Port); err != nil { + return err + } + } + if opts.Host == "" { // No host specified, use the fully qualified domain name for the service. opts.Host = opts.Target.Config().FQDN() @@ -112,24 +124,16 @@ func fillInCallOptions(opts *echo.CallOptions) error { return nil } -func makeURL(opts echo.CallOptions) *url.URL { - protocol := string(normalizeProtocol(opts.Protocol)) - if opts.Secure { - protocol += "s" - } - - return &url.URL{ - Scheme: protocol, - Host: net.JoinHostPort(opts.Host, strconv.Itoa(opts.Port.ServicePort)), - Path: opts.Path, - } -} - -func normalizeProtocol(p echo.CallProtocol) echo.CallProtocol { - switch p { - case echo.HTTP, echo.GRPC, echo.WebSocket: - return p +func protocolForPort(port *echo.Port) (echo.CallProtocol, error) { + switch port.Protocol { + case model.ProtocolGRPC, model.ProtocolGRPCWeb, model.ProtocolHTTP2: + return echo.GRPC, nil + case model.ProtocolHTTP, model.ProtocolTCP: + return echo.HTTP, nil + case model.ProtocolHTTPS, model.ProtocolTLS: + return echo.HTTPS, nil default: - return echo.HTTP + return "", fmt.Errorf("failed creating call for port %s: unsupported protocol %s", + port.Name, port.Protocol) } } diff --git a/pkg/test/framework/components/echo/common/config.go b/pkg/test/framework/components/echo/common/config.go index 4b42504683d8..4b4fa760df01 100644 --- a/pkg/test/framework/components/echo/common/config.go +++ b/pkg/test/framework/components/echo/common/config.go @@ -49,6 +49,17 @@ func FillInDefaults(ctx resource.Context, defaultDomain string, c *echo.Config) } } + // Append a gRPC port, if none was provided. This is needed + // for controlling the app. + if GetGRPCPort(c) == nil { + c.Ports = append([]echo.Port{ + { + Name: "grpc", + Protocol: model.ProtocolGRPC, + }, + }, c.Ports...) + } + // Mark all user-defined ports as used, so the port generator won't assign them. portGen := newPortGenerators() for _, p := range c.Ports { @@ -66,18 +77,15 @@ func FillInDefaults(ctx resource.Context, defaultDomain string, c *echo.Config) } } - // Append a gRPC port, if none was provided. This is needed - // for controlling the app. - if GetGRPCPort(c) == nil { - c.Ports = append([]echo.Port{ - { - Name: "grpc", - Protocol: model.ProtocolGRPC, - }, - }, c.Ports...) + // Second pass: try to make unassigned instance ports match service port. + for i, p := range c.Ports { + if p.InstancePort <= 0 && p.ServicePort > 0 && !portGen.Instance.IsUsed(p.ServicePort) { + c.Ports[i].InstancePort = p.ServicePort + portGen.Instance.SetUsed(p.ServicePort) + } } - // Now, assign default values for any ports that haven't been specified. + // Final pass: assign default values for any ports that haven't been specified. for i, p := range c.Ports { if p.ServicePort <= 0 { c.Ports[i].ServicePort = portGen.Service.Next(p.Protocol) diff --git a/pkg/test/framework/components/echo/common/portgen.go b/pkg/test/framework/components/echo/common/portgen.go index 921df517d08f..63019d2d6bd0 100644 --- a/pkg/test/framework/components/echo/common/portgen.go +++ b/pkg/test/framework/components/echo/common/portgen.go @@ -20,6 +20,13 @@ import ( "istio.io/istio/pilot/pkg/model" ) +const ( + httpBase = 80 + httpsBase = 443 + grpcBase = 7070 + tcpBase = 9090 +) + // portGenerators creates a set of generators for service and instance ports. type portGenerators struct { Service *portGenerator @@ -37,24 +44,25 @@ func newPortGenerators() *portGenerators { // portGenerator is a utility that generates reasonable default port values // for a given protocol. type portGenerator struct { - nextHTTP []int - httpIndex int - - nextGRPC []int - grpcIndex int - - nextTCP []int - tcpIndex int - + next map[model.Protocol]int used map[int]struct{} } func newPortGenerator() *portGenerator { return &portGenerator{ - nextHTTP: []int{80, 8080}, - nextTCP: []int{90, 9090}, - nextGRPC: []int{70, 7070}, - used: make(map[int]struct{}), + next: map[model.Protocol]int{ + model.ProtocolHTTP: httpBase, + model.ProtocolHTTPS: httpsBase, + model.ProtocolTLS: httpsBase, + model.ProtocolTCP: tcpBase, + model.ProtocolGRPCWeb: grpcBase, + model.ProtocolGRPC: grpcBase, + model.ProtocolMongo: tcpBase, + model.ProtocolMySQL: tcpBase, + model.ProtocolRedis: tcpBase, + model.ProtocolUDP: tcpBase, + }, + used: make(map[int]struct{}), } } @@ -72,43 +80,26 @@ func (g *portGenerator) IsUsed(port int) bool { } // Next assigns the next port for the given protocol. -func (g *portGenerator) Next(p model.Protocol) int { - var next int - +func (g *portGenerator) Next(protocol model.Protocol) int { for { - var nextArray []int - var index *int - switch p { - case model.ProtocolHTTP: - nextArray = g.nextHTTP - index = &g.httpIndex - case model.ProtocolGRPC: - nextArray = g.nextGRPC - index = &g.grpcIndex - default: - nextArray = g.nextTCP - index = &g.tcpIndex - } - - // Get the next value - next = nextArray[*index] + v := g.next[protocol] - // Update the next. - nextArray[*index]++ + if v == 0 { + panic("echo port generator: unsupported protocol " + protocol) + } - if *index == math.MaxInt16 { + if v == math.MaxInt16 { panic("echo port generator: ran out of ports") } - *index++ + g.next[protocol] = v + 1 - if !g.IsUsed(next) { - // Mark this port as used. - g.SetUsed(next) - break + if g.IsUsed(v) { + continue } - // Otherwise, the port was already used, pick another one. - } - return next + // Mark this port as used. + g.SetUsed(v) + return v + } } diff --git a/pkg/test/framework/components/echo/native/service.go b/pkg/test/framework/components/echo/native/service.go index 18226be7fbae..8d874166ab77 100644 --- a/pkg/test/framework/components/echo/native/service.go +++ b/pkg/test/framework/components/echo/native/service.go @@ -31,25 +31,28 @@ const ( apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: - name: {{.ServiceName}} + name: {{ .ServiceName }} labels: - app: {{.ServiceName}} - version: {{.Version}} + app: {{ .ServiceName }} + version: {{ .Version }} spec: hosts: - - {{.ServiceName}}.{{.Namespace}}.{{.Domain}} + - {{ .ServiceName }}.{{ .Namespace }}.{{ .Domain }} addresses: - 127.0.0.1/32 ports: {{ range $i, $p := .Ports -}} - - number: {{$p.ServicePort}} - name: {{$p.Name}} - protocol: {{$p.Protocol}} + - number: {{ $p.ServicePort }} + name: {{ $p.Name }} + protocol: {{ $p.Protocol }} {{ end -}} resolution: STATIC location: MESH_INTERNAL endpoints: - address: 127.0.0.1 + {{ if ne .Locality "" }} + locality: {{ .Locality }} + {{ end -}} ports: {{ range $i, $p := .Ports -}} {{$p.Name}}: {{$p.ServicePort}} @@ -71,11 +74,12 @@ func init() { } type serviceConfig struct { - ns namespace.Instance - ports []echo.Port - service string - domain string - version string + ns namespace.Instance + ports []echo.Port + service string + domain string + version string + locality string } func (c serviceConfig) applyTo(g galley.Instance) (*galley.SnapshotObject, error) { @@ -88,6 +92,7 @@ func (c serviceConfig) applyTo(g galley.Instance) (*galley.SnapshotObject, error "Namespace": c.ns.Name(), "Domain": c.domain, "Ports": c.ports, + "Locality": c.locality, }); err != nil { return nil, err } diff --git a/pkg/test/framework/components/echo/native/workload.go b/pkg/test/framework/components/echo/native/workload.go index c5c71145422c..c9f6f98674bc 100644 --- a/pkg/test/framework/components/echo/native/workload.go +++ b/pkg/test/framework/components/echo/native/workload.go @@ -116,11 +116,12 @@ func newWorkload(ctx resource.Context, cfg *echo.Config) (w *workload, err error // Apply the service config to Galley. svcCfg := serviceConfig{ - service: cfg.Service, - ns: cfg.Namespace, - domain: env.Domain, - version: cfg.Version, - ports: w.sidecar.GetPorts(), + service: cfg.Service, + ns: cfg.Namespace, + domain: env.Domain, + version: cfg.Version, + ports: w.sidecar.GetPorts(), + locality: cfg.Locality, } if _, err = svcCfg.applyTo(cfg.Galley); err != nil { return nil, err From 2d064fff351a2b874839a1b7d9ce15b6d3ec15cb Mon Sep 17 00:00:00 2001 From: nmittler Date: Mon, 22 Apr 2019 11:00:50 -0700 Subject: [PATCH 3/3] various fixes --- pkg/test/deployment/helm.go | 2 +- .../framework/components/echo/common/call.go | 31 ++++-- .../components/echo/kube/instance.go | 15 ++- .../framework/components/echo/kube/sidecar.go | 14 +-- .../components/echo/native/appfilter.go | 99 ------------------- .../components/echo/native/discoveryfilter.go | 11 ++- .../components/echo/native/instance.go | 21 ++-- .../components/echo/native/workload.go | 34 ++++--- pkg/test/helm/helm.go | 4 +- pkg/test/kube/kubectl.go | 12 ++- pkg/test/shell/shell.go | 22 ++++- 11 files changed, 113 insertions(+), 152 deletions(-) delete mode 100644 pkg/test/framework/components/echo/native/appfilter.go diff --git a/pkg/test/deployment/helm.go b/pkg/test/deployment/helm.go index dfe4e777473f..0ef6ce41ac0b 100644 --- a/pkg/test/deployment/helm.go +++ b/pkg/test/deployment/helm.go @@ -162,7 +162,7 @@ func HelmTemplate(deploymentName, namespace, chartDir, workDir, valuesFile strin func exec(cmd string) (string, error) { scopes.CI.Infof("executing: %s", cmd) - str, err := shell.Execute(cmd) + str, err := shell.Execute(true, cmd) if err != nil { err = errors.Wrapf(err, "error (%s) executing command: %s", str, cmd) scopes.CI.Errorf("%v", err) diff --git a/pkg/test/framework/components/echo/common/call.go b/pkg/test/framework/components/echo/common/call.go index 793b91cc8f02..771db799d012 100644 --- a/pkg/test/framework/components/echo/common/call.go +++ b/pkg/test/framework/components/echo/common/call.go @@ -17,25 +17,42 @@ package common import ( "errors" "fmt" - "istio.io/istio/pilot/pkg/model" - appEcho "istio.io/istio/pkg/test/application/echo" - "istio.io/istio/pkg/test/application/echo/proto" - "istio.io/istio/pkg/test/framework/components/echo" "net" "net/url" "reflect" "strconv" + + "istio.io/istio/pilot/pkg/model" + appEcho "istio.io/istio/pkg/test/application/echo" + "istio.io/istio/pkg/test/application/echo/proto" + "istio.io/istio/pkg/test/framework/components/echo" ) -func CallEcho(client *appEcho.Client, opts echo.CallOptions) (appEcho.ParsedResponses, error) { - if err := fillInCallOptions(&opts); err != nil { +var ( + // IdentityOutboundPortSelector is an OutboundPortSelectorFunc that always returns the original service port. + IdentityOutboundPortSelector OutboundPortSelectorFunc = func(servicePort int) (int, error) { + return servicePort, nil + } +) + +// OutboundPortSelectorFunc is a function that selects the appropriate outbound port for sending +// requests to a target service. +type OutboundPortSelectorFunc func(servicePort int) (int, error) + +func CallEcho(client *appEcho.Client, opts *echo.CallOptions, outboundPortSelector OutboundPortSelectorFunc) (appEcho.ParsedResponses, error) { + if err := fillInCallOptions(opts); err != nil { + return nil, err + } + + port, err := outboundPortSelector(opts.Port.ServicePort) + if err != nil { return nil, err } // Forward a request from 'this' service to the destination service. targetURL := &url.URL{ Scheme: string(opts.Protocol), - Host: net.JoinHostPort(opts.Host, strconv.Itoa(opts.Port.ServicePort)), + Host: net.JoinHostPort(opts.Host, strconv.Itoa(port)), Path: opts.Path, } targetService := opts.Target.Config().Service diff --git a/pkg/test/framework/components/echo/kube/instance.go b/pkg/test/framework/components/echo/kube/instance.go index d40c647cd0b4..9b50e2c88646 100644 --- a/pkg/test/framework/components/echo/kube/instance.go +++ b/pkg/test/framework/components/echo/kube/instance.go @@ -18,6 +18,7 @@ import ( "errors" "fmt" "io" + "strings" "sync" "testing" @@ -186,7 +187,7 @@ func (c *instance) WaitUntilReady(outboundInstances ...echo.Instance) error { } func (c *instance) WaitUntilReadyOrFail(t testing.TB, outboundInstances ...echo.Instance) { - if err := c.WaitUntilReady(); err != nil { + if err := c.WaitUntilReady(outboundInstances...); err != nil { t.Fatal(err) } } @@ -241,7 +242,17 @@ func (c *instance) Call(opts echo.CallOptions) (appEcho.ParsedResponses, error) return nil, err } - return common.CallEcho(c.workloads[0].Client, opts) + out, err := common.CallEcho(c.workloads[0].Client, &opts, common.IdentityOutboundPortSelector) + if err != nil { + return nil, fmt.Errorf("failed calling %s->'%s://%s:%d/%s': %v", + c.Config().Service, + strings.ToLower(string(opts.Port.Protocol)), + opts.Target.Config().Service, + opts.Port.ServicePort, + opts.Path, + err) + } + return out, nil } func (c *instance) CallOrFail(t testing.TB, opts echo.CallOptions) appEcho.ParsedResponses { diff --git a/pkg/test/framework/components/echo/kube/sidecar.go b/pkg/test/framework/components/echo/kube/sidecar.go index f7eed7530071..e2559551c8ac 100644 --- a/pkg/test/framework/components/echo/kube/sidecar.go +++ b/pkg/test/framework/components/echo/kube/sidecar.go @@ -72,16 +72,8 @@ func (s *sidecar) adminRequest(path string, out proto.Message) error { s.podNamespace, s.podName, err, command, response) } - // Scan forward to the start of the JSON document. - startIndex := strings.IndexByte(response, '{') - if startIndex < 0 { - return fmt.Errorf("unable to locate start of Envoy config_dump. Response:\n%s", response) + if err := jsonpb.Unmarshal(strings.NewReader(response), out); err != nil { + return fmt.Errorf("failed parsing Envoy admin response from '/%s': %v\nResponse JSON: %s", path, err, response) } - endIndex := strings.LastIndexByte(response, '}') - if endIndex < 0 { - return fmt.Errorf("unable to locate end of Envoy config_dump. Response:\n%s", response) - } - response = response[startIndex : endIndex+1] - - return jsonpb.Unmarshal(strings.NewReader(response), out) + return nil } diff --git a/pkg/test/framework/components/echo/native/appfilter.go b/pkg/test/framework/components/echo/native/appfilter.go deleted file mode 100644 index cc9682efc873..000000000000 --- a/pkg/test/framework/components/echo/native/appfilter.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2019 Istio Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package native - -import ( - "context" - "net" - "net/http" - netUrl "net/url" - "strconv" - - "github.com/gorilla/websocket" - - "google.golang.org/grpc" - - "istio.io/istio/pkg/test/application" - "istio.io/istio/pkg/test/application/echo" -) - -// newAppFilter creates a wrapper around the echo application that modifies ports on -// outbound requests in order to route them through Envoy. -func newAppFilter(filter discoveryFilter, factory *echo.Factory) (application.Application, error) { - a := &appFilterImpl{ - filter: filter, - } - - dialer := application.Dialer{ - GRPC: a.dialGRPC, - Websocket: a.dialWebsocket, - HTTP: a.doHTTP, - } - - var err error - a.Application, err = factory.NewApplication(dialer) - if err != nil { - return nil, err - } - return a, nil -} - -type appFilterImpl struct { - application.Application - filter discoveryFilter -} - -// function for establishing GRPC connections from the application. -func (a *appFilterImpl) dialGRPC(ctx context.Context, address string, opts ...grpc.DialOption) (*grpc.ClientConn, error) { - // Modify the outbound URL being created by the application - address = a.modifyClientURLString(address) - return grpc.DialContext(ctx, address, opts...) -} - -// function for establishing Websocket connections from the application. -func (a *appFilterImpl) dialWebsocket(dialer *websocket.Dialer, urlStr string, requestHeader http.Header) (*websocket.Conn, *http.Response, error) { - // Modify the outbound URL being created by the application - urlStr = a.modifyClientURLString(urlStr) - return dialer.Dial(urlStr, requestHeader) -} - -// function for making outbound HTTP requests from the application. -func (a *appFilterImpl) doHTTP(client *http.Client, req *http.Request) (*http.Response, error) { - a.modifyClientURL(req.URL) - return client.Do(req) -} - -func (a *appFilterImpl) modifyClientURLString(url string) string { - parsedURL, err := netUrl.Parse(url) - if err != nil { - // Failed to parse the URL, just use the original. - return url - } - a.modifyClientURL(parsedURL) - return parsedURL.String() -} - -func (a *appFilterImpl) modifyClientURL(url *netUrl.URL) { - port, err := strconv.Atoi(url.Port()) - if err != nil { - // No port was specified. Nothing to do. - return - } - - boundPort, ok := a.filter.GetBoundOutboundListenerPort(port) - if ok { - url.Host = net.JoinHostPort(localhost, strconv.Itoa(boundPort)) - } -} diff --git a/pkg/test/framework/components/echo/native/discoveryfilter.go b/pkg/test/framework/components/echo/native/discoveryfilter.go index 3f9c1cecb6ac..294f668ad056 100644 --- a/pkg/test/framework/components/echo/native/discoveryfilter.go +++ b/pkg/test/framework/components/echo/native/discoveryfilter.go @@ -59,11 +59,11 @@ type discoveryFilter interface { // GetBoundOutboundListenerPort returns a port bound to the agent's Envoy listener. Traffic // sent to this port will automatically be sent to the outbound cluster. Pilot assumes that - // outbound traffic will automatically be redirected to Envoy, so it just sends the unbound + // outbound traffic will automatically be redirected to Envoy, so it just sends the // port for the remote service. To make outbound requests go through Envoy, however, the // native agent needs to bind a real outbound port for the listener and all outbound requests // must pass through that port. - GetBoundOutboundListenerPort(portFromPilot int) (int, bool) + GetBoundOutboundListenerPort(portFromPilot int) (int, error) } func newDiscoverFilter(discoveryAddress string, portManager reserveport.PortManager) (f discoveryFilter, err error) { @@ -116,9 +116,12 @@ type discoveryFilterImpl struct { discoveryAddress string } -func (a *discoveryFilterImpl) GetBoundOutboundListenerPort(portFromPilot int) (int, bool) { +func (a *discoveryFilterImpl) GetBoundOutboundListenerPort(portFromPilot int) (int, error) { p, ok := a.boundPortMap[portFromPilot] - return p, ok + if !ok { + return 0, fmt.Errorf("failed to find bound outbound port for servicePort %d", portFromPilot) + } + return p, nil } func (a *discoveryFilterImpl) Stop() { diff --git a/pkg/test/framework/components/echo/native/instance.go b/pkg/test/framework/components/echo/native/instance.go index a3c156cec875..4da2da47aa7c 100644 --- a/pkg/test/framework/components/echo/native/instance.go +++ b/pkg/test/framework/components/echo/native/instance.go @@ -15,7 +15,9 @@ package native import ( + "fmt" "io" + "strings" "testing" "github.com/hashicorp/go-multierror" @@ -77,8 +79,8 @@ func (c *instance) WaitUntilReady(outboundInstances ...echo.Instance) error { return c.workload.sidecar.WaitForConfig(common.OutboundConfigAcceptFunc(outboundInstances...)) } -func (c *instance) WaitUntilReadyOrFail(t testing.TB, outboundInstance ...echo.Instance) { - if err := c.WaitUntilReady(); err != nil { +func (c *instance) WaitUntilReadyOrFail(t testing.TB, outboundInstances ...echo.Instance) { + if err := c.WaitUntilReady(outboundInstances...); err != nil { t.Fatal(err) } } @@ -100,10 +102,17 @@ func (c *instance) WorkloadsOrFail(t testing.TB) []echo.Workload { } func (c *instance) Call(opts echo.CallOptions) (appEcho.ParsedResponses, error) { - // Override the Host. - opts.Host = localhost - - return common.CallEcho(c.workload.Client, opts) + out, err := c.workload.Call(&opts) + if err != nil { + return nil, fmt.Errorf("failed calling %s->'%s://%s:%d/%s': %v", + c.Config().Service, + strings.ToLower(string(opts.Port.Protocol)), + opts.Target.Config().Service, + opts.Port.ServicePort, + opts.Path, + err) + } + return out, nil } func (c *instance) CallOrFail(t testing.TB, opts echo.CallOptions) appEcho.ParsedResponses { diff --git a/pkg/test/framework/components/echo/native/workload.go b/pkg/test/framework/components/echo/native/workload.go index c9f6f98674bc..66a8c8b168f5 100644 --- a/pkg/test/framework/components/echo/native/workload.go +++ b/pkg/test/framework/components/echo/native/workload.go @@ -25,6 +25,7 @@ import ( appEcho "istio.io/istio/pkg/test/application/echo" "istio.io/istio/pkg/test/envoy" "istio.io/istio/pkg/test/framework/components/echo" + "istio.io/istio/pkg/test/framework/components/echo/common" "istio.io/istio/pkg/test/framework/components/environment/native" "istio.io/istio/pkg/test/framework/components/pilot" "istio.io/istio/pkg/test/framework/resource" @@ -68,6 +69,12 @@ func newWorkload(ctx resource.Context, cfg *echo.Config) (w *workload, err error Version: cfg.Version, } + // Create and start the Echo application + w.app, err = appFactory.NewApplication(application.DefaultDialer) + if err != nil { + return nil, err + } + if cfg.Sidecar { // Using a sidecar Envoy proxy. Need to wire up a custom discovery filter and start Envoy... @@ -88,12 +95,6 @@ func newWorkload(ctx resource.Context, cfg *echo.Config) (w *workload, err error return nil, err } - // Create and start the application. - w.app, err = newAppFilter(w.discoveryFilter, appFactory) - if err != nil { - return nil, err - } - // Create a temp directory for the Envoy boostrap YAML file. tmpDir, err := ctx.CreateTmpDirectory("echo_" + cfg.Service) if err != nil { @@ -130,12 +131,7 @@ func newWorkload(ctx resource.Context, cfg *echo.Config) (w *workload, err error // Update the ports in the configuration to reflect the port mapping between Envoy and the Application. cfg.Ports = w.sidecar.GetPorts() } else { - // No sidecar is simple - just create the app... - - w.app, err = appFactory.NewApplication(application.DefaultDialer) - if err != nil { - return nil, err - } + // No sidecar case is simple: just use the application ports directly ... // Update the configuration with the ports assigned by the application. cfg.Ports = cfg.Ports[:0] @@ -179,6 +175,20 @@ func (w *workload) Sidecar() echo.Sidecar { return w.sidecar } +func (w *workload) Call(opts *echo.CallOptions) (appEcho.ParsedResponses, error) { + // Override the Host. + opts.Host = localhost + + portSelector := common.IdentityOutboundPortSelector + if w.discoveryFilter != nil { + // Use the discovery filter as the outbound port selector to force outbound + // requests to go through Envoy. + portSelector = w.discoveryFilter.GetBoundOutboundListenerPort + } + + return common.CallEcho(w.Client, opts, portSelector) +} + func (w *workload) Close() (err error) { if w.Client != nil { err = multierror.Append(err, w.Client.Close()).ErrorOrNil() diff --git a/pkg/test/helm/helm.go b/pkg/test/helm/helm.go index 7351e82f34d4..4f8cdf417707 100644 --- a/pkg/test/helm/helm.go +++ b/pkg/test/helm/helm.go @@ -28,7 +28,7 @@ func Init(homeDir string, clientOnly bool) error { clientSuffix = " --client-only" } - out, err := shell.Execute("helm --home %s init %s", homeDir, clientSuffix) + out, err := shell.Execute(true, "helm --home %s init %s", homeDir, clientSuffix) if err != nil { scopes.Framework.Errorf("helm init: %v, out:%q", err, out) } else { @@ -51,7 +51,7 @@ func Template(homeDir, template, name, namespace string, valuesFile string, valu } p = append(p, "--set", fmt.Sprintf("%s=%s", k, v)) } - out, err := shell.ExecuteArgs(nil, "helm", p[1:]...) + out, err := shell.ExecuteArgs(nil, true, "helm", p[1:]...) if err != nil { scopes.Framework.Errorf("helm template: %v, out:%q", err, out) } diff --git a/pkg/test/kube/kubectl.go b/pkg/test/kube/kubectl.go index df5ad5954b79..1985f2e0cd21 100644 --- a/pkg/test/kube/kubectl.go +++ b/pkg/test/kube/kubectl.go @@ -83,7 +83,7 @@ func (c *kubectl) applyInternal(namespace string, files []string) error { for _, f := range files { command := fmt.Sprintf("kubectl apply %s %s -f %s", c.configArg(), namespaceArg(namespace), f) scopes.CI.Infof("Applying YAML: %s", command) - s, err := shell.Execute(command) + s, err := shell.Execute(true, command) if err != nil { scopes.CI.Infof("(FAILED) Executing kubectl: %s (err: %v): %s", command, err, s) return fmt.Errorf("%v: %s", err, s) @@ -115,7 +115,8 @@ func (c *kubectl) delete(namespace string, filename string) error { func (c *kubectl) deleteInternal(namespace string, files []string) (err error) { for i := len(files) - 1; i >= 0; i-- { scopes.CI.Infof("Deleting YAML file: %s", files[i]) - s, e := shell.Execute("kubectl delete --ignore-not-found %s %s -f %s", c.configArg(), namespaceArg(namespace), files[i]) + s, e := shell.Execute(true, + "kubectl delete --ignore-not-found %s %s -f %s", c.configArg(), namespaceArg(namespace), files[i]) if e != nil { return multierror.Append(err, fmt.Errorf("%v: %s", e, s)) } @@ -128,7 +129,7 @@ func (c *kubectl) logs(namespace string, pod string, container string) (string, cmd := fmt.Sprintf("kubectl logs %s %s %s %s", c.configArg(), namespaceArg(namespace), pod, containerArg(container)) - s, err := shell.Execute(cmd) + s, err := shell.Execute(true, cmd) if err == nil { return s, nil @@ -138,7 +139,10 @@ func (c *kubectl) logs(namespace string, pod string, container string) (string, } func (c *kubectl) exec(namespace, pod, container, command string) (string, error) { - return shell.Execute("kubectl exec %s %s %s %s -- %s ", pod, namespaceArg(namespace), containerArg(container), c.configArg(), command) + // Don't use combined output. The stderr and stdout streams are updated asynchronously and stderr can + // corrupt the JSON output. + return shell.Execute(false, "kubectl exec %s %s %s %s -- %s ", + pod, namespaceArg(namespace), containerArg(container), c.configArg(), command) } func (c *kubectl) configArg() string { diff --git a/pkg/test/shell/shell.go b/pkg/test/shell/shell.go index 91d9972ff2c2..a8fca5f694ec 100644 --- a/pkg/test/shell/shell.go +++ b/pkg/test/shell/shell.go @@ -25,7 +25,7 @@ import ( var scope = log.RegisterScope("shell", "Shell execution scope", 0) // Execute the given command. -func Execute(format string, args ...interface{}) (string, error) { +func Execute(combinedOutput bool, format string, args ...interface{}) (string, error) { s := fmt.Sprintf(format, args...) // TODO: escape handling parts := strings.Split(s, " ") @@ -36,10 +36,15 @@ func Execute(format string, args ...interface{}) (string, error) { p = append(p, parts[i]) } } - return ExecuteArgs(nil, parts[0], p[1:]...) + + var argStrings []string + if len(p) > 0 { + argStrings = p[1:] + } + return ExecuteArgs(nil, combinedOutput, parts[0], argStrings...) } -func ExecuteArgs(env []string, name string, args ...string) (string, error) { +func ExecuteArgs(env []string, combinedOutput bool, name string, args ...string) (string, error) { if scope.DebugEnabled() { cmd := strings.Join(args, " ") cmd = name + " " + cmd @@ -48,7 +53,16 @@ func ExecuteArgs(env []string, name string, args ...string) (string, error) { c := exec.Command(name, args...) c.Env = env - b, err := c.CombinedOutput() + + var b []byte + var err error + if combinedOutput { + // Combine stderr and stdout in b. + b, err = c.CombinedOutput() + } else { + // Just return stdout in b. + b, err = c.Output() + } if err != nil || !c.ProcessState.Success() { scope.Debugf("Command[%s] => (FAILED) %s", name, string(b))