istio.io/archive/v0.4/docs/setup/kubernetes/sidecar-injection.html

83 lines
28 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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="Installing Istio Sidecar"><meta name="og:title" content="Installing Istio Sidecar"><meta name="og:image" content="/v0.4/img/logo.png"/><meta name="theme-color" content="#466BB0"/><meta name="description" content="Instructions for installing the Istio sidecar in application pods automatically using the Istio initializer or manually using istioctl CLI."><meta name="og:description" content="Instructions for installing the Istio sidecar in application pods automatically using the Istio initializer or manually using istioctl CLI."><title>Istioldie 0.4 / Installing Istio Sidecar</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" class='active'><a href="/v0.4/docs/setup/">Setup</a></li><li role="presentation" ><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'>Setup</h5></li><script type="text/javascript"> var docs = []; docs.push({path: [ "cloudfoundry", "index.md", ], url: "/docs/setup/cloudfoundry/", title: "Cloud Foundry", order: 40, overview: "Instructions for installing the Istio control plane in Cloud Foundry."}); docs.push({path: [ "cloudfoundry", "install.md", ], url: "/docs/setup/cloudfoundry/install.html", title: "Installation", order: 10, overview: "Instructions for installing the Istio control plane in Cloud Foundry."}); docs.push({path: [ "consul", "index.md", ], url: "/docs/setup/consul/", title: "Nomad & Consul", order: 20, overview: "Instructions for installing the Istio control plane in a Consul based environment, with or without Nomad."}); docs.push({path: [ "consul", "install.md", ], url: "/docs/setup/consul/install.html", title: "Installation", order: 30, overview: "Instructions for installing the Istio control plane in a Consul based environment, with or without Nomad."}); docs.push({path: [ "consul", "quick-start.md", ], url: "/docs/setup/consul/quick-start.html", title: "Quick Start on Docker", order: 10, overview: "Quick Start instructions to setup the Istio service mesh with Docker Compose."}); docs.push({path: [ "eureka", "index.md", ], url: "/docs/setup/eureka/", title: "Eureka", order: 30, overview: "Instructions for installing the Istio control plane in a Eureka based environment."}); docs.push({path: [ "eureka", "install.md", ], url: "/docs/setup/eureka/install.html", title: "Installation", order: 30, overview: "Instructions for installing the Istio control plane in an Eureka based environment."}); docs.push({path: [ "eureka", "quick-start.md", ], url: "/docs/setup/eureka/quick-start.html", title: "Quick Start on Docker", order: 10, overview: "Quick Start instructions to setup the Istio service mesh with Docker Compose."}); docs.push({path: [ "index.md", ], url: "/docs/setup/", title: "Setup", order: 15, overview: "Setup contains instructions for installing the Istio control plane in various environments (e.g., Kubernetes, Consul, etc.), as well as instructions for installing the sidecar in the application deployment."}); docs.push({path: [ "kubernetes", "index.md", ], url: "/docs/setup/kubernetes/", title: "Kubernetes", order: 10, overview: "Instructions for installing the Istio control plane on Kubernetes and adding VMs into the mesh."}); docs.push({path: [ "kubernetes", "mesh-expansion.md", ], url: "/docs/setup/kubernetes/mesh-expansion.html", title: "Istio Mesh Expansion", order: 60, overview: "Instructions for integrating VMs and bare metal hosts into an Istio mesh deployed on Kubernetes."}); docs.push({path: [ "kubernetes", "quick-start-gke-dm.md", ], url: "/docs/setup/kubernetes/quick-start-gke-dm.html", title: "Quick Start with Google Kubernetes Engine", order: 11, overview: "Quick Start instructions to setup the Istio service using Google Kubernetes Engine (GKE)"}); docs.push({path: [ "kubernetes", "quick-start.md", ], url: "/docs/setup/kubernetes/quick-start.html", title: "Quick Start", order: 10, overview: "Quick Start instructions to setup the Istio service mesh in a Kubernetes cluster."}); docs.push({path: [ "kubernetes", "sidecar-injection.md", ], url: "/docs/setup/kubernetes/sidecar-injection.html", title: "Installing Istio Sidecar", order: 50, overview: "Instructions for installing the Istio sidecar in application pods automatically using the Istio initializer or manually using istioctl CLI."}); docs.push({path: [ "mesos", "index.md", ], url: "/docs/setup/mesos/", title: "Mesos", order: 50, overview: "Instructions for installing the Istio control plane in Apache Mesos."}); docs.push({path: [ "mesos", "install.md", ], url: "/docs/setup/mesos/install.html", title: "Installation", order: 10, overview: "Instructions for installing the Istio control plane in Apache Mesos."}); 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>Installing Istio Sidecar</h1><h2 id="pod-spec-requirements">Pod Spec Requirements</h2><p>In order to be a part of the service mesh, each pod in the kubernetes cluster must satisfy the following requirements:</p><ol><li><p><em><strong>Service association</strong>:</em> The pod must belong to a <em>single</em> <a href="https://kubernetes.io/docs/concepts/services-networking/service/">Kubernetes Service</a> (pods that belong to multiple services are not supported as of now).</p></li><li><p><em><strong>Named ports</strong>:</em> Service ports must be named. The port names must be of the form <code>&lt;protocol&gt;[-&lt;suffix&gt;]</code> with <em>http</em>, <em>http2</em>, <em>grpc</em>, <em>mongo</em>, or <em>redis</em> as the <code>&lt;protocol&gt;</code> in order to take advantage of Istios routing features. For example, <code>name: http2-foo</code> or <code>name: http</code> are valid port names, but <code>name: http2foo</code> is not. If the port name does not begin with a recognized prefix or if the port is unnamed, traffic on the port will be treated as plain TCP traffic (unless the port explicitly uses <code>Protocol: UDP</code> to signify a UDP port).</p></li><li><p><em><strong>Deployments with app label</strong>:</em> It is recommended that Pods deployed using the Kubernetes <code>Deployment</code> have an explicit <code>app</code> label in the Deployment specification. Each deployment specification should have a distinct <code>app</code> label with a value indicating something meaningful. The <code>app</code> label is used to add contextual information in distributed tracing.</p></li><li><p><em><strong>Sidecar in every pod in mesh</strong>:</em> Finally, each pod in the mesh must be running an Istio compatible sidecar. The following sections describe two ways of injecting the Istio sidecar into a pod: manually using <code>istioctl</code> CLI tool or automatically using the Istio Initializer. Note that the sidecar is not involved in traffic between containers in the same pod.</p></li></ol><h2 id="manual-sidecar-injection">Manual sidecar injection</h2><p>The <code>istioctl</code> CLI has a convenience utility called <a href="/v0.4/docs/reference/commands/istioctl.html#istioctl-kube-inject">kube-inject</a> that can be used to add the Istio sidecar specification into kubernetes workload specifications. Unlike the Initializers, <code>kube-inject</code> merely transforms the YAML specification to include the Istio sidecar. You are responsible for deploying the modified YAMLs using standard tools like <code>kubectl</code>. For example, the following command adds the sidecars into pods specified in sleep.yaml and submits the modified specification to Kubernetes:</p><pre><code class="language-bash">kubectl apply -f &lt;(istioctl kube-inject -f samples/sleep/sleep.yaml)
</code></pre><h3 id="example">Example</h3><p>Let us try to inject the Istio sidecar into a simple sleep service.</p><pre><code class="language-bash">kubectl apply -f &lt;(istioctl kube-inject -f samples/sleep/sleep.yaml)
</code></pre><p>Kube-inject subcommand adds the Istio sidecar and the init container to the deployment specification as shown in the transformed output below:</p><pre><code class="language-yaml">... trimmed ...
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
annotations:
sidecar.istio.io/status: injected-version-root@69916ebba0fc-0.2.6-081ffece00c82cb9de33cd5617682999aee5298d
name: sleep
spec:
replicas: 1
template:
metadata:
annotations:
sidecar.istio.io/status: injected-version-root@69916ebba0fc-0.2.6-081ffece00c82cb9de33cd5617682999aee5298d
labels:
app: sleep
spec:
containers:
- name: sleep
image: tutum/curl
command: ["/bin/sleep","infinity"]
imagePullPolicy: IfNotPresent
- name: istio-proxy
image: docker.io/istio/proxy_debug:0.2.6
args:
... trimmed ...
initContainers:
- name: istio-init
image: docker.io/istio/proxy_init:0.2.6
imagePullPolicy: IfNotPresent
args:
... trimmed ...
---
</code></pre><p>The crux of sidecar injection lies in the <code>initContainers</code> and the istio-proxy container. The output above has been trimmed for brevity.</p><p>Verify that sleeps deployment contains the sidecar. The injected version corresponds to the image TAG of the injected sidecar image. It may be different in your setup.</p><pre><code class="language-bash">echo $(kubectl get deployment sleep -o jsonpath='{.metadata.annotations.sidecar\.istio\.io\/status}')
</code></pre><pre><code class="language-bash">injected-version-9c7c291eab0a522f8033decd0f5b031f5ed0e126
</code></pre><p>You can view the full deployment with injected containers and volumes.</p><pre><code class="language-bash">kubectl get deployment sleep -o yaml
</code></pre><h2 id="automatic-sidecar-injection">Automatic sidecar injection</h2><p>Istio sidecars can be automatically injected into a Pod before deployment using an alpha feature in Kubernetes called <a href="https://kubernetes.io/docs/admin/extensible-admission-controllers/#what-are-initializers">Initializers</a>.</p><blockquote><p>Note: Kubernetes InitializerConfiguration is not namespaced and applies to workloads across the entire cluster. Do <em>not</em> enable this feature in shared testing environments.</p></blockquote><h3 id="prerequisites">Prerequisites</h3><p>Initializers need to be explicitly enabled during cluster setup as outlined <a href="https://kubernetes.io/docs/admin/extensible-admission-controllers/#enable-initializers-alpha-feature">here</a>. Assuming RBAC is enabled in the cluster, you can enable the initializers in different environments as follows:</p><ul><li><p><em>GKE</em></p><pre><code class="language-bash">gcloud container clusters create NAME \
--enable-kubernetes-alpha \
--machine-type=n1-standard-2 \
--num-nodes=4 \
--no-enable-legacy-authorization \
--zone=ZONE
</code></pre></li><li><p><em>IBM Cloud Container Service</em> kubernetes clusters with v1.7.4 or newer versions have initializers enabled by default.</p></li><li><p><em>Minikube</em></p><p>Minikube version v0.22.1 or later is required for proper certificate configuration for the GenericAdmissionWebhook feature. Get the latest version from https://github.com/kubernetes/minikube/releases.</p><pre><code class="language-bash">minikube start \
--extra-config=apiserver.Admission.PluginNames="Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,GenericAdmissionWebhook,ResourceQuota" \
--kubernetes-version=v1.7.5
</code></pre></li></ul><h3 id="setup">Setup</h3><p>You can now setup the Istio Initializer from the Istio install root directory.</p><pre><code class="language-bash">kubectl apply -f install/kubernetes/istio-initializer.yaml
</code></pre><p>This creates the following resources:</p><ol><li><p>The <code>istio-sidecar</code> InitializerConfiguration resource that specifies resources where Istio sidecar should be injected. By default the Istio sidecar will be injected into <code>deployments</code>, <code>statefulsets</code>, <code>jobs</code>, and <code>daemonsets</code>.</p></li><li><p>The <code>istio-inject</code> ConfigMap with the default injection policy for the initializer, a set of namespaces to initialize, and template parameters to use during the injection itself. These options are explained in more detail under <a href="#configuration-options">configuration options</a>.</p></li><li><p>The <code>istio-initializer</code> Deployment that runs the initializer controller.</p></li><li><p>The <code>istio-initializer-service-account</code> ServiceAccount that is used by the <code>istio-initializer</code> deployment. The <code>ClusterRole</code> and <code>ClusterRoleBinding</code> are defined in <code>install/kubernetes/istio.yaml</code>. Note that <code>initialize</code> and <code>patch</code> are required on <em>all</em> resource types. It is for this reason that the initializer is run as its own deployment and not embedded in another controller, e.g. istio-pilot.</p></li></ol><h3 id="verification">Verification</h3><p>In order to test whether sidecar injection is working, let us take the sleep service described above. Create the deployments and services.</p><pre><code class="language-bash">kubectl apply -f samples/sleep/sleep.yaml
</code></pre><p>You can verify that sleeps deployment contains the sidecar. The injected version corresponds to the image TAG of the injected sidecar image. It may be different in your setup.</p><pre><code class="language-bash">$ echo $(kubectl get deployment sleep -o jsonpath='{.metadata.annotations.sidecar\.istio\.io\/status}')
</code></pre><pre><code class="language-bash">injected-version-9c7c291eab0a522f8033decd0f5b031f5ed0e126
</code></pre><p>You can view the full deployment with injected containers and volumes.</p><pre><code class="language-bash">kubectl get deployment sleep -o yaml
</code></pre><h3 id="understanding-what-happened">Understanding what happened</h3><p>Heres what happened after the workload was submitted to Kubernetes:</p><p>1) kubernetes adds <code>sidecar.initializer.istio.io</code> to the list of pending initializers in the workload.</p><p>2) istio-initializer controller observes a new uninitialized workload was created. It finds its configured name <code>sidecar.initializer.istio.io</code> as the first in the list of pending initializers.</p><p>3) istio-initializer checks to see if it was responsible for initializing workloads in the namespace of the workload. No further work is done and the initializer ignores the workload if the initializer is not configured for the namespace. By default the initializer is responsible for all namespaces (see <a href="#configuration-options">configuration options</a>).</p><p>4) istio-initializer removes itself from the list of pending initializers. Kubernetes will not finish creating workloads if the list of pending initializers is non-empty. A misconfigured initializer means a broken cluster.</p><p>5) istio-initializer checks the default injection policy for the mesh <em>and</em> any possible per-workload overrides to determine whether the sidecar should be injected.</p><p>6) istio-initializer injects the sidecar template into the workload and submits it back to kubernetes via PATCH.</p><p>7) kubernetes finishes creating the workload as normal and the workload includes the injected sidecar.</p><h3 id="configuration-options">Configuration options</h3><p>The istio-initializer has a global default policy for injection as well as per-workload overrides. The global policy is configured by the <code>istio-inject</code> ConfigMap (see example below). The initializer pod must be restarted to adopt new configuration changes.</p><pre><code class="language-yaml">apiVersion: v1
kind: ConfigMap
metadata:
name: istio-inject
namespace: istio-system
data:
config: |-
policy: "enabled"
namespaces: [""] # everything, aka v1.NamepsaceAll, aka cluster-wide
# excludeNamespaces: ["ns1", "ns2"]
initializerName: "sidecar.initializer.istio.io"
params:
initImage: docker.io/istio/proxy_init:0.2.6
proxyImage: docker.io/istio/proxy:0.2.6
verbosity: 2
version: 0.2.6
meshConfigMapName: istio
imagePullPolicy: IfNotPresent
</code></pre><p>The following are key parameters in the configuration:</p><ol><li><em><strong>policy</strong></em></li></ol><p><code>off</code> - Disable the initializer from modifying resources. The pending <code>sidecar.initializer.istio.io</code> initializer is still removed to avoid blocking creation of resources.</p><p><code>disabled</code> - The initializer will not inject the sidecar into resources by default for the namespace(s) being watched. Resources can enable injection using the <code>sidecar.istio.io/inject</code> annotation with value of <code>true</code>.</p><p><code>enabled</code> - The initializer will inject the sidecar into resources by default for the namespace(s) being watched. Resources can disable injection using the <code>sidecar.istio.io/inject</code> annotation with value of <code>false</code>.</p><ol><li><em><strong>namespaces</strong></em></li></ol><p>This is a list of namespaces to watch and initialize. The special <code>""</code> namespace corresponds to <code>v1.NamespaceAll</code> and configures the initializer to initialize all namespaces. kube-system, kube-public, and istio-system are exempt from initialization.</p><ol><li><em><strong>excludeNamespaces</strong></em></li></ol><p>This is a list of namespaces to be excluded from istio initializer. It cannot be definend as <code>v1.NamespaceAll</code> or defined together with <code>namespaces</code>.</p><ol><li><em><strong>initializerName</strong></em></li></ol><p>This must match the name of the initializer in the InitializerConfiguration. The initializer only processes workloads that match its configured name.</p><ol><li><em><strong>params</strong></em></li></ol><p>These parameters allow you to make limited changes to the injected sidecar. Changing these values will not affect already deployed workloads.</p><h3 id="overriding-automatic-injection">Overriding automatic injection</h3><p>Individual workloads can override the global policy using the <code>sidecar.istio.io/inject</code> annotation. The global policy applies if the annotation is omitted.</p><p>If the value of the annotation is <code>true</code>, sidecar will be injected regardless of the global policy.</p><p>If the value of the annotation is <code>false</code>, sidecar will <em>not</em> be injected regardless of the global policy.</p><p>The following truth table shows the combinations of global policy and per-workload overrides.</p><table><thead><tr><th>policy</th><th>workload annotation</th><th>injected</th></tr></thead><tbody><tr><td>off</td><td>N/A</td><td>no</td></tr><tr><td>disabled</td><td>omitted</td><td>no</td></tr><tr><td>disabled</td><td>false</td><td>no</td></tr><tr><td>disabled</td><td>true</td><td>yes</td></tr><tr><td>enabled</td><td>omitted</td><td>yes</td></tr><tr><td>enabled</td><td>false</td><td>no</td></tr><tr><td>enabled</td><td>true</td><td>yes</td></tr></tbody></table><p>For example, the following deployment will have sidecars injected, even if the global policy is <code>disabled</code>.</p><pre><code class="language-yaml">apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: myapp
annotations:
sidecar.istio.io/inject: "true"
spec:
replicas: 1
template:
...
</code></pre><p>This is a good way to use auto-injection in a cluster containing a mixture of Istio and non-Istio services.</p><h3 id="uninstalling-initializer">Uninstalling Initializer</h3><p>To remove the Istio initializer, run the following command:</p><pre><code class="language-bash">kubectl delete -f install/kubernetes/istio-initializer.yaml
</code></pre><p>Note that the above command will not remove the injected sidecars from Pods. To remove the sidecars, the pods must be redeployed without the initializer.</p></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/setup/kubernetes/sidecar-injection.md">Doc Bugs & Gaps</a></li><li><a href="https://github.com/istio/istio.github.io/edit/master/_docs/setup/kubernetes/sidecar-injection.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 &copy; 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>