mirror of https://github.com/istio/istio.io.git
656 lines
87 KiB
HTML
656 lines
87 KiB
HTML
<!doctype html><html lang=en itemscope itemtype=https://schema.org/WebPage><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=theme-color content="#466BB0"><meta name=title content="Traffic Management"><meta name=description content="Describes the various Istio features focused on traffic routing and control."><meta name=keywords content="microservices,services,mesh,traffic-management"><meta property="og:title" content="Traffic Management"><meta property="og:type" content="website"><meta property="og:description" content="Describes the various Istio features focused on traffic routing and control."><meta property="og:url" content="/v1.0/docs/concepts/traffic-management/"><meta property="og:image" content="/v1.0/img/istio-logo-blue-background.svg"><meta property="og:image:alt" content="Istio Logo"><meta property="og:image:width" content="112"><meta property="og:image:height" content="150"><meta property="og:site_name" content="Istio"><meta name=twitter:card content="summary"><meta name=twitter:site content="@IstioMesh"><title>Istioldie 1.0 / Traffic Management</title><script async src="https://www.googletagmanager.com/gtag/js?id=UA-98480406-2"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}
|
|
gtag('js',new Date());gtag('config','UA-98480406-2');</script><script>var branchName="release-1.0";var docTitle="Traffic Management";</script><link rel=alternate type=application/rss+xml title="Istio Blog" href=/v1.0/feed.xml><link rel="shortcut icon" href=/v1.0/favicons/favicon.ico><link rel=apple-touch-icon href=/v1.0/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/v1.0/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/v1.0/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/v1.0/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/v1.0/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/v1.0/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/v1.0/favicons/android-96x196.png sizes=96x196><link rel=icon type=image/png href=/v1.0/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/v1.0/favicons/android-192x192.png sizes=192x192><link rel=manifest href=/v1.0/manifest.json><meta name=apple-mobile-web-app-title content="Istio"><meta name=application-name content="Istio"><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Chivo:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic"><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Work Sans:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic"><link rel=stylesheet href=https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css integrity=sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm crossorigin=anonymous><link rel=stylesheet href=https://use.fontawesome.com/releases/v5.0.6/css/all.css><link rel=stylesheet href=/v1.0/css/light_theme_archive.css title=light><link rel="alternate stylesheet" href=/v1.0/css/dark_theme_archive.css title=dark><script src=/v1.0/js/styleSwitcher.min.js></script></head><body class=language-unknown><header><nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark justify-content-between"><a class=navbar-brand href=/v1.0/><span class=logo><svg viewBox="0 0 300 300"><circle cx="150" cy="150" r="150" stroke-width="2" /><polygon points="65,240 225,240 125,270"/><polygon points="65,230 125,220 125,110"/><polygon points="135,220 225,230 135,30"/></svg></span><span class=brand-name>Istioldie 1.0</span></a>
|
|
<button class=navbar-toggler type=button data-toggle=collapse data-target=#navbarCollapse aria-controls=navbarCollapse aria-expanded=false aria-label="Toggle navigation">
|
|
<span class=navbar-toggler-icon></span></button><div class="collapse navbar-collapse justify-content-end" id=navbarCollapse><ul id=navbar-links class="navbar-nav active"><li class=nav-item><a class="nav-link active" title="Learn how to deploy, use, and operate Istio." href=/v1.0/docs/>Docs</a></li><li class=nav-item><a class=nav-link title="Posts about using Istio." href=/v1.0/blog/2019/announcing-1.0.6/>Blog</a></li><li class=nav-item><a class=nav-link title="A bunch of resources to help you deploy, configure and use Istio." href=/v1.0/help/>Help</a></li><li class=nav-item><a class=nav-link title="Get a bit more in-depth info about the Istio project." href=/v1.0/about/>About</a></li><li class="nav-item dropdown" id=gearDropdown style=white-space:nowrap><a title="Options and Settings" href class=nav-link data-toggle=dropdown aria-label=Tools aria-haspopup=true aria-expanded=false><i style=width:1em class="fa fa-lg fa-cog"></i></a><div class="dropdown-menu dropdown-menu-right" aria-labelledby=gearDropdown><a class=dropdown-item id=light-theme-item href onclick="setActiveStyleSheet('light');return false;">Light Theme</a>
|
|
<a class=dropdown-item id=dark-theme-item href onclick="setActiveStyleSheet('dark');return false;">Dark Theme</a><div class=dropdown-divider></div><h6 class=dropdown-header>Other versions of this site</h6><a href=https://istio.io class=dropdown-item>Current Release</a>
|
|
<a href=https://preliminary.istio.io class=dropdown-item>Next Release</a>
|
|
<a href=https://archive.istio.io class=dropdown-item>Older Releases</a></div></li><li class=nav-item><a id=search_show class=nav-link href title="Search istio.io" aria-label=Search><i style=width:1em class="fa fa-lg fa-search"></i></a></li></ul><form name=cse id=search_form class="form-inline mr-sm-2" role=search><input type=hidden name=cx value=013699703217164175118:iwwf17ikgf4>
|
|
<input type=hidden name=ie value=utf-8>
|
|
<input type=hidden name=hl value=en>
|
|
<input type=hidden id=search_page_url value=/v1.0/search.html>
|
|
<input id=search_textbox class=form-control name=q type=text aria-label="Search this site">
|
|
<button id=search_close type=reset aria-label="Cancel Search"><i class="far fa-lg fa-times-circle"></i></button></form></div></nav></header><div class=container-fluid><div class="row row-offcanvas"><div class="col-0 col-md-3 col-xl-2 sidebar-offcanvas"><nav class="sidebar d-print-none"><div class=spacer></div><div class=directory role=tablist><div class=card><div class=card-header role=tab id=header10><a data-toggle=collapse href=#collapse10 title="Learn about the different parts of the Istio system and the abstractions it uses." role=button aria-controls=collapse10><div><img src=/v1.0/img/concepts.svg alt=Icon class=page_icon>
|
|
Concepts</div></a></div><div id=collapse10 class="collapse show" data-parent=#sidebar role=tabpanel aria-labelledby=header10><div class=card-body><ul class=tree><li><a title="Introduces Istio, the problems it solves, its high-level architecture and design goals." href=/v1.0/docs/concepts/what-is-istio/>What is Istio?</a></li><li><span class=current title="Describes the various Istio features focused on traffic routing and control.">Traffic Management</span></li><li><a title="Describes Istio's authorization and authentication functionality." href=/v1.0/docs/concepts/security/>Security</a></li><li><a title="Describes the policy enforcement and telemetry mechanisms." href=/v1.0/docs/concepts/policies-and-telemetry/>Policies and Telemetry</a></li><li><a title="Introduces Performance and Scalability methodology, results and best practices for Istio components." href=/v1.0/docs/concepts/performance-and-scalability/>Performance and Scalability</a></li></ul></div></div></div><div class=card><div class=card-header role=tab id=header20><a data-toggle=collapse href=#collapse20 title="How to deploy Istio in various environments (e.g., Kubernetes, Consul)." role=button aria-controls=collapse20><div><img src=/v1.0/img/setup.svg alt=Icon class=page_icon>
|
|
Setup</div></a></div><div id=collapse20 class=collapse data-parent=#sidebar role=tabpanel aria-labelledby=header20><div class=card-body><ul class=tree><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Instructions for installing the Istio control plane on Kubernetes and adding virtual machines into the mesh." href=/v1.0/docs/setup/kubernetes/>Kubernetes</a></label><ul class="tree collapse"><li><a title="Instructions to download the Istio release." href=/v1.0/docs/setup/kubernetes/download-release/>Downloading the Release</a></li><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="How to prepare various Kubernetes platforms before installing Istio." href=/v1.0/docs/setup/kubernetes/platform-setup/>Platform Setup</a></label><ul class="tree collapse"><li><a title="Instructions to setup an Alibaba Cloud Kubernetes cluster for Istio." href=/v1.0/docs/setup/kubernetes/platform-setup/alicloud/>Alibaba Cloud</a></li><li><a title="Instructions to setup an AWS cluster with Kops cluster for Istio." href=/v1.0/docs/setup/kubernetes/platform-setup/aws/>Amazon Web Services</a></li><li><a title="Instructions to setup an Azure cluster for Istio." href=/v1.0/docs/setup/kubernetes/platform-setup/azure/>Azure</a></li><li><a title="Instructions to setup a Google Kubernetes Engine cluster for Istio." href=/v1.0/docs/setup/kubernetes/platform-setup/gke/>Google Kubernetes Engine</a></li><li><a title="Instructions to setup an IBM Cloud cluster for Istio." href=/v1.0/docs/setup/kubernetes/platform-setup/ibm/>IBM Cloud</a></li><li><a title="Instructions to setup Minikube for use with Istio." href=/v1.0/docs/setup/kubernetes/platform-setup/minikube/>Minikube</a></li><li><a title="Instructions to setup an OpenShift cluster for Istio." href=/v1.0/docs/setup/kubernetes/platform-setup/openshift/>OpenShift</a></li><li><a title="Instructions to setup an OKE cluster for Istio." href=/v1.0/docs/setup/kubernetes/platform-setup/oci/>Oracle Cloud Infrastructure</a></li></ul></li><li><a title="Instructions to setup the Istio service mesh in a Kubernetes cluster." href=/v1.0/docs/setup/kubernetes/quick-start/>Quick Start with Kubernetes</a></li><li><a title="How to quickly setup Istio using Alibaba Cloud Kubernetes Container Service." href=/v1.0/docs/setup/kubernetes/quick-start-alicloud-ack/>Quick Start with Alibaba Cloud Kubernetes Container Service</a></li><li><a title="How to quickly setup Istio using IBM Cloud Public or IBM Cloud Private." href=/v1.0/docs/setup/kubernetes/quick-start-ibm/>Quick Start with IBM Cloud</a></li><li><a title="Install Istio with the included Helm chart." href=/v1.0/docs/setup/kubernetes/helm-install/>Installation with Helm</a></li><li><a title="Instructions for installing the Istio sidecar in application pods automatically using the sidecar injector webhook or manually using istioctl CLI." href=/v1.0/docs/setup/kubernetes/sidecar-injection/>Installing the sidecar</a></li><li><a title="Install minimal Istio using Helm." href=/v1.0/docs/setup/kubernetes/minimal-install/>Minimal Istio Installation</a></li><li><a title="Install Istio with the included Ansible playbook." href=/v1.0/docs/setup/kubernetes/ansible-install/>Installation with Ansible</a></li><li><a title="Instructions for integrating VMs and bare metal hosts into an Istio mesh deployed on Kubernetes." href=/v1.0/docs/setup/kubernetes/mesh-expansion/>Mesh Expansion</a></li><li><a title="Install Istio with multicluster support." href=/v1.0/docs/setup/kubernetes/multicluster-install/>Istio Multicluster</a></li><li><a title="How to quickly setup Istio using Google Kubernetes Engine (GKE)." href=/v1.0/docs/setup/kubernetes/quick-start-gke/>Quick Start with Google Kubernetes Engine</a></li><li><a title="Demonstrates how to upgrade the Istio control plane and data plane independently." href=/v1.0/docs/setup/kubernetes/upgrading-istio/>Upgrading Istio</a></li><li><a title="Describes the requirements for Kubernetes pods and services to run Istio." href=/v1.0/docs/setup/kubernetes/spec-requirements/>Requirements for Pods and Services</a></li></ul></li><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Instructions for installing the Istio control plane in a Consul based environment, with or without Nomad." href=/v1.0/docs/setup/consul/>Nomad & Consul</a></label><ul class="tree collapse"><li><a title="Quick Start instructions to setup the Istio service mesh with Docker Compose." href=/v1.0/docs/setup/consul/quick-start/>Quick Start on Docker</a></li><li><a title="Instructions for installing the Istio control plane in a Consul-based environment, with or without Nomad." href=/v1.0/docs/setup/consul/install/>Installation</a></li></ul></li></ul></div></div></div><div class=card><div class=card-header role=tab id=header33><a data-toggle=collapse href=#collapse33 title="How to do single specific targeted activities with the Istio system." role=button aria-controls=collapse33><div><img src=/v1.0/img/tasks.svg alt=Icon class=page_icon>
|
|
Tasks</div></a></div><div id=collapse33 class=collapse data-parent=#sidebar role=tabpanel aria-labelledby=header33><div class=card-body><ul class=tree><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Tasks that demonstrate Istio's traffic routing features." href=/v1.0/docs/tasks/traffic-management/>Traffic Management</a></label><ul class="tree collapse"><li><a title="This task shows you how to configure dynamic request routing to multiple versions of a microservice." href=/v1.0/docs/tasks/traffic-management/request-routing/>Configuring Request Routing</a></li><li><a title="This task shows you how to inject faults to test the resiliency of your application." href=/v1.0/docs/tasks/traffic-management/fault-injection/>Fault Injection</a></li><li><a title="Shows you how to migrate traffic from an old to new version of a service." href=/v1.0/docs/tasks/traffic-management/traffic-shifting/>Traffic Shifting</a></li><li><a title="This task shows you how to setup request timeouts in Envoy using Istio." href=/v1.0/docs/tasks/traffic-management/request-timeouts/>Setting Request Timeouts</a></li><li><a title="Describes how to configure Istio to expose a service outside of the service mesh." href=/v1.0/docs/tasks/traffic-management/ingress/>Control Ingress Traffic</a></li><li><a title="Describes how to configure Istio to expose a service outside of the service mesh, over TLS, mutual TLS or JWT authentication." href=/v1.0/docs/tasks/traffic-management/secure-ingress/>Securing Gateways with HTTPS</a></li><li><a title="Describes how to configure Istio to route traffic from services in the mesh to external services." href=/v1.0/docs/tasks/traffic-management/egress/>Control Egress Traffic</a></li><li><a title="This task shows you how to configure circuit breaking for connections, requests, and outlier detection." href=/v1.0/docs/tasks/traffic-management/circuit-breaking/>Circuit Breaking</a></li><li><a title="This task demonstrates the traffic mirroring/shadowing capabilities of Istio." href=/v1.0/docs/tasks/traffic-management/mirroring/>Mirroring</a></li><li><a title="Shows how to do health checking for Istio services." href=/v1.0/docs/tasks/traffic-management/app-health-check/>Health Checking of Istio Services</a></li></ul></li><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Demonstrates how to secure the mesh." href=/v1.0/docs/tasks/security/>Security</a></label><ul class="tree collapse"><li><a title="Shows you how to use Istio authentication policy to setup mutual TLS and basic end-user authentication." href=/v1.0/docs/tasks/security/authn-policy/>Authentication Policy</a></li><li><a title="Shows you how to verify and test Istio's automatic mutual TLS authentication." href=/v1.0/docs/tasks/security/mutual-tls/>Mutual TLS Deep-Dive</a></li><li><a title="Shows how to set up role-based access control for services in the mesh." href=/v1.0/docs/tasks/security/role-based-access-control/>Authorization</a></li><li><a title="Shows how operators can configure Citadel with existing root certificate, signing certificate and key." href=/v1.0/docs/tasks/security/plugin-ca-cert/>Plugging in external CA key and certificate</a></li><li><a title="Shows how to enable Citadel health checking with Kubernetes." href=/v1.0/docs/tasks/security/health-check/>Citadel health checking</a></li><li><a title="Shows you how to incrementally migrate your Istio services to mutual TLS." href=/v1.0/docs/tasks/security/mtls-migration/>Mutual TLS Migration</a></li><li><a title="Shows how to enable mutual TLS on HTTPS services." href=/v1.0/docs/tasks/security/https-overlay/>Mutual TLS over HTTPS</a></li></ul></li><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Demonstrates policy enforcement features." href=/v1.0/docs/tasks/policy-enforcement/>Policies</a></label><ul class="tree collapse"><li><a title="This task shows you how to use Istio to dynamically limit the traffic to a service." href=/v1.0/docs/tasks/policy-enforcement/rate-limiting/>Enabling Rate Limits</a></li><li><a title="Shows how to control access to a service using simple denials or white/black listing." href=/v1.0/docs/tasks/policy-enforcement/denial-and-list/>Denials and White/Black Listing</a></li></ul></li><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Demonstrates how to collect telemetry information from the mesh." href=/v1.0/docs/tasks/telemetry/>Telemetry</a></label><ul class="tree collapse"><li><a title="How to configure the proxies to send tracing requests to Zipkin or Jaeger." href=/v1.0/docs/tasks/telemetry/distributed-tracing/>Distributed Tracing</a></li><li><a title="This task shows you how to configure Istio to collect metrics and logs." href=/v1.0/docs/tasks/telemetry/metrics-logs/>Collecting Metrics and Logs</a></li><li><a title="This task shows you how to configure Istio to collect metrics for TCP services." href=/v1.0/docs/tasks/telemetry/tcp-metrics/>Collecting Metrics for TCP services</a></li><li><a title="This task shows you how to query for Istio Metrics using Prometheus." href=/v1.0/docs/tasks/telemetry/querying-metrics/>Querying Metrics from Prometheus</a></li><li><a title="This task shows you how to setup and use the Istio Dashboard to monitor mesh traffic." href=/v1.0/docs/tasks/telemetry/using-istio-dashboard/>Visualizing Metrics with Grafana</a></li><li><a title="This task shows you how to visualize your services within an Istio mesh." href=/v1.0/docs/tasks/telemetry/kiali/>Visualizing Your Mesh</a></li><li><a title="This task shows you how to generate a graph of services within an Istio mesh." href=/v1.0/docs/tasks/telemetry/servicegraph/>Generating a Service Graph</a></li><li><a title="This task shows you how to configure Istio to log to a Fluentd daemon." href=/v1.0/docs/tasks/telemetry/fluentd/>Logging with Fluentd</a></li></ul></li></ul></div></div></div><div class=card><div class=card-header role=tab id=header46><a data-toggle=collapse href=#collapse46 title="A variety of fully working example uses for Istio that you can experiment with." role=button aria-controls=collapse46><div><img src=/v1.0/img/examples.svg alt=Icon class=page_icon>
|
|
Examples</div></a></div><div id=collapse46 class=collapse data-parent=#sidebar role=tabpanel aria-labelledby=header46><div class=card-body><ul class=tree><li><a title="Deploys a sample application composed of four separate microservices used to demonstrate various Istio features." href=/v1.0/docs/examples/bookinfo/>Bookinfo Application</a></li><li><a title="Demonstrates how to use various traffic management capabilities of an Istio service mesh." href=/v1.0/docs/examples/intelligent-routing/>Intelligent Routing</a></li><li><a title="Demonstrates how to obtain uniform metrics, logs, traces across different services using Istio Mixer and Istio sidecar." href=/v1.0/docs/examples/telemetry/>In-Depth Telemetry</a></li><li><a title="Explains how to manually integrate Google Cloud Endpoints services with Istio." href=/v1.0/docs/examples/endpoints/>Install Istio for Google Cloud Endpoints Services</a></li><li><a title="Illustrates how to use Istio to control a Kubernetes cluster and raw VMs as a single mesh." href=/v1.0/docs/examples/integrating-vms/>Integrating Virtual Machines</a></li><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="A variety of fully working examples for egress traffic control in Istio that you can experiment with." href=/v1.0/docs/examples/advanced-egress/>Advanced egress traffic control</a></label><ul class="tree collapse"><li><a title="Describes how to configure Istio to perform TLS origination for traffic to external services." href=/v1.0/docs/examples/advanced-egress/egress-tls-origination/>TLS Origination for Egress Traffic</a></li><li><a title="Describes how to configure Istio to direct traffic to external services through a dedicated gateway." href=/v1.0/docs/examples/advanced-egress/egress-gateway/>Configure an Egress Gateway</a></li></ul></li><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="A variety of fully working multicluster examples for Istio that you can experiment with." href=/v1.0/docs/examples/multicluster/>Enabling multiclusters</a></label><ul class="tree collapse"><li><a title="Example multicluster GKE install of Istio." href=/v1.0/docs/examples/multicluster/gke/>Google Kubernetes Engine</a></li><li><a title="Example multicluster IBM Cloud Private install of Istio." href=/v1.0/docs/examples/multicluster/icp/>IBM Cloud Private</a></li><li><a title="Example multicluster between IBM Cloud Kubernetes Service & IBM Cloud Private." href=/v1.0/docs/examples/multicluster/iks-icp/>IBM Cloud Kubernetes Service & IBM Cloud Private</a></li></ul></li></ul></div></div></div><div class=card><div class=card-header role=tab id=header78><a data-toggle=collapse href=#collapse78 title="Detailed authoritative reference material such as command-line options, configuration options, and API calling parameters." role=button aria-controls=collapse78><div><img src=/v1.0/img/reference.svg alt=Icon class=page_icon>
|
|
Reference</div></a></div><div id=collapse78 class=collapse data-parent=#sidebar role=tabpanel aria-labelledby=header78><div class=card-body><ul class=tree><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Detailed information on configuration options." href=/v1.0/docs/reference/config/>Configuration</a></label><ul class="tree collapse"><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Describes how to configure Istio's authorization features." href=/v1.0/docs/reference/config/authorization/>Authorization</a></label><ul class="tree collapse"><li><a title="Describes the supported constraints and properties." href=/v1.0/docs/reference/config/authorization/constraints-and-properties/>Constraints and Properties</a></li><li><a title="Configuration for Role Based Access Control." href=/v1.0/docs/reference/config/authorization/istio.rbac.v1alpha1/>RBAC</a></li></ul></li><li><a title="Describes the options available when installing Istio using the included Helm chart." href=/v1.0/docs/reference/config/installation-options/>Installation Options</a></li><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Describes how to configure Istio's policy and telemetry features." href=/v1.0/docs/reference/config/policy-and-telemetry/>Policies and Telemetry</a></label><ul class="tree collapse"><li><a title="Describes the base attribute vocabulary used for policy and control." href=/v1.0/docs/reference/config/policy-and-telemetry/attribute-vocabulary/>Attribute Vocabulary</a></li><li><a title="Mixer configuration expression language reference." href=/v1.0/docs/reference/config/policy-and-telemetry/expression-language/>Expression Language</a></li><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Mixer adapters allow Istio to interface to a variety of infrastructure backends for such things as metrics and logs." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/>Adapters</a></label><ul class="tree collapse"><li><a title="Adapter for Apigee's distributed policy checks and analytics." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/apigee/>Apigee</a></li><li><a title="Adapter for circonus.com's monitoring solution." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/circonus/>Circonus</a></li><li><a title="Adapter for cloudwatch metrics." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/cloudwatch/>CloudWatch</a></li><li><a title="Adapter to deliver metrics to a dogstatsd agent for delivery to DataDog." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/datadog/>Datadog</a></li><li><a title="Adapter that always returns a precondition denial." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/denier/>Denier</a></li><li><a title="Adapter that delivers logs to a fluentd daemon." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/fluentd/>Fluentd</a></li><li><a title="Adapter that extracts information from a Kubernetes environment." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/kubernetesenv/>Kubernetes Env</a></li><li><a title="Adapter that performs whitelist or blacklist checks." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/list/>List</a></li><li><a title="Adapter for a simple in-memory quota management system." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/memquota/>Memory quota</a></li><li><a title="Adapter that implements an Open Policy Agent engine." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/opa/>OPA</a></li><li><a title="Adapter that exposes Istio metrics for ingestion by a Prometheus harvester." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/prometheus/>Prometheus</a></li><li><a title="Adapter that exposes Istio's Role-Based Access Control model." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/rbac/>RBAC</a></li><li><a title="Adapter for a Redis-based quota management system." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/redisquota/>Redis Quota</a></li><li><a title="Adapter that delivers logs and metrics to Google Service Control." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/servicecontrol/>Service Control</a></li><li><a title="Adapter that sends Istio metrics to SignalFx." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/signalfx/>SignalFx</a></li><li><a title="Adapter to deliver logs and metrics to Papertrail and AppOptics backends." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/solarwinds/>SolarWinds</a></li><li><a title="Adapter to deliver logs, metrics, and traces to Stackdriver." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/stackdriver/>Stackdriver</a></li><li><a title="Adapter to deliver metrics to a StatsD backend." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/statsd/>StatsD</a></li><li><a title="Adapter for outputting logs and metrics locally." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/stdio/>Stdio</a></li><li><a title="Adapter to deliver metrics to Wavefront by VMware." href=/v1.0/docs/reference/config/policy-and-telemetry/adapters/wavefront/>Wavefront by VMware</a></li></ul></li><li><a title="Default Metrics exported from Istio through Mixer." href=/v1.0/docs/reference/config/policy-and-telemetry/metrics/>Default Metrics</a></li><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Mixer templates are used to send data to individual adapters." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/>Templates</a></label><ul class="tree collapse"><li><a title="The Analytics template is used to dispatch runtime telemetry to Apigee." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/analytics/>Analytics</a></li><li><a title="A template that represents a single API key." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/apikey/>API Key</a></li><li><a title="A template used to represent an access control query." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/authorization/>Authorization</a></li><li><a title="A template that carries no data, useful for testing." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/checknothing/>Check Nothing</a></li><li><a title="A template that is used to control the production of Kubernetes-specific attributes." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/kubernetes/>Kubernetes</a></li><li><a title="A template designed to let you perform list checking operations." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/listentry/>List Entry</a></li><li><a title="A template that represents a single runtime log entry." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/logentry/>Log Entry</a></li><li><a title="A template that represents a single runtime metric." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/metric/>Metric</a></li><li><a title="A template that represents a quota allocation request." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/quota/>Quota</a></li><li><a title="A template that carries no data, useful for testing." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/reportnothing/>Report Nothing</a></li><li><a title="A template used by the Google Service Control adapter." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/servicecontrolreport/>Service Control Report</a></li><li><a title="A template that represents\ an individual span within a distributed trace." href=/v1.0/docs/reference/config/policy-and-telemetry/templates/tracespan/>Trace Span</a></li></ul></li><li><a title="Describes the rules used to configure Mixer's policy and telemetry features." href=/v1.0/docs/reference/config/policy-and-telemetry/istio.policy.v1beta1/>Rules</a></li></ul></li><li><a title="Authentication policy for Istio services." href=/v1.0/docs/reference/config/istio.authentication.v1alpha1/>Authentication Policy</a></li><li><a title="Configuration affecting traffic routing." href=/v1.0/docs/reference/config/istio.networking.v1alpha3/>Traffic Routing</a></li></ul></li><li class=sublist><label class=tree-toggle><i class="fa fa-lg fa-caret-right"></i><a title="Describes usage and options of the Istio commands and utilities." href=/v1.0/docs/reference/commands/>Commands</a></label><ul class="tree collapse"><li><a title="Galley provides configuration management services for Istio." href=/v1.0/docs/reference/commands/galley/>galley</a></li><li><a title="Istio Certificate Authority (CA)." href=/v1.0/docs/reference/commands/istio_ca/>istio_ca</a></li><li><a title="Istio control interface." href=/v1.0/docs/reference/commands/istioctl/>istioctl</a></li><li><a title="Utility to trigger direct calls to Mixer's API." href=/v1.0/docs/reference/commands/mixc/>mixc</a></li><li><a title="Mixer is Istio's abstraction on top of infrastructure backends." href=/v1.0/docs/reference/commands/mixs/>mixs</a></li><li><a title="Istio security per-node agent." href=/v1.0/docs/reference/commands/node_agent/>node_agent</a></li><li><a title="Istio Pilot agent." href=/v1.0/docs/reference/commands/pilot-agent/>pilot-agent</a></li><li><a title="Istio Pilot." href=/v1.0/docs/reference/commands/pilot-discovery/>pilot-discovery</a></li><li><a title="Kubernetes webhook for automatic Istio sidecar injection." href=/v1.0/docs/reference/commands/sidecar-injector/>sidecar-injector</a></li></ul></li></ul></div></div></div></div></nav></div><div class="col-12 col-md-9 col-xl-8"><p class=d-md-none><label class=sidebar-toggler data-toggle=offcanvas><i class="fa fa-sign-out-alt"></i></label></p><main aria-labelledby=title><div class=pagenav><p><a href=/v1.0/docs/concepts/ title="Learn about the different parts of the Istio system and the abstractions it uses."><i style=transform:scaleX(-1) class="fa fa-level-up-alt"></i> Concepts</a></p></div><h1 id=title>Traffic Management</h1><nav class="toc-inlined d-xl-none d-print-none"><hr><div class=directory role=directory><nav id=InlinedTableOfContents><ul><li><a href=#pilot-and-envoy>Pilot and Envoy</a></li><li><a href=#request-routing>Request routing</a></li><ul><li><a href=#communication-between-services>Communication between services</a></li><li><a href=#ingress-and-egress>Ingress and egress</a></li></ul><li><a href=#discovery-and-load-balancing>Discovery and load balancing</a></li><li><a href=#handling-failures>Handling failures</a></li><ul><li><a href=#fine-tuning>Fine tuning</a></li><li><a href=#failure-handling-faq>Failure handling FAQ</a></li></ul><li><a href=#fault-injection>Fault injection</a></li><li><a href=#rule-configuration>Rule configuration</a></li><ul><li><a href=#virtual-services>Virtual Services</a></li><ul><li><a href=#rule-destinations>Rule destinations</a></li><li><a href=#splitting-traffic-between-versions>Splitting traffic between versions</a></li><li><a href=#timeouts-and-retries>Timeouts and retries</a></li><li><a href=#injecting-faults>Injecting faults</a></li><li><a href=#conditional-rules>Conditional rules</a></li><li><a href=#multiple-match-conditions>Multiple match conditions</a></li><li><a href=#precedence>Precedence</a></li></ul><li><a href=#destination-rules>Destination rules</a></li><ul><li><a href=#circuit-breakers>Circuit breakers</a></li><li><a href=#rule-evaluation>Rule evaluation</a></li></ul><li><a href=#service-entries>Service entries</a></li><li><a href=#gateways>Gateways</a></li></ul><li><a href=#see-also>See also</a></li></ul></nav></div><hr></nav><p>This page provides an overview of how traffic management works
|
|
in Istio, including the benefits of its traffic management
|
|
principles. It assumes that you've already read <a href=/v1.0/docs/concepts/what-is-istio/>What is Istio?</a>
|
|
and are familiar with Istio's high-level architecture.</p><p>Using Istio's traffic management model essentially decouples traffic flow
|
|
and infrastructure scaling, letting you specify via Pilot what
|
|
rules they want traffic to follow rather than which specific pods/VMs should
|
|
receive traffic - Pilot and intelligent Envoy proxies look after the
|
|
rest. For example, you can specify via Pilot that you want 5%
|
|
of traffic for a particular service to go to a canary version irrespective
|
|
of the size of the canary deployment, or send traffic to a particular version
|
|
depending on the content of the request.</p><figure style=width:85%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:75%><a class=not-for-endnotes href=/v1.0/docs/concepts/traffic-management/./TrafficManagementOverview.svg><img class=element-to-stretch src=/v1.0/docs/concepts/traffic-management/./TrafficManagementOverview.svg alt="Traffic Management with Istio" title="Traffic Management with Istio"></a></div><figcaption>Traffic Management with Istio</figcaption></figure><p>Decoupling traffic flow from infrastructure scaling allows Istio
|
|
to provide a variety of traffic management features that live outside the
|
|
application code. As well as dynamic <a href=#request-routing>request routing</a>
|
|
for A/B testing, gradual rollouts, and canary releases, it also handles
|
|
<a href=#handling-failures>failure recovery</a> using timeouts, retries,
|
|
circuit breakers, and <a href=#fault-injection>fault injection</a> to
|
|
test the compatibility of failure recovery policies across services. These
|
|
capabilities are all realized through the Envoy sidecars/proxies deployed
|
|
across the service mesh.</p><h2 id=pilot-and-envoy>Pilot and Envoy</h2><p>The core component used for traffic management in Istio is <strong>Pilot</strong>, which
|
|
manages and configures all the Envoy
|
|
proxy instances deployed in a particular Istio service mesh. Pilot lets you
|
|
specify which rules you want to use to route traffic between Envoy proxies
|
|
and configure failure recovery features such as timeouts, retries, and
|
|
circuit breakers. It also maintains a canonical model of all the services
|
|
in the mesh and uses this model to let Envoy instances know about the other Envoy instances in the mesh via its discovery service.</p><p>Each Envoy instance maintains <a href=#discovery-and-load-balancing>load balancing information</a>
|
|
based on the information it gets from Pilot and periodic health-checks
|
|
of other instances in its load-balancing pool, allowing it to intelligently
|
|
distribute traffic between destination instances while following its specified
|
|
routing rules.</p><p>Pilot is responsible for the lifecycle of Envoy instances deployed
|
|
across the Istio service mesh.</p><figure style=width:60%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:70%><a class=not-for-endnotes href=/v1.0/docs/concepts/traffic-management/./PilotAdapters.svg><img class=element-to-stretch src=/v1.0/docs/concepts/traffic-management/./PilotAdapters.svg alt="Pilot Architecture" title="Pilot Architecture"></a></div><figcaption>Pilot Architecture</figcaption></figure><p>As shown in the figure above, Pilot maintains a canonical
|
|
representation of services in the mesh that is independent of the underlying
|
|
platform. Platform-specific adapters in Pilot are responsible for
|
|
populating this canonical model appropriately. For example, the Kubernetes
|
|
adapter in Pilot implements the necessary controllers to watch the
|
|
Kubernetes API server for changes to the pod registration information, ingress
|
|
resources, and third-party resources that store traffic management rules.
|
|
This data is translated into the canonical representation. An Envoy-specific configuration is then generated based on the canonical representation.</p><p>Pilot enables <a href=https://www.envoyproxy.io/docs/envoy/latest/api-v1/cluster_manager/sds>service discovery</a>,
|
|
dynamic updates to <a href=https://www.envoyproxy.io/docs/envoy/latest/configuration/cluster_manager/cds>load balancing pools</a>
|
|
and <a href=https://www.envoyproxy.io/docs/envoy/latest/configuration/http_conn_man/rds>routing tables</a>.</p><p>You can specify high-level traffic management rules through
|
|
<a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/>Pilot's Rule configuration</a>. These rules are translated into low-level
|
|
configurations and distributed to Envoy instances.</p><h2 id=request-routing>Request routing</h2><p>As described above, the canonical representation
|
|
of services in a mesh is maintained by Pilot. The Istio
|
|
model of a service is independent of how it is represented in the underlying
|
|
platform (Kubernetes, Mesos, Cloud Foundry,
|
|
etc.). Platform-specific adapters are responsible for populating the
|
|
internal model representation with various fields from the metadata found
|
|
in the platform.</p><p>Istio introduces the concept of a <em>service version</em>, which is a finer-grained
|
|
way to subdivide service instances by versions (<code>v1</code>, <code>v2</code>) or environment
|
|
(<code>staging</code>, <code>prod</code>). These variants are not necessarily different API
|
|
versions: they could be iterative changes to the same service, deployed in
|
|
different environments (prod, staging, dev, etc.). Common scenarios where
|
|
this is used include A/B testing or canary rollouts. Istio's <a href=#rule-configuration>traffic
|
|
routing rules</a> can refer to service versions to provide
|
|
additional control over traffic between services.</p><h3 id=communication-between-services>Communication between services</h3><figure style=width:60%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:100%><a class=not-for-endnotes href=/v1.0/docs/concepts/traffic-management/./ServiceModel_Versions.svg><img class=element-to-stretch src=/v1.0/docs/concepts/traffic-management/./ServiceModel_Versions.svg alt="Showing how service versions are handled." title="Service Versions"></a></div><figcaption>Service Versions</figcaption></figure><p>As shown in the figure above, clients of a service have no knowledge
|
|
of different versions of the service. They can continue to access the
|
|
services using the hostname/IP address of the service. The Envoy sidecar/proxy
|
|
intercepts and forwards all requests/responses between the client and the
|
|
service.</p><p>Envoy determines its actual choice of service version dynamically
|
|
based on the routing rules that you specify by using Pilot. This
|
|
model enables the application code to decouple itself from the evolution of its dependent
|
|
services, while providing other benefits as well (see
|
|
<a href=/v1.0/docs/concepts/policies-and-telemetry/>Mixer</a>). Routing
|
|
rules allow Envoy to select a version based
|
|
on conditions such as headers, tags associated with
|
|
source/destination, and/or by weights assigned to each version.</p><p>Istio also provides load balancing for traffic to multiple instances of
|
|
the same service version. See <a href=/v1.0/docs/concepts/traffic-management/#discovery-and-load-balancing>Discovery
|
|
and Load Balancing</a> for more.</p><p>Istio does not provide a DNS. Applications can try to resolve the
|
|
FQDN using the DNS service present in the underlying platform (<code>kube-dns</code>,
|
|
<code>mesos-dns</code>, etc.).</p><h3 id=ingress-and-egress>Ingress and egress</h3><p>Istio assumes that all traffic entering and leaving the service mesh
|
|
transits through Envoy proxies. By deploying an Envoy proxy in front of
|
|
services, you can conduct A/B testing, deploy canary services,
|
|
etc. for user-facing services. Similarly, by routing traffic to external
|
|
web services (for instance, accessing a maps API or a video service API)
|
|
via the Envoy sidecar, you can add failure recovery features such as
|
|
timeouts, retries, and circuit breakers and obtain detailed metrics on
|
|
the connections to these services.</p><figure style=width:85%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:35.51%><a class=not-for-endnotes href=/v1.0/docs/concepts/traffic-management/./ServiceModel_RequestFlow.svg><img class=element-to-stretch src=/v1.0/docs/concepts/traffic-management/./ServiceModel_RequestFlow.svg alt="Ingress and Egress through Envoy." title="Request Flow"></a></div><figcaption>Request Flow</figcaption></figure><h2 id=discovery-and-load-balancing>Discovery and load balancing</h2><p>Istio load balances traffic across instances of a service in a service mesh.</p><p>Istio assumes the presence of a service registry
|
|
to keep track of the pods/VMs of a service in the application. It also
|
|
assumes that new instances of a service are automatically registered with
|
|
the service registry and unhealthy instances are automatically removed.
|
|
Platforms such as Kubernetes and Mesos already provide such functionality for
|
|
container-based applications, and many solutions exist for VM-based
|
|
applications.</p><p>Pilot consumes information from the service
|
|
registry and provides a platform-independent service discovery
|
|
interface. Envoy instances in the mesh perform service discovery and
|
|
dynamically update their load balancing pools accordingly.</p><figure style=width:55%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:80%><a class=not-for-endnotes href=/v1.0/docs/concepts/traffic-management/./LoadBalancing.svg><img class=element-to-stretch src=/v1.0/docs/concepts/traffic-management/./LoadBalancing.svg alt="Discovery and Load Balancing" title="Discovery and Load Balancing"></a></div><figcaption>Discovery and Load Balancing</figcaption></figure><p>As shown in the figure above, services in the mesh access each other
|
|
using their DNS names. All HTTP traffic bound to a service is automatically
|
|
re-routed through Envoy. Envoy distributes the traffic across instances in
|
|
the load balancing pool. While Envoy supports several
|
|
<a href=https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/load_balancing>sophisticated load balancing algorithms</a>,
|
|
Istio currently allows three load balancing modes:
|
|
round robin, random, and weighted least request.</p><p>In addition to load balancing, Envoy periodically checks the health of each
|
|
instance in the pool. Envoy follows a circuit breaker pattern to
|
|
classify instances as unhealthy or healthy based on their failure rates for
|
|
the health check API call. In other words, when the number of health
|
|
check failures for a given instance exceeds a pre-specified threshold, it
|
|
will be ejected from the load balancing pool. Similarly, when the number of
|
|
health checks that pass exceed a pre-specified threshold, the instance will
|
|
be added back into the load balancing pool. You can find out more about Envoy's
|
|
failure-handling features in <a href=#handling-failures>Handling Failures</a>.</p><p>Services can actively shed load by responding with an HTTP 503 to a health
|
|
check. In such an event, the service instance will be immediately removed
|
|
from the caller's load balancing pool.</p><h2 id=handling-failures>Handling failures</h2><p>Envoy provides a set of out-of-the-box <em>opt-in</em> failure recovery features
|
|
that can be taken advantage of by the services in an application. Features
|
|
include:</p><ol><li><p>Timeouts</p></li><li><p>Bounded retries with timeout budgets and variable jitter between retries</p></li><li><p>Limits on number of concurrent connections and requests to upstream services</p></li><li><p>Active (periodic) health checks on each member of the load balancing pool</p></li><li><p>Fine-grained circuit breakers (passive health checks) – applied per
|
|
instance in the load balancing pool</p></li></ol><p>These features can be dynamically configured at runtime through
|
|
<a href=#rule-configuration>Istio's traffic management rules</a>.</p><p>The jitter between retries minimizes the impact of retries on an overloaded
|
|
upstream service, while timeout budgets ensure that the calling service
|
|
gets a response (success/failure) within a predictable time frame.</p><p>A combination of active and passive health checks (4 and 5 above)
|
|
minimize the chances of accessing an unhealthy instance in the load
|
|
balancing pool. When combined with platform-level health checks (such as
|
|
those supported by Kubernetes or Mesos), applications can ensure that
|
|
unhealthy pods/containers/VMs can be quickly ejected from the service
|
|
mesh, minimizing the request failures and impact on latency.</p><p>Together, these features enable the service mesh to tolerate failing nodes
|
|
and prevent localized failures from cascading instability to other nodes.</p><h3 id=fine-tuning>Fine tuning</h3><p>Istio's traffic management rules allow you to set defaults for failure recovery per
|
|
service and version that apply to all callers. However, consumers of a service can also
|
|
override <a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/#HTTPRoute-timeout>timeout</a>
|
|
and <a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/#HTTPRoute-retries>retry</a>
|
|
defaults by providing request-level overrides through special HTTP headers.
|
|
With the Envoy proxy implementation, the headers are <code>x-envoy-upstream-rq-timeout-ms</code> and
|
|
<code>x-envoy-max-retries</code>, respectively.</p><h3 id=failure-handling-faq>Failure handling FAQ</h3><p>Q: <em>Do applications still handle failures when running in Istio?</em></p><p>Yes. Istio improves the reliability and availability of services in the
|
|
mesh. However, <strong>applications need to handle the failure (errors)
|
|
and take appropriate fallback actions</strong>. For example, when all instances in
|
|
a load balancing pool have failed, Envoy will return HTTP 503. It is the
|
|
responsibility of the application to implement any fallback logic that is
|
|
needed to handle the HTTP 503 error code from an upstream service.</p><p>Q: <em>Will Envoy's failure recovery features break applications that already
|
|
use fault tolerance libraries (for example <a href=https://github.com/Netflix/Hystrix>Hystrix</a>)?</em></p><p>No. Envoy is completely transparent to the application. A failure response
|
|
returned by Envoy would not be distinguishable from a failure response
|
|
returned by the upstream service to which the call was made.</p><p>Q: <em>How will failures be handled when using application-level libraries and
|
|
Envoy at the same time?</em></p><p>Given two failure recovery policies for the same destination service, <strong>the
|
|
more restrictive of the two will be triggered when failures occur</strong>. For example, you have two timeouts – one set in Envoy and another in an application's library. In this
|
|
example, if the application sets a 5 second timeout for an API call to a
|
|
service, while you configured a 10 second timeout in Envoy, the
|
|
application's timeout will kick in first. Similarly, if Envoy's circuit
|
|
breaker triggers before the application's circuit breaker, API calls to the
|
|
service will get a 503 from Envoy.</p><h2 id=fault-injection>Fault injection</h2><p>While the Envoy sidecar/proxy provides a host of
|
|
<a href=#handling-failures>failure recovery mechanisms</a> to services running
|
|
on Istio, it is still
|
|
imperative to test the end-to-end failure recovery capability of the
|
|
application as a whole. Misconfigured failure recovery policies (for example,
|
|
incompatible/restrictive timeouts across service calls) could result in
|
|
continued unavailability of critical services in the application, resulting
|
|
in poor user experience.</p><p>Istio enables protocol-specific fault injection into the network, instead
|
|
of killing pods or delaying or corrupting packets at the TCP layer. The rationale
|
|
is that the failures observed by the application layer are the same
|
|
regardless of network level failures, and that more meaningful failures can
|
|
be injected at the application layer (for example, HTTP error codes) to exercise the resilience of an application.</p><p>You can configure faults to be injected into requests that match
|
|
specific conditions. You can further restrict the percentage of
|
|
requests that should be subjected to faults. Two types of faults can be
|
|
injected: delays and aborts. Delays are timing failures, mimicking
|
|
increased network latency, or an overloaded upstream service. Aborts are
|
|
crash failures that mimic failures in upstream services. Aborts usually
|
|
manifest in the form of HTTP error codes or TCP connection failures.</p><h2 id=rule-configuration>Rule configuration</h2><p>Istio provides a simple configuration model to
|
|
control how API calls and layer-4 traffic flow across various
|
|
services in an application deployment. The configuration model allows you to
|
|
configure service-level properties such as circuit breakers, timeouts,
|
|
and retries, as well as set up common continuous deployment tasks such as
|
|
canary rollouts, A/B testing, staged rollouts with %-based traffic splits,
|
|
etc.</p><p>There are four traffic management configuration resources in Istio:
|
|
<code>VirtualService</code>, <code>DestinationRule</code>, <code>ServiceEntry</code>, and <code>Gateway</code>:</p><ul><li><p>A <a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/#VirtualService><code>VirtualService</code></a>
|
|
defines the rules that control how requests for a service are routed within an Istio service mesh.</p></li><li><p>A <a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/#DestinationRule><code>DestinationRule</code></a>
|
|
configures the set of policies to be applied to a request after <code>VirtualService</code> routing has occurred.</p></li><li><p>A <a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/#ServiceEntry><code>ServiceEntry</code></a> is commonly used to enable requests to services outside of an Istio service mesh.</p></li><li><p>A <a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/#Gateway><code>Gateway</code></a>
|
|
configures a load balancer for HTTP/TCP traffic, most commonly operating at the edge of the mesh to enable ingress traffic for an application.</p></li></ul><p>For example, you can implement a simple rule to send 100% of incoming traffic for a <em>reviews</em> service to version “v1” by using a <code>VirtualService</code> configuration as follows:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: reviews
|
|
spec:
|
|
hosts:
|
|
- reviews
|
|
http:
|
|
- route:
|
|
- destination:
|
|
host: reviews
|
|
subset: v1</code></pre><p>This configuration says that traffic sent to the <em>reviews</em> service
|
|
(specified in the <code>hosts</code> field) should be routed to the v1 subset
|
|
of the underlying <em>reviews</em> service instances. The route <code>subset</code> specifies the name of a defined subset in a corresponding destination rule configuration.</p><p>A subset specifies one or more labels that identify version-specific instances.
|
|
For example, in a Kubernetes deployment of Istio, “version: v1” indicates that
|
|
only pods containing the label “version: v1” will receive traffic.</p><p>In a <code>DestinationRule</code>, you can then add additional policies. For example, the following definition specifies to use the random load balancing mode:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: DestinationRule
|
|
metadata:
|
|
name: reviews
|
|
spec:
|
|
host: reviews
|
|
trafficPolicy:
|
|
loadBalancer:
|
|
simple: RANDOM
|
|
subsets:
|
|
- name: v1
|
|
labels:
|
|
version: v1
|
|
- name: v2
|
|
labels:
|
|
version: v2</code></pre><p>Rules can be configured using the <code>kubectl</code> command. See the
|
|
<a href=/v1.0/docs/tasks/traffic-management/request-routing/>configuring request routing
|
|
task</a> for examples.</p><p>The following sections provide a basic overview of the traffic management configuration resources.
|
|
See <a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/>networking reference</a>
|
|
for detailed information.</p><h3 id=virtual-services>Virtual Services</h3><p>A <a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/#VirtualService><code>VirtualService</code></a>
|
|
defines the rules that control how requests for a service are routed within an Istio service mesh.
|
|
For example, a virtual service could route requests to different versions of a service or to a completely different service than was requested.
|
|
Requests can be routed based on the request source and destination, HTTP paths and
|
|
header fields, and weights associated with individual service versions.</p><h4 id=rule-destinations>Rule destinations</h4><p>Routing rules correspond to one or more request destination hosts that are specified in
|
|
a <code>VirtualService</code> configuration. These hosts may or may not be the same as the actual
|
|
destination workload and may not even correspond to an actual routable service in the mesh.
|
|
For example, to define routing rules for requests to the <em>reviews</em> service using its internal
|
|
mesh name <code>reviews</code> or via host <code>bookinfo.com</code>, a <code>VirtualService</code> could set the <code>hosts</code> field as:</p><pre><code class=language-yaml>hosts:
|
|
- reviews
|
|
- bookinfo.com</code></pre><p>The <code>hosts</code> field specifies, implicitly or explicitly, one or more fully qualified
|
|
domain names (FQDN). The short name <code>reviews</code>, above, would implicitly
|
|
expand to an implementation specific FQDN. For example, in a Kubernetes environment
|
|
the full name is derived from the cluster and namespace of the <code>VirtualSevice</code>
|
|
(for example, <code>reviews.default.svc.cluster.local</code>).</p><h4 id=splitting-traffic-between-versions>Splitting traffic between versions</h4><p>Each route rule identifies one or more weighted backends to call when the rule is activated.
|
|
Each backend corresponds to a specific version of the destination service,
|
|
where versions can be expressed using <em>labels</em>.
|
|
If there are multiple registered instances with the specified label(s),
|
|
they will be routed to based on the load balancing policy configured for the service,
|
|
or round-robin by default.</p><p>For example, the following rule will route 25% of traffic for the <em>reviews</em> service to instances with
|
|
the “v2” label and the remaining 75% of traffic to “v1”:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: reviews
|
|
spec:
|
|
hosts:
|
|
- reviews
|
|
http:
|
|
- route:
|
|
- destination:
|
|
host: reviews
|
|
subset: v1
|
|
weight: 75
|
|
- destination:
|
|
host: reviews
|
|
subset: v2
|
|
weight: 25</code></pre><h4 id=timeouts-and-retries>Timeouts and retries</h4><p>By default, the timeout for HTTP requests is 15 seconds,
|
|
but it can be overridden in a route rule as follows:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: ratings
|
|
spec:
|
|
hosts:
|
|
- ratings
|
|
http:
|
|
- route:
|
|
- destination:
|
|
host: ratings
|
|
subset: v1
|
|
timeout: 10s</code></pre><p>You can also specify the number of retry attempts for an HTTP request in a route rule.
|
|
The maximum number of retry attempts, or the number of attempts possible within the default or overridden timeout period, can be set as follows:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: ratings
|
|
spec:
|
|
hosts:
|
|
- ratings
|
|
http:
|
|
- route:
|
|
- destination:
|
|
host: ratings
|
|
subset: v1
|
|
retries:
|
|
attempts: 3
|
|
perTryTimeout: 2s</code></pre><p>Note that request timeouts and retries can also be
|
|
<a href=#fine-tuning>overridden on a per-request basis</a>.</p><p>See the <a href=/v1.0/docs/tasks/traffic-management/request-timeouts>request timeouts task</a> for an example of timeout control.</p><h4 id=injecting-faults>Injecting faults</h4><p>A route rule can specify one or more faults to inject
|
|
while forwarding HTTP requests to the rule's corresponding request destination.
|
|
The faults can be either delays or aborts.</p><p>The following example introduces a 5 second delay in 10% of the requests to the “v1” version of the <em>ratings</em> microservice:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: ratings
|
|
spec:
|
|
hosts:
|
|
- ratings
|
|
http:
|
|
- fault:
|
|
delay:
|
|
percent: 10
|
|
fixedDelay: 5s
|
|
route:
|
|
- destination:
|
|
host: ratings
|
|
subset: v1</code></pre><p>You can use the other kind of fault, an abort, to prematurely terminate a request. For example, to simulate a failure.</p><p>The following example returns an HTTP 400 error code for 10%
|
|
of the requests to the <em>ratings</em> service “v1”:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: ratings
|
|
spec:
|
|
hosts:
|
|
- ratings
|
|
http:
|
|
- fault:
|
|
abort:
|
|
percent: 10
|
|
httpStatus: 400
|
|
route:
|
|
- destination:
|
|
host: ratings
|
|
subset: v1</code></pre><p>Sometimes delay and abort faults are used together. For example, the following rule delays by 5 seconds all requests from the <em>reviews</em> service “v2” to the <em>ratings</em> service “v1” and then aborts 10% of them:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: ratings
|
|
spec:
|
|
hosts:
|
|
- ratings
|
|
http:
|
|
- match:
|
|
- sourceLabels:
|
|
app: reviews
|
|
version: v2
|
|
fault:
|
|
delay:
|
|
fixedDelay: 5s
|
|
abort:
|
|
percent: 10
|
|
httpStatus: 400
|
|
route:
|
|
- destination:
|
|
host: ratings
|
|
subset: v1</code></pre><p>To see fault injection in action, see the <a href=/v1.0/docs/tasks/traffic-management/fault-injection/>fault injection task</a>.</p><h4 id=conditional-rules>Conditional rules</h4><p>Rules can optionally be qualified to only apply to requests that match some
|
|
specific condition such as the following:</p><p><em>1. Restrict to specific client workloads using workload labels</em>. For example, a rule
|
|
can indicate that it only applies to calls from workloads (pods) implementing
|
|
the <em>reviews</em> service:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: ratings
|
|
spec:
|
|
hosts:
|
|
- ratings
|
|
http:
|
|
- match:
|
|
sourceLabels:
|
|
app: reviews
|
|
...</code></pre><p>The value of <code>sourceLabels</code> depends on the implementation of the service.
|
|
In Kubernetes, for example, it would probably be the same labels that are used
|
|
in the pod selector of the corresponding Kubernetes service.</p><p>The above example can also be further refined to only apply to calls from version “v2”
|
|
of the <em>reviews</em> service:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: ratings
|
|
spec:
|
|
hosts:
|
|
- ratings
|
|
http:
|
|
- match:
|
|
- sourceLabels:
|
|
app: reviews
|
|
version: v2
|
|
...</code></pre><p><em>2. Select rule based on HTTP headers</em>. For example, the following rule only applies to an incoming request if it includes a custom “end-user” header that
|
|
contains the string “jason”:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: reviews
|
|
spec:
|
|
hosts:
|
|
- reviews
|
|
http:
|
|
- match:
|
|
- headers:
|
|
end-user:
|
|
exact: jason
|
|
...</code></pre><p>If more than one header is specified in the rule, then all of the
|
|
corresponding headers must match for the rule to apply.</p><p><em>3. Select rule based on request URI</em>. For example, the following rule only applies to a request if the URI path starts with <code>/api/v1</code>:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: productpage
|
|
spec:
|
|
hosts:
|
|
- productpage
|
|
http:
|
|
- match:
|
|
- uri:
|
|
prefix: /api/v1
|
|
...</code></pre><h4 id=multiple-match-conditions>Multiple match conditions</h4><p>Multiple match conditions can be set simultaneously. In such a case, AND or OR
|
|
semantics apply, depending on the nesting.</p><p>If multiple conditions are nested in a single match clause, then the conditions
|
|
are ANDed. For example, the following rule only applies if the
|
|
client workload is “reviews:v2” AND the custom “end-user” header containing
|
|
“jason” is present in the request:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: ratings
|
|
spec:
|
|
hosts:
|
|
- ratings
|
|
http:
|
|
- match:
|
|
- sourceLabels:
|
|
app: reviews
|
|
version: v2
|
|
headers:
|
|
end-user:
|
|
exact: jason
|
|
...</code></pre><p>If instead, the condition appear in separate match clauses, then only one
|
|
of the conditions applies (OR semantics):</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: ratings
|
|
spec:
|
|
hosts:
|
|
- ratings
|
|
http:
|
|
- match:
|
|
- sourceLabels:
|
|
app: reviews
|
|
version: v2
|
|
- headers:
|
|
end-user:
|
|
exact: jason
|
|
...</code></pre><p>This rule applies if either the client workload is “reviews:v2” OR
|
|
the custom “end-user” header containing “jason” is present in the request.</p><h4 id=precedence>Precedence</h4><p>When there are multiple rules for a given destination,
|
|
they are evaluated in the order they appear
|
|
in the <code>VirtualService</code>, meaning the first rule
|
|
in the list has the highest priority.</p><p><strong>Why is priority important?</strong> Whenever the routing story for a particular
|
|
service is purely weight based, it can be specified in a single rule.
|
|
On the other hand, when other conditions
|
|
(such as requests from a specific user) are being used to route traffic, more
|
|
than one rule will be needed to specify the routing. This is where the
|
|
rule priority must be carefully considered to make sure that the rules are
|
|
evaluated in the right order.</p><p>A common pattern for generalized route specification is to provide one or
|
|
more higher priority rules that match various conditions,
|
|
and then provide a single weight-based rule with no match
|
|
condition last to provide the weighted distribution of
|
|
traffic for all other cases.</p><p>For example, the following <code>VirtualService</code> contains two rules that, together,
|
|
specify that all requests for the <em>reviews</em> service that includes a header
|
|
named “Foo” with the value “bar” will be sent to the “v2” instances.
|
|
All remaining requests will be sent to “v1”:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: reviews
|
|
spec:
|
|
hosts:
|
|
- reviews
|
|
http:
|
|
- match:
|
|
- headers:
|
|
Foo:
|
|
exact: bar
|
|
route:
|
|
- destination:
|
|
host: reviews
|
|
subset: v2
|
|
- route:
|
|
- destination:
|
|
host: reviews
|
|
subset: v1</code></pre><p>Notice that the header-based rule has the higher priority. If
|
|
it was lower, these rules wouldn't work as expected because the weight-based
|
|
rule, with no specific match condition, would be evaluated first to route all traffic to “v1”, even requests that include the
|
|
matching “Foo” header. Once a rule is found that applies to the incoming
|
|
request, it is executed and the rule-evaluation process terminates. That's why it's very important to carefully consider the
|
|
priorities of each rule when there is more than one.</p><h3 id=destination-rules>Destination rules</h3><p>A <a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/#DestinationRule><code>DestinationRule</code></a>
|
|
configures the set of policies to be applied to a request after <code>VirtualService</code> routing has occurred. They are
|
|
intended to be authored by service owners, describing the circuit breakers, load balancer settings, TLS settings, and other settings.</p><p>A <code>DestinationRule</code> also defines addressable <code>subsets</code>, meaning named versions, of the corresponding destination host.
|
|
These subsets are used in <code>VirtualService</code> route specifications when sending traffic to specific versions of the service.</p><p>The following <code>DestinationRule</code> configures policies and subsets for the reviews service:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: DestinationRule
|
|
metadata:
|
|
name: reviews
|
|
spec:
|
|
host: reviews
|
|
trafficPolicy:
|
|
loadBalancer:
|
|
simple: RANDOM
|
|
subsets:
|
|
- name: v1
|
|
labels:
|
|
version: v1
|
|
- name: v2
|
|
labels:
|
|
version: v2
|
|
trafficPolicy:
|
|
loadBalancer:
|
|
simple: ROUND_ROBIN
|
|
- name: v3
|
|
labels:
|
|
version: v3</code></pre><p>Notice that multiple policies, default and v2-specific in this example, can be
|
|
specified in a single <code>DestinationRule</code> configuration.</p><h4 id=circuit-breakers>Circuit breakers</h4><p>A simple circuit breaker can be set based on a number of conditions such as connection and request limits.</p><p>For example, the following <code>DestinationRule</code>
|
|
sets a limit of 100 connections to <em>reviews</em> service version “v1” backends:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: DestinationRule
|
|
metadata:
|
|
name: reviews
|
|
spec:
|
|
host: reviews
|
|
subsets:
|
|
- name: v1
|
|
labels:
|
|
version: v1
|
|
trafficPolicy:
|
|
connectionPool:
|
|
tcp:
|
|
maxConnections: 100</code></pre><p>See the <a href=/v1.0/docs/tasks/traffic-management/circuit-breaking/>circuit-breaking task</a> for a demonstration of circuit breaker control.</p><h4 id=rule-evaluation>Rule evaluation</h4><p>Similar to route rules, policies defined in a <code>DestinationRule</code> are associated with a particular <em>host</em>. However if they are subset specific,
|
|
activation depends on route rule evaluation results.</p><p>The first step in the rule evaluation process evaluates the route rules in
|
|
the <code>VirtualService</code> corresponding to the requested <em>host</em>, if there are any,
|
|
to determine the subset (meaning specific
|
|
version) of the destination service that the current request will be routed
|
|
to. Next, the set of policies corresponding to the selected subset, if any,
|
|
are evaluated to determine if they apply.</p><p><strong>NOTE:</strong> One subtlety of the algorithm to keep in mind is that policies
|
|
that are defined for specific subsets will only be applied if
|
|
the corresponding subset is explicitly routed to. For example,
|
|
consider the following configuration as the one and only rule defined for the
|
|
<em>reviews</em> service, meaning there are no route rules in the corresponding <code>VirtualService</code> definition:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: DestinationRule
|
|
metadata:
|
|
name: reviews
|
|
spec:
|
|
host: reviews
|
|
subsets:
|
|
- name: v1
|
|
labels:
|
|
version: v1
|
|
trafficPolicy:
|
|
connectionPool:
|
|
tcp:
|
|
maxConnections: 100</code></pre><p>Since there is no specific route rule defined for the <em>reviews</em>
|
|
service, default round-robin routing behavior will apply, which will
|
|
presumably call “v1” instances on occasion, maybe even always if “v1” is
|
|
the only running version. Nevertheless, the above policy will never be
|
|
invoked since the default routing is done at a lower level. The rule
|
|
evaluation engine will be unaware of the final destination and therefore
|
|
unable to match the subset policy to the request.</p><p>You can fix the above example in one of two ways. You can either move the
|
|
traffic policy up a level in the <code>DestinationRule</code> to make it apply to any version:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: DestinationRule
|
|
metadata:
|
|
name: reviews
|
|
spec:
|
|
host: reviews
|
|
trafficPolicy:
|
|
connectionPool:
|
|
tcp:
|
|
maxConnections: 100
|
|
subsets:
|
|
- name: v1
|
|
labels:
|
|
version: v1</code></pre><p>Or, better yet, define proper route rules for the service in the <code>VirtualService</code> definition.
|
|
For example, add a simple route rule for “reviews:v1”:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: reviews
|
|
spec:
|
|
hosts:
|
|
- reviews
|
|
http:
|
|
- route:
|
|
- destination:
|
|
host: reviews
|
|
subset: v1</code></pre><p>Although the default Istio behavior conveniently sends traffic from any
|
|
source to all versions of a destination service
|
|
without any rules being set, as soon as version discrimination is desired
|
|
rules are going to be needed.
|
|
Therefore, setting a default rule for every service, right from the
|
|
start, is generally considered a best practice in Istio.</p><h3 id=service-entries>Service entries</h3><p>A <a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/#ServiceEntry><code>ServiceEntry</code></a>
|
|
is used to add additional entries into the service registry that Istio maintains internally.
|
|
It is most commonly used to enable requests to services outside of an Istio service mesh.
|
|
For example, the following <code>ServiceEntry</code> can be used to allow external calls to services hosted
|
|
under the <code>*.foo.com</code> domain:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: ServiceEntry
|
|
metadata:
|
|
name: foo-ext-svc
|
|
spec:
|
|
hosts:
|
|
- *.foo.com
|
|
ports:
|
|
- number: 80
|
|
name: http
|
|
protocol: HTTP
|
|
- number: 443
|
|
name: https
|
|
protocol: HTTPS</code></pre><p>The destination of a <code>ServiceEntry</code> is specified using the <code>hosts</code> field, which
|
|
can be either a fully qualified or wildcard domain name.
|
|
It represents a white listed set of one or more services that services
|
|
in the mesh are allowed to access.</p><p>A <code>ServiceEntry</code> is not limited to external service configuration. It can be of two types: mesh-internal or mesh-external.
|
|
Mesh-internal entries are like all other internal services but are used to explicitly add services
|
|
to the mesh. They can be used to add services as part of expanding the service mesh to include unmanaged infrastructure
|
|
(for example, VMs added to a Kubernetes-based service mesh).
|
|
Mesh-external entries represent services external to the mesh.
|
|
For them, mutual TLS authentication is disabled and policy enforcement is performed on the client-side,
|
|
instead of on the server-side as it is for internal service requests.</p><p>Service entries work well in conjunction with virtual services
|
|
and destination rules as long as they refer to the services using matching
|
|
<code>hosts</code>. For example, the following rule can be used in conjunction with
|
|
the above <code>ServiceEntry</code> rule to set a 10s timeout for calls to
|
|
the external service at <code>bar.foo.com</code>:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: bar-foo-ext-svc
|
|
spec:
|
|
hosts:
|
|
- bar.foo.com
|
|
http:
|
|
- route:
|
|
- destination:
|
|
host: bar.foo.com
|
|
timeout: 10s</code></pre><p>Rules to redirect and forward traffic, to define retry,
|
|
timeout, and fault injection policies are all supported for external destinations.
|
|
Weighted (version-based) routing is not possible, however, since there is no notion
|
|
of multiple versions of an external service.</p><p>See the <a href=/v1.0/docs/tasks/traffic-management/egress/>egress task</a> for a more
|
|
about accessing external services.</p><h3 id=gateways>Gateways</h3><p>A <a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/#Gateway>Gateway</a>
|
|
configures a load balancer for HTTP/TCP traffic, most commonly operating at the edge of the
|
|
mesh to enable ingress traffic for an application.</p><p>Unlike Kubernetes Ingress, Istio <code>Gateway</code> only configures the L4-L6 functions
|
|
(for example, ports to expose, TLS configuration). Users can then use standard Istio rules
|
|
to control HTTP requests as well as TCP traffic entering a <code>Gateway</code> by binding a
|
|
<code>VirtualService</code> to it.</p><p>For example, the following simple <code>Gateway</code> configures a load balancer
|
|
to allow external HTTPS traffic for host <code>bookinfo.com</code> into the mesh:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: Gateway
|
|
metadata:
|
|
name: bookinfo-gateway
|
|
spec:
|
|
servers:
|
|
- port:
|
|
number: 443
|
|
name: https
|
|
protocol: HTTPS
|
|
hosts:
|
|
- bookinfo.com
|
|
tls:
|
|
mode: SIMPLE
|
|
serverCertificate: /tmp/tls.crt
|
|
privateKey: /tmp/tls.key</code></pre><p>To configure the corresponding routes, you must define a <code>VirtualService</code>
|
|
for the same host and bound to the <code>Gateway</code> using
|
|
the <code>gateways</code> field in the configuration:</p><pre><code class=language-yaml>apiVersion: networking.istio.io/v1alpha3
|
|
kind: VirtualService
|
|
metadata:
|
|
name: bookinfo
|
|
spec:
|
|
hosts:
|
|
- bookinfo.com
|
|
gateways:
|
|
- bookinfo-gateway # <---- bind to gateway
|
|
http:
|
|
- match:
|
|
- uri:
|
|
prefix: /reviews
|
|
route:
|
|
...</code></pre><p>See the <a href=/v1.0/docs/tasks/traffic-management/ingress/>ingress task</a> for a
|
|
complete ingress gateway example.</p><p>Although primarily used to manage ingress traffic, a <code>Gateway</code> can also be used to model
|
|
a purely internal or egress proxy. Irrespective of the location, all gateways
|
|
can be configured and controlled in the same way. See
|
|
<a href=/v1.0/docs/reference/config/istio.networking.v1alpha3/#Gateway>gateway reference</a>
|
|
for details.</p><h2 id=see-also>See also</h2><div class=see-also><div class=container-fluid><div class=row><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/blog/2019/custom-ingress-gateway/>Deploy a custom ingress gateway using cert-manager</a></p><p class=desc>Describes how to deploy a custom ingress gateway using cert-manager manually.</p></div><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/blog/2018/incremental-traffic-management/>Incremental Istio Part 1, Traffic Management</a></p><p class=desc>How to use Istio for traffic management without deploying sidecar proxies.</p></div><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/blog/2018/v1alpha3-routing/>Introducing the Istio v1alpha3 routing API</a></p><p class=desc>Introduction, motivation and design principles for the Istio v1alpha3 routing API.</p></div><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/blog/2018/aws-nlb/>Configuring Istio Ingress with AWS NLB</a></p><p class=desc>Describes how to configure Istio ingress with a network load balancer on AWS.</p></div><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/blog/2018/traffic-mirroring/>Traffic Mirroring with Istio for Testing in Production</a></p><p class=desc>An introduction to safer, lower-risk deployments and release to production.</p></div><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/blog/2018/egress-tcp/>Consuming External TCP Services</a></p><p class=desc>Describes a simple scenario based on Istio's Bookinfo example.</p></div></div></div></div></main><div class="container-fluid d-print-none"><br><div class=row><div class="col-6 pagenav"><p><a title="Introduces Istio, the problems it solves, its high-level architecture and design goals." href=/v1.0/docs/concepts/what-is-istio/><i class="fa fa-long-arrow-alt-left"></i>What is Istio?</a></p></div><div class="col-6 pagenav" style=text-align:right><p><a title="Describes Istio's authorization and authentication functionality." href=/v1.0/docs/concepts/security/>Security
|
|
<i class="fa fa-long-arrow-alt-right"></i></a></p></div></div></div><div class="d-none d-print-block" aria-hidden=true><h2>Links</h2><ol id=endnotes></ol></div></div><div class="col-12 col-md-2 d-none d-xl-block d-print-none"><nav class=toc><div class=spacer></div><div id=toc class=directory role=directory><nav id=TableOfContents><ul><li><a href=#pilot-and-envoy>Pilot and Envoy</a></li><li><a href=#request-routing>Request routing</a></li><ul><li><a href=#communication-between-services>Communication between services</a></li><li><a href=#ingress-and-egress>Ingress and egress</a></li></ul><li><a href=#discovery-and-load-balancing>Discovery and load balancing</a></li><li><a href=#handling-failures>Handling failures</a></li><ul><li><a href=#fine-tuning>Fine tuning</a></li><li><a href=#failure-handling-faq>Failure handling FAQ</a></li></ul><li><a href=#fault-injection>Fault injection</a></li><li><a href=#rule-configuration>Rule configuration</a></li><ul><li><a href=#virtual-services>Virtual Services</a></li><ul><li><a href=#rule-destinations>Rule destinations</a></li><li><a href=#splitting-traffic-between-versions>Splitting traffic between versions</a></li><li><a href=#timeouts-and-retries>Timeouts and retries</a></li><li><a href=#injecting-faults>Injecting faults</a></li><li><a href=#conditional-rules>Conditional rules</a></li><li><a href=#multiple-match-conditions>Multiple match conditions</a></li><li><a href=#precedence>Precedence</a></li></ul><li><a href=#destination-rules>Destination rules</a></li><ul><li><a href=#circuit-breakers>Circuit breakers</a></li><li><a href=#rule-evaluation>Rule evaluation</a></li></ul><li><a href=#service-entries>Service entries</a></li><li><a href=#gateways>Gateways</a></li></ul><li><a href=#see-also>See also</a></li></ul></nav></div></nav></div></div></div><footer class="d-print-none container-fluid"><div class=row><div class="col-5 col-lg-4" role=navigation><div class=container-fluid><div class=row><div class=icon><span>discuss</span>
|
|
<a title="Join the Istio discussion board to participate in discussions and get help troubleshooting problems" href=https://discuss.istio.io aria-label="Istio discussion board"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M225.9 32C103.3 32 0 130.5.0 252.1.0 256 .1 480 .1 480l225.8-.2c122.7.0 222.1-102.3 222.1-223.9S348.6 32 225.9 32zM224 384c-19.4.0-37.9-4.3-54.4-12.1L88.5 392l22.9-75c-9.8-18.1-15.4-38.9-15.4-61 0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128z" /></svg></a></div><div class=icon><span>slack</span>
|
|
<a title="Interactively discuss issues with the Istio community on Slack" href=https://istio.slack.com aria-label=slack><svg viewBox="0 0 31.444 31.443"><path d="M31.202 16.369c-.62-1.388-2.249-2.011-3.637-1.391l-1.325.594-3.396-7.591 1.325-.592c1.388-.622 2.01-2.25 1.389-3.637-.62-1.389-2.248-2.012-3.637-1.39l-1.324.593-.593-1.326c-.621-1.388-2.249-2.009-3.637-1.388-1.388.62-2.009 2.247-1.389 3.637l.593 1.325L7.98 8.598 7.388 7.273c-.621-1.39-2.249-2.009-3.637-1.39C2.363 6.504 1.742 8.132 2.362 9.52l.592 1.324L1.63 11.438c-1.388.621-2.01 2.247-1.389 3.636.62 1.388 2.249 2.01 3.637 1.39l1.325-.594 3.394 7.592-1.325.592c-1.388.621-2.009 2.25-1.389 3.637.621 1.389 2.249 2.011 3.637 1.391l1.324-.593.593 1.325c.621 1.389 2.249 2.01 3.637 1.389 1.387-.62 2.009-2.248 1.388-3.636l-.591-1.326 7.591-3.394.592 1.321c.621 1.391 2.248 2.013 3.637 1.392 1.388-.619 2.01-2.248 1.389-3.637l-.592-1.324 1.323-.594C31.201 19.384 31.823 17.757 31.202 16.369zM13.623 21.215l-3.395-7.593 7.591-3.394 3.395 7.591L13.623 21.215z"/></svg></a></div><div class=icon><span>twitter</span>
|
|
<a title="Follow us on Twitter to get the latest news" href=https://twitter.com/IstioMesh aria-label=Twitter><svg viewBox="0 0 310 310"><path d="M302.973 57.388c-4.87 2.16-9.877 3.983-14.993 5.463 6.057-6.85 10.675-14.91 13.494-23.73.632-1.977-.023-4.141-1.648-5.434-1.623-1.294-3.878-1.449-5.665-.39-10.865 6.444-22.587 11.075-34.878 13.783-12.381-12.098-29.197-18.983-46.581-18.983-36.695.0-66.549 29.853-66.549 66.547.0 2.89.183 5.764.545 8.598C101.163 99.244 58.83 76.863 29.76 41.204c-1.036-1.271-2.632-1.956-4.266-1.825-1.635.128-3.104 1.05-3.93 2.467-5.896 10.117-9.013 21.688-9.013 33.461.0 16.035 5.725 31.249 15.838 43.137-3.075-1.065-6.059-2.396-8.907-3.977-1.529-.851-3.395-.838-4.914.033-1.52.871-2.473 2.473-2.513 4.224-.007.295-.007.59-.007.889.0 23.935 12.882 45.484 32.577 57.229-1.692-.169-3.383-.414-5.063-.735-1.732-.331-3.513.276-4.681 1.597-1.17 1.32-1.557 3.16-1.018 4.84 7.29 22.76 26.059 39.501 48.749 44.605-18.819 11.787-40.34 17.961-62.932 17.961-4.714.0-9.455-.277-14.095-.826-2.305-.274-4.509 1.087-5.294 3.279-.785 2.193.047 4.638 2.008 5.895 29.023 18.609 62.582 28.445 97.047 28.445 67.754.0 110.139-31.95 133.764-58.753 29.46-33.421 46.356-77.658 46.356-121.367.0-1.826-.028-3.67-.084-5.508 11.623-8.757 21.63-19.355 29.773-31.536 1.237-1.85 1.103-4.295-.33-5.998C307.394 57.037 305.009 56.486 302.973 57.388z"/></svg></a></div><div class=icon><span>stack overflow</span>
|
|
<a title="Stack Overflow is where you can ask questions and find curated answers on deploying, configuring, and using Istio" href=https://stackoverflow.com/questions/tagged/istio aria-label="Stack Overflow"><svg viewBox="0 0 120 120"><polygon points="84.4,93.8 84.4,70.6 92.1,70.6 92.1,101.5 22.6,101.5 22.6,70.6 30.3,70.6 30.3,93.8"/><path d="M38.8 68.4l37.8 7.9 1.6-7.6-37.8-7.9L38.8 68.4zM43.8 50.4l35 16.3 3.2-7-35-16.4L43.8 50.4zM53.5 33.2l29.7 24.7 4.9-5.9L58.4 27.3 53.5 33.2zM72.7 14.9l-6.2 4.6 23 31 6.2-4.6-23-31zM38 86h38.6v-7.7H38V86z"/></svg></a></div></div><div class="tag row d-none d-lg-flex">for everyone</div></div></div><div class="col-7 col-lg-4"><p class="text-center copyright" role=contentinfo>Istio
|
|
Archive
|
|
1.0<br>© 2019 Istio Authors, <a href=https://policies.google.com/privacy>Privacy Policy</a><br>Archived on March 19, 2019</p></div><div class="col-6 col-lg-4 d-none d-lg-flex" role=navigation><div class=container-fluid><div class="row justify-content-end"><div class=icon><span>github</span>
|
|
<a title="GitHub is where development takes place on Istio code" href=https://github.com/istio/community aria-label=GitHub><svg viewBox="0 0 478.165 478.165"><path d="M349.22 55.768c6.136 14.046 10.241 37.556 4.224 54.69 24.426 20.999 33.073 71.904 21.079 113.704 35.006 2.73 76.666-1.235 103.642 9.484-25.183-3.248-59.651-9.563-91.987-7.431-6.136.458-15.361-.239-14.903 8.408 37.735 3.008 75.092 6.117 105.894 15.779-30.702-4.981-67.74-12.552-105.894-13.668-15.54 30.921-47.239 46.262-90.991 49.49 4.682 10.261 13.847 14.066 15.879 30.702 3.267 24.406-4.881 60.328 3.208 76.686 4.064 7.89 10.579 8.009 14.863 14.604-10.699 12.871-37.257-1.395-40.186-14.604-5.14-22.852 7.89-58.256-6.415-73.737.996 24.865-5.718 59.85.996 82.145 2.789 8.806 10.659 12.113 8.647 20.063-49.809 5.08-28.989-64.373-37.177-105.356-7.471.697-4.204 11.197-4.224 15.76-.199 40.106 8.189 94.836-34.846 89.556-1.315-8.348 5.838-11.217 8.467-19.007 7.91-22.434-1.454-56.045 2.112-83.161-16.417 12.512 1.793 55.666-8.428 77.961-5.838 12.671-24.785 18.27-39.19 12.651 1.873-9.464 11.695-7.989 15.879-16.875 5.818-12.452.02-30.244 2.092-48.494-30.423 6.097-53.993-.877-65.608-20.023-5.12-8.507-6.356-18.708-12.632-26.219-6.117-7.551-16.098-8.507-19.087-18.808 37.755-9.185 39.17 38.771 73.06 39.807 10.44.418 15.799-2.909 25.402-5.16 2.749-12.113 8.428-21.039 16.875-27.494-42.078-5.658-76.865-18.788-93.023-50.466-38.293 1.893-73.339 7.013-105.894 14.843 29.547-10.679 65.807-14.604 104.778-15.819-2.351-13.807-22.434-10.022-34.866-9.543C47.677 227.17 18.449 230.138.0 233.645c26.817-9.543 64.233-8.348 100.454-8.428-11.038-34.767-7.232-90.014 17.015-110.615-6.854-17.254-4.722-45.346 4.184-58.834 27.036 1.175 43.374 12.891 60.388 24.247 21.019-6.017 43.035-9.045 71.904-7.451 12.133.677 24.705 6.097 33.731 5.32 8.906-.877 18.728-10.898 27.534-14.843C326.507 58.099 336.17 56.206 349.22 55.768z"/></svg></a></div><div class=icon><span>drive</span>
|
|
<a title="Access our team drive if you'd like to take a look at the Istio technical design documents" href=https://groups.google.com/forum/#!forum/istio-team-drive-access aria-label="team drive"><svg viewBox="0 0 207.027 207.027"><path d="M69.866 15.557.0 138.919l28.732 52.552 143.288-.029 35.008-59.588L136.39 15.735 69.866 15.557zM17.166 139.046 74.268 38.205 91.21 67.783 33.24 168.447 17.166 139.046zM99.841 82.851l23.805 41.558-47.732-.006L99.841 82.851zM163.434 176.443l-117.332.024 21.53-37.065 64.606.008.067.119 52.865-.085L163.434 176.443zM140.932 124.411 90.157 35.767l-2.966-5.178 40.751.121 57.003 93.706L140.932 124.411z"/></svg></a></div><div class=icon><span>working groups</span>
|
|
<a title="If you'd like to contribute to the Istio project, consider participating in our working groups" href=https://github.com/istio/community/blob/master/WORKING-GROUPS.md aria-label="working groups"><svg viewBox="0 -45 439.833 439.833"><polygon points="246.048,195.833 299.966,235.085 319.497,227.296 276.278,195.833"/><polygon points="193.786,195.833 163.556,195.833 120.33,227.3 139.862,235.089"/><path d="M219.927 11.558c-23.854.0-37.057 12.362-36.814 36.182.348 32.623 14.211 52.414 36.814 52.068.0.0 36.802 1.492 36.802-52.068C256.729 23.918 244.294 11.558 219.927 11.558z"/><path d="M285.017 124.567l-36.77-14.659-8.608-7.256c-2.274-1.922-5.636-1.78-7.741.317l-11.973 11.904-12.008-11.907c-2.109-2.094-5.465-2.229-7.736-.313l-8.611 7.256-36.77 14.661c-11.842 4.715-11.83 46.647-12.848 50.497h155.93C296.866 171.228 296.862 129.28 285.017 124.567z"/><path d="M77.976 228.568s36.801 1.492 36.801-52.068c0-23.82-12.434-36.182-36.801-36.182-23.854.0-37.057 12.362-36.814 36.182C41.509 209.124 55.372 228.915 77.976 228.568z"/><path d="M143.065 253.329l-36.77-14.658-8.609-7.256c-2.275-1.923-5.635-1.781-7.742.315l-11.971 11.904-12.008-11.908c-2.109-2.094-5.465-2.229-7.736-.312l-8.611 7.256-36.77 14.66C1.006 258.045 1.018 299.977.0 303.827h155.93C154.915 299.988 154.911 258.042 143.065 253.329z"/><path d="M361.878 228.568s36.801 1.492 36.801-52.068c0-23.82-12.434-36.182-36.801-36.182-23.854.0-37.057 12.362-36.812 36.182C325.411 209.124 339.274 228.915 361.878 228.568z"/><path d="M426.968 253.329l-36.77-14.658-8.609-7.256c-2.273-1.923-5.635-1.781-7.742.315l-11.971 11.904-12.008-11.908c-2.109-2.094-5.465-2.229-7.736-.312l-8.61 7.256-36.771 14.66c-11.842 4.715-11.83 46.646-12.848 50.497h155.93C438.817 299.988 438.812 258.042 426.968 253.329z"/></svg></a></div></div><div class="tag row justify-content-end text-right">for developers</div></div></div></div></footer><div class="d-xl-none d-print-none"><button id=scroll-to-top aria-hidden=true onclick=scrollToTop() title="Back to top"><i class="fa fa-lg fa-arrow-up"></i></button></div><script src=https://code.jquery.com/jquery-3.2.1.slim.min.js integrity=sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN crossorigin=anonymous></script><script src=https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js integrity=sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl crossorigin=anonymous></script><script src=https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js></script><script src="https://www.google.com/cse/brand?form=search_form"></script><script src=/v1.0/js/all.min.js data-manual></script></body></html> |