mirror of https://github.com/istio/istio.io.git
108 lines
24 KiB
HTML
108 lines
24 KiB
HTML
<!DOCTYPE html><html lang="en" itemscope itemtype="https://schema.org/WebPage" style="overflow-y: scroll;"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="title" content="Istio Ingress Controller"><meta name="og:title" content="Istio Ingress Controller"><meta name="og:image" content="/v0.4/img/logo.png"/><meta name="theme-color" content="#466BB0"/><meta name="description" content="Describes how to configure the Istio ingress controller on Kubernetes."><meta name="og:description" content="Describes how to configure the Istio ingress controller on Kubernetes."><title>Istioldie 0.4 / Istio Ingress Controller</title><script> window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; ga('create', 'UA-98480406-2', 'auto'); ga('send', 'pageview'); </script> <script async src='https://www.google-analytics.com/analytics.js'></script><link rel="alternate" type="application/rss+xml" title="Istio Blog RSS" href="/v0.4/feed.xml"><link rel="shortcut icon" href="/v0.4/favicons/favicon.ico" ><link rel="apple-touch-icon" href="/v0.4/favicons/apple-touch-icon-180x180.png" sizes="180x180"><link rel="icon" type="image/png" href="/v0.4/favicons/favicon-16x16.png" sizes="16x16"><link rel="icon" type="image/png" href="/v0.4/favicons/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="/v0.4/favicons/android-36x36.png" sizes="36x36"><link rel="icon" type="image/png" href="/v0.4/favicons/android-48x48.png" sizes="48x48"><link rel="icon" type="image/png" href="/v0.4/favicons/android-72x72.png" sizes="72x72"><link rel="icon" type="image/png" href="/v0.4/favicons/android-96x196.png" sizes="96x196"><link rel="icon" type="image/png" href="/v0.4/favicons/android-144x144.png" sizes="144x144"><link rel="icon" type="image/png" href="/v0.4/favicons/android-192x192.png" sizes="192x192"><link rel="manifest" href="/v0.4/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=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic"><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"><link rel="stylesheet" href="/v0.4/css/all.css"><link rel="stylesheet" href="/v0.4/css/prism.css"></head><body class="language-unknown"> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script><div class="nav-hero-container" style="z-index: 200000;"><nav id="header-nav" class="navbar navbar-inverse" role="navigation" style="z-index: 200000;"><div class="container"><div class="row"><div class="col-md-11 nofloat center-block "><div class="navbar-header"> <button type="button" class="hamburger navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/v0.4/"><div> <img src="/v0.4/img/istio-logo.svg" alt="Istio Logo" height="54px"/> <span class="brand-name">Istioldie 0.4</span></div></a></div><div class="collapse navbar-collapse" id="navbar-collapse-1"><ul class="nav navbar-nav navbar-right"><li><a href="/v0.4/about" >About</a></li><li><a href="/v0.4/blog/posts/2017/mixer-spof-myth.html" >Blog</a></li><li><a href="/v0.4/docs/welcome" class='current'>Docs</a></li><li><a href="/v0.4/help" >Help</a></li><li><a href="/v0.4/community" >Community</a></li><li class="dropdown"> <a class="dropdown-toggle" data-toggle="dropdown" href=""> <i class='fa fa-lg fa-cog'></i> <span class="caret"></span> </a><ul class="dropdown-menu"><h6 class="dropdown-header">Other versions of this site</h6><li> <a href="https://istio.io">Current Release</a></li><li> <a href="https://preliminary.istio.io">Next Release</a></li><li> <a href="https://archive.istio.io">Older Releases</a></li></ul></li><li><form name="cse" id="searchbox_demo" class="navbar-form navbar-right" 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" /><div class="form-group"><div class="input-group"> <input name="q" class="form-control search-box" type="text" size="30" /><div class="input-group-addon"> <span class="btn-search glyphicon glyphicon-search"></span></div></div></div></form> <script type="text/javascript" src="https://www.google.com/cse/brand?form=searchbox_demo"></script></li></ul></div></div></div></div></nav></div><div class="container"><div class="row"><div class="col-md-11 nofloat center-block" style="margin-top: 3px;"><ul class="col-sm-10 nav nav-tabs"><li role="presentation" ><a href="/v0.4/docs/welcome/">Welcome</a></li><li role="presentation" ><a href="/v0.4/docs/concepts/">Concepts</a></li><li role="presentation" ><a href="/v0.4/docs/setup/">Setup</a></li><li role="presentation" class='active'><a href="/v0.4/docs/tasks/">Tasks</a></li><li role="presentation" ><a href="/v0.4/docs/guides/">Guides</a></li><li role="presentation" ><a href="/v0.4/docs/reference/">Reference</a></li></ul></div></div></div><script src="/v0.4/js/navtree.min.js"></script><div class="container docs"><div class="row"><div class="col-md-11 nofloat center-block"><div class="row"><div id="sidebar-container" class="col-sm-3"><ul class="sidebar"><li><h5 class='sidebar-title'>Tasks</h5></li><script type="text/javascript"> var docs = []; docs.push({path: [ "index.md", ], url: "/docs/tasks/", title: "Tasks", order: 20, overview: "Tasks show you how to do a single specific targeted activity with the Istio system."}); docs.push({path: [ "policy-enforcement", "index.md", ], url: "/docs/tasks/policy-enforcement/", title: "Policy Enforcement", order: 20, overview: "Describes tasks that demonstrate policy enforcement features."}); docs.push({path: [ "policy-enforcement", "rate-limiting.md", ], url: "/docs/tasks/policy-enforcement/rate-limiting.html", title: "Enabling Rate Limits", order: 10, overview: "This task shows you how to use Istio to dynamically limit the traffic to a service."}); docs.push({path: [ "security", "basic-access-control.md", ], url: "/docs/tasks/security/basic-access-control.html", title: "Setting up Basic Access Control", order: 20, overview: "This task shows how to control access to a service using the Kubernetes labels."}); docs.push({path: [ "security", "index.md", ], url: "/docs/tasks/security/", title: "Security", order: 40, overview: "Describes tasks that help securing the service mesh traffic."}); docs.push({path: [ "security", "mutual-tls.md", ], url: "/docs/tasks/security/mutual-tls.html", title: "Testing Istio mutual TLS authentication", order: 10, overview: "This task shows you how to verify and test Istio's automatic mutual TLS authentication."}); docs.push({path: [ "security", "per-service-mtls.md", ], url: "/docs/tasks/security/per-service-mtls.html", title: "Per-service mutual TLS authentication enablement", order: 40, overview: "This task shows how to change mutual TLS authentication for a single service."}); docs.push({path: [ "security", "plugin-ca-cert.md", ], url: "/docs/tasks/security/plugin-ca-cert.html", title: "Plugging in CA certificate and key", order: 40, overview: "This task shows how operators can plug existing certificate and key into Istio CA."}); docs.push({path: [ "security", "secure-access-control.md", ], url: "/docs/tasks/security/secure-access-control.html", title: "Setting up Secure Access Control", order: 30, overview: "This task shows how to securely control access to a service using service accounts."}); docs.push({path: [ "telemetry", "distributed-tracing.md", ], url: "/docs/tasks/telemetry/distributed-tracing.html", title: "Distributed Tracing", order: 10, overview: "How to configure the proxies to send tracing requests to Zipkin or Jaeger"}); docs.push({path: [ "telemetry", "index.md", ], url: "/docs/tasks/telemetry/", title: "Metrics, Logs, and Traces", order: 30, overview: "Describes tasks that demonstrate how to collect telemetry information from the service mesh."}); docs.push({path: [ "telemetry", "metrics-logs.md", ], url: "/docs/tasks/telemetry/metrics-logs.html", title: "Collecting Metrics and Logs", order: 20, overview: "This task shows you how to configure Istio to collect metrics and logs."}); docs.push({path: [ "telemetry", "querying-metrics.md", ], url: "/docs/tasks/telemetry/querying-metrics.html", title: "Querying Metrics from Prometheus", order: 30, overview: "This task shows you how to query for Istio Metrics using Prometheus."}); docs.push({path: [ "telemetry", "servicegraph.md", ], url: "/docs/tasks/telemetry/servicegraph.html", title: "Generating a Service Graph", order: 50, overview: "This task shows you how to generate a graph of services within an Istio mesh."}); docs.push({path: [ "telemetry", "tcp-metrics.md", ], url: "/docs/tasks/telemetry/tcp-metrics.html", title: "Collecting Metrics for TCP services", order: 25, overview: "This task shows you how to configure Istio to collect metrics for TCP services."}); docs.push({path: [ "telemetry", "using-istio-dashboard.md", ], url: "/docs/tasks/telemetry/using-istio-dashboard.html", title: "Visualizing Metrics with Grafana", order: 40, overview: "This task shows you how to setup and use the Istio Dashboard to monitor mesh traffic."}); docs.push({path: [ "traffic-management", "egress.md", ], url: "/docs/tasks/traffic-management/egress.html", title: "Control Egress Traffic", order: 40, overview: "Describes how to configure Istio to route traffic from services in the mesh to external services."}); docs.push({path: [ "traffic-management", "fault-injection.md", ], url: "/docs/tasks/traffic-management/fault-injection.html", title: "Fault Injection", order: 20, overview: "This task shows how to inject delays and test the resiliency of your application."}); docs.push({path: [ "traffic-management", "index.md", ], url: "/docs/tasks/traffic-management/", title: "Traffic Management", order: 10, overview: "Describes tasks that demonstrate traffic routing features of Istio service mesh."}); docs.push({path: [ "traffic-management", "ingress.md", ], url: "/docs/tasks/traffic-management/ingress.html", title: "Istio Ingress Controller", order: 30, overview: "Describes how to configure the Istio ingress controller on Kubernetes."}); docs.push({path: [ "traffic-management", "request-routing.md", ], url: "/docs/tasks/traffic-management/request-routing.html", title: "Configuring Request Routing", order: 10, overview: "This task shows you how to configure dynamic request routing based on weights and HTTP headers."}); docs.push({path: [ "traffic-management", "request-timeouts.md", ], url: "/docs/tasks/traffic-management/request-timeouts.html", title: "Setting Request Timeouts", order: 28, overview: "This task shows you how to setup request timeouts in Envoy using Istio."}); docs.push({path: [ "traffic-management", "traffic-shifting.md", ], url: "/docs/tasks/traffic-management/traffic-shifting.html", title: "Traffic Shifting", order: 25, overview: "This task shows you how to migrate traffic from an old to new version of a service."}); genSideBarTree(docs) </script></ul></div><div id="tab-container" class="col-xs-1 tab-neg-margin pull-left"> <a id="sidebar-tab" class="glyphicon glyphicon-chevron-left" href="javascript:void 0;"> </a></div><div id="content-container" class="thin-left-border col-sm-9 markdown"><div id="toc" class="toc"></div><div id="doc-content"><h1>Istio Ingress Controller</h1><p>This task describes how to configure Istio to expose a service outside of the service mesh cluster. In a Kubernetes environment, the <a href="https://kubernetes.io/docs/concepts/services-networking/ingress/">Kubernetes Ingress Resources</a> allows users to specify services that should be exposed outside the cluster. However, the Ingress Resource specification is very minimal, allowing users to specify just hosts, paths and their backing services. The following are the known limitations of Istio ingress:</p><ol><li>Istio supports standard Kubernetes Ingress specification without annotations. There is no support for <code>ingress.kubernetes.io</code> annotations in the Ingress resource specifications. Any annotation other than <code>kubernetes.io/ingress.class: istio</code> will be ignored.</li><li>Regular expressions in paths are not supported.</li><li>Fault injection at the Ingress is not supported.</li></ol><h2 id="before-you-begin">Before you begin</h2><ul><li><p>Setup Istio by following the instructions in the <a href="/v0.4/docs/setup/">Installation guide</a>.</p></li><li><p>Make sure your current directory is the <code>istio</code> directory.</p></li><li><p>Start the <a href="https://github.com/istio/istio/tree/master/samples/httpbin">httpbin</a> sample, which will be used as the destination service to be exposed externally.</p><p>If you installed the <a href="/v0.4/docs/setup/kubernetes/sidecar-injection.html#automatic-sidecar-injection">Istio-Initializer</a>, do</p><pre><code class="language-bash">kubectl apply -f samples/httpbin/httpbin.yaml
|
||
</code></pre><p>Without the Istio-Initializer:</p><pre><code class="language-bash">kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml)
|
||
</code></pre></li></ul><h2 id="configuring-ingress-http">Configuring ingress (HTTP)</h2><ol><li><p>Create a basic Ingress Resource for the httpbin service</p><pre><code class="language-bash">cat <<EOF | kubectl create -f -
|
||
apiVersion: extensions/v1beta1
|
||
kind: Ingress
|
||
metadata:
|
||
name: simple-ingress
|
||
annotations:
|
||
kubernetes.io/ingress.class: istio
|
||
spec:
|
||
rules:
|
||
- http:
|
||
paths:
|
||
- path: /status/.*
|
||
backend:
|
||
serviceName: httpbin
|
||
servicePort: 8000
|
||
EOF
|
||
</code></pre><p><code>/.*</code> is a special Istio notation that is used to indicate a prefix match, specifically a <a href="/v0.4/docs/reference/config/traffic-rules/routing-rules.html#matchcondition">rule match configuration</a> of the form (<code>prefix: /</code>).</p></li></ol><h2 id="verifying-ingress">Verifying ingress</h2><ol><li><p>Determine the ingress URL:</p><ul><li><p>If your cluster is running in an environment that supports external load balancers, use the ingress’ external address:</p><pre><code class="language-bash">kubectl get ingress simple-ingress -o wide
|
||
</code></pre><pre><code class="language-bash">NAME HOSTS ADDRESS PORTS AGE
|
||
simple-ingress * 130.211.10.121 80 1d
|
||
</code></pre><pre><code class="language-bash">export INGRESS_HOST=130.211.10.121
|
||
</code></pre></li><li><p>If load balancers are not supported, use the ingress controller pod’s hostIP:</p><pre><code class="language-bash">kubectl -n istio-system get po -l istio=ingress -o jsonpath='{.items[0].status.hostIP}'
|
||
</code></pre><pre><code class="language-bash">169.47.243.100
|
||
</code></pre><p>along with the istio-ingress service’s nodePort for port 80:</p><pre><code class="language-bash">kubectl -n istio-system get svc istio-ingress
|
||
</code></pre><pre><code class="language-bash">NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
||
istio-ingress 10.10.10.155 <pending> 80:31486/TCP,443:32254/TCP 32m
|
||
</code></pre><pre><code class="language-bash">export INGRESS_HOST=169.47.243.100:31486
|
||
</code></pre></li></ul></li><li><p>Access the httpbin service using <em>curl</em>:</p><pre><code class="language-bash">curl -I http://$INGRESS_HOST/status/200
|
||
</code></pre><pre><code class="language-bash">HTTP/1.1 200 OK
|
||
Server: meinheld/0.6.1
|
||
Date: Thu, 05 Oct 2017 21:23:17 GMT
|
||
Content-Type: text/html; charset=utf-8
|
||
Access-Control-Allow-Origin: *
|
||
Access-Control-Allow-Credentials: true
|
||
X-Powered-By: Flask
|
||
X-Processed-Time: 0.00105214118958
|
||
Content-Length: 0
|
||
Via: 1.1 vegur
|
||
Connection: Keep-Alive
|
||
</code></pre></li><li><p>Access any other URL that has not been explicitly exposed. You should see a HTTP 403</p><pre><code class="language-bash">curl -I http://$INGRESS_HOST/headers
|
||
</code></pre><pre><code class="language-bash">HTTP/1.1 403 FORBIDDEN
|
||
Server: meinheld/0.6.1
|
||
Date: Thu, 05 Oct 2017 21:24:47 GMT
|
||
Content-Type: text/html; charset=utf-8
|
||
Access-Control-Allow-Origin: *
|
||
Access-Control-Allow-Credentials: true
|
||
X-Powered-By: Flask
|
||
X-Processed-Time: 0.000759840011597
|
||
Content-Length: 0
|
||
Via: 1.1 vegur
|
||
Connection: Keep-Alive
|
||
</code></pre></li></ol><h2 id="configuring-secure-ingress-https">Configuring secure ingress (HTTPS)</h2><ol><li><p>Generate keys if necessary</p><p>A private key and certificate can be created for testing using <a href="https://www.openssl.org/">OpenSSL</a>.</p><pre><code class="language-bash">openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls.key -out /tmp/tls.crt -subj "/CN=foo.bar.com"
|
||
</code></pre></li><li><p>Update the secret using <code>kubectl</code></p><pre><code class="language-bash">kubectl create -n istio-system secret tls istio-ingress-certs --key /tmp/tls.key --cert /tmp/tls.crt
|
||
</code></pre></li><li><p>Create the Ingress Resource for the httpbin service</p><pre><code class="language-bash">cat <<EOF | kubectl create -f -
|
||
apiVersion: extensions/v1beta1
|
||
kind: Ingress
|
||
metadata:
|
||
name: secure-ingress
|
||
annotations:
|
||
kubernetes.io/ingress.class: istio
|
||
spec:
|
||
tls:
|
||
- secretName: istio-ingress-certs # currently ignored
|
||
rules:
|
||
- http:
|
||
paths:
|
||
- path: /status/.*
|
||
backend:
|
||
serviceName: httpbin
|
||
servicePort: 8000
|
||
- path: /delay/.*
|
||
backend:
|
||
serviceName: httpbin
|
||
servicePort: 8000
|
||
EOF
|
||
</code></pre><p>Set the INGRESS_HOST to point to the ip address and the port number of the ingress service as shown earlier.</p><blockquote><p>Note: Envoy currently only allows a single TLS secret in the ingress since SNI is not yet supported. That means that the secret name field in ingress resource is not used, and the secret must be called <code>istio-ingress-certs</code> in <code>istio-system</code> namespace.</p></blockquote></li><li><p>Access the secured httpbin service using <em>curl</em>:</p><pre><code class="language-bash">curl -I -k https://$INGRESS_HOST/status/200
|
||
</code></pre></li></ol><h2 id="using-istio-routing-rules-with-ingress">Using Istio Routing Rules with Ingress</h2><p>Istio’s routing rules can be used to achieve a greater degree of control when routing requests to backend services. For example, the following route rule sets a 4s timeout for all calls to the httpbin service on the /delay URL.</p><pre><code class="language-bash"> cat <<EOF | istioctl create -f -
|
||
apiVersion: config.istio.io/v1alpha2
|
||
kind: RouteRule
|
||
metadata:
|
||
name: status-route
|
||
spec:
|
||
destination:
|
||
name: httpbin
|
||
match:
|
||
# Optionally limit this rule to istio ingress pods only
|
||
source:
|
||
name: istio-ingress
|
||
labels:
|
||
istio: ingress
|
||
request:
|
||
headers:
|
||
uri:
|
||
prefix: /delay/ #must match the path specified in ingress spec
|
||
# if using prefix paths (/delay/.*), omit the .*.
|
||
# if using exact match, use exact: /status
|
||
route:
|
||
- weight: 100
|
||
httpReqTimeout:
|
||
simpleTimeout:
|
||
timeout: 4s
|
||
EOF
|
||
</code></pre><p>If you were to make a call to the ingress with the URL <code>http://$INGRESS_HOST/delay/10</code>, you will find that the call returns in 4s instead of the expected 10s delay.</p><p>You can use other features of the route rules such as redirects, rewrites, routing to multiple versions, regular expression based match in HTTP headers, websocket upgrades, timeouts, retries, etc. Please refer to the <a href="/v0.4/docs/reference/config/traffic-rules/routing-rules.html">routing rules</a> for more details.</p><blockquote><p>Note 1: Fault injection does not work at the Ingress</p></blockquote><blockquote><p>Note 2: When matching requests in the routing rule, use the same exact path or prefix as the one used in the Ingress specification.</p></blockquote><h2 id="understanding-ingresses">Understanding ingresses</h2><p>Ingresses provide gateways for external traffic to enter the Istio service mesh and make the traffic management and policy features of Istio available for edge services.</p><p>The servicePort field in the Ingress specification can take a port number (integer) or a name. The port name must follow the Istio port naming conventions (e.g., <code>grpc-*</code>, <code>http2-*</code>, <code>http-*</code>, etc.) in order to function properly. The name used must match the port name in the backend service declaration.</p><p>In the preceding steps we created a service inside the Istio service mesh and showed how to expose both HTTP and HTTPS endpoints of the service to external traffic. We also showed how to control the ingress traffic using an Istio route rule.</p><h2 id="cleanup">Cleanup</h2><ol><li><p>Remove the secret and Ingress Resource definitions.</p><pre><code class="language-bash">kubectl delete ingress simple-ingress secure-ingress
|
||
kubectl delete -n istio-system secret istio-ingress-certs
|
||
</code></pre></li><li><p>Shutdown the <a href="https://github.com/istio/istio/tree/master/samples/httpbin">httpbin</a> service.</p><pre><code class="language-bash">kubectl delete -f samples/httpbin/httpbin.yaml
|
||
</code></pre></li></ol><h2 id="further-reading">Further reading</h2><ul><li><p>Learn more about <a href="https://kubernetes.io/docs/concepts/services-networking/ingress/">Ingress Resources</a>.</p></li><li><p>Learn more about <a href="/v0.4/docs/reference/config/traffic-rules/routing-rules.html">Routing Rules</a>.</p></li></ul></div></div></div></div></div></div><script src="/v0.4/js/sidebar.min.js"></script><footer><div class="container"><div class="row"><div class="col-lg-2 col-md-2 col-sm-2"></div><div class="col-lg-3 col-md-3 col-sm-3 col-xs-12 center-block"><ul><li><a class="header" href="/v0.4/docs/welcome">Docs</a></li><li><a href="/v0.4/docs/concepts">Concepts</a></li><li><a href="/v0.4/docs/setup">Setup</a></li><li><a href="/v0.4/docs/tasks">Tasks</a></li><li><a href="/v0.4/docs/guides">Guides</a></li><li><a href="/v0.4/docs/reference">Reference</a></li></ul></div><div class="col-lg-3 col-md-3 col-sm-3 col-xs-12 center-block"><ul><li><a class="header" href="/v0.4/help">Help</a></li><li><a href="/v0.4/faq">FAQ</a></li><li><a href="/v0.4/glossary">Glossary</a></li><li><a href="/v0.4/troubleshooting">Troubleshooting</a></li><li><a href="/v0.4/bugs">Report Bugs</a></li><li><a href="https://github.com/istio/istio.github.io/issues/new?title=Issue with _docs/tasks/traffic-management/ingress.md">Doc Bugs & Gaps</a></li><li><a href="https://github.com/istio/istio.github.io/edit/master/_docs/tasks/traffic-management/ingress.md">Edit This Page</a></li></ul></div><div class="col-lg-3 col-md-3 col-sm-3 col-xs-12 center-block"><ul><li> <a class="header" href="/v0.4/community">Community</a></li><li> <a href="https://groups.google.com/forum/#!forum/istio-users" target="_blank" rel="noopener">User</a> | <a href="https://groups.google.com/forum/#!forum/istio-dev" target="_blank" rel="noopener">Dev Mailing Lists</a></li><li><a href="https://twitter.com/IstioMesh" target="_blank" rel="noopener">Twitter</a></li><li><a href="https://stackoverflow.com/questions/tagged/istio" target="_blank" rel="noopener">Stack Overflow</a></li><li><a href="https://github.com/istio/community" target="_blank" rel="noopener">GitHub</a></li><li><a href="https://github.com/istio/community/blob/master/WORKING-GROUPS.md" target="_blank" rel="noopener">Working Groups</a></li></ul></div><div class="col-lg-1 col-md-1 col-sm-1"></div></div><div class="row"><p class="description small text-center"> Istio 0.4, Copyright © 2017 Istio Authors<br> Archived on 20-Dec-2017</p></div></div></footer><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.15.0/jquery.validate.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.form/4.2.1/jquery.form.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-visible/1.2.0/jquery.visible.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <script src="/v0.4/js/common.min.js"></script> <script src="/v0.4/js/search.js"></script> <script src="/v0.4/js/prism.min.js"></script></body></html>
|