github.com/outbrain/consul@v1.4.5/website/source/docs/connect/proxies/sidecar-service.md (about) 1 --- 2 layout: "docs" 3 page_title: "Connect - Sidecar Service Registration" 4 sidebar_current: "docs-connect-proxies-sidecar-service" 5 description: |- 6 Sidecar service registrations provide a convenient shorthand for registering a 7 sidecar proxy inline with a regular service definition. 8 --- 9 10 # Sidecar Service Registration 11 12 Connect proxies are typically deployed as "sidecars" that run on the same node 13 as the single service instance that they handle traffic for. They might be on 14 the same VM or running as a separate container in the same network namespace. 15 16 To simplify the configuration experience when deploying a sidecar for a service 17 instance, Consul 1.3 introduced a new field in the Connect block of the [service 18 definition](/docs/agent/services.html). 19 20 The `connect.sidecar_service` field is a complete nested service definition on 21 which almost any regular service definition field can be set. The exceptions are 22 [noted below](#limitations). If used, the service definition is treated 23 identically to another top-level service definition. The value of the nested 24 definition is that _all fields are optional_ with some opinionated defaults 25 applied that make setting up a sidecar proxy much simpler. 26 27 ## Minimal Example 28 29 To register a service instance with a sidecar, all that's needed is: 30 31 ```json 32 { 33 "name": "web", 34 "port": 8080, 35 "connect": { "sidecar_service": {} } 36 } 37 ``` 38 39 This will register the `web` service as normal, but will also register another 40 [proxy service](/docs/connect/proxies.html) with defaults values used. 41 42 The above expands out to be equivalent to the following explicit service 43 definitions: 44 45 ```json 46 { 47 "name": "web", 48 "port": 8080, 49 } 50 { 51 "name": "web-sidecar-proxy", 52 "port": 20000, 53 "kind": "connect-proxy", 54 "checks": [ 55 { 56 "Name": "Connect Sidecar Listening", 57 "TCP": "127.0.0.1:20000", 58 "Interval": "10s" 59 }, 60 { 61 "name": "Connect Sidecar Aliasing web", 62 "alias_service": "web" 63 } 64 ], 65 "proxy": { 66 "destination_service_name": "web", 67 "destination_service_id": "web", 68 "local_service_address": "127.0.0.1", 69 "local_service_port": 8080, 70 } 71 } 72 ``` 73 74 Details on how the defaults are determined are [documented 75 below](#sidecar-service-defaults). 76 77 -> **Note:** Sidecar service registrations are only a shorthand for registering 78 multiple services. Consul will not start up or manage the actual proxy processes 79 for you. 80 81 ## Overridden Example 82 83 The following example shows a service definition where some fields are 84 overridden to customize the proxy configuration. 85 86 ```json 87 { 88 "name": "web", 89 "port": 8080, 90 "connect": { 91 "sidecar_service": { 92 "proxy": { 93 "upstreams": [ 94 { 95 "destination_name": "db", 96 "local_bind_port": 9191 97 } 98 ], 99 "config": { 100 "handshake_timeout_ms": 1000 101 } 102 } 103 } 104 } 105 } 106 ``` 107 108 This example customizes the [proxy 109 upstreams](/docs/connect/proxies.html#upstream-configuration-reference) 110 and some [built-in proxy 111 configuration](/docs/connect/configuration.html#built-in-proxy-options). 112 113 ## Sidecar Service Defaults 114 115 The following fields are set by default on a sidecar service registration. With 116 [the exceptions noted](#limitations) any field may be overridden explicitly in 117 the `connect.sidecar_service` definition to customize the proxy registration. 118 The "parent" service refers to the service definition that embeds the sidecar 119 proxy. 120 121 - `id` - ID defaults to being `<parent-service-id>-sidecar-proxy`. This can't 122 be overridden as it is used to [manage the lifecycle](#lifecycle) of the 123 registration. 124 - `name` - Defaults to being `<parent-service-name>-sidecar-proxy`. 125 - `tags` - Defaults to the tags of the parent service. 126 - `meta` - Defaults to the service metadata of the parent service. 127 - `port` - Defaults to being auto-assigned from a [configurable 128 range](/docs/agent/options.html#sidecar_min_port) that is 129 by default `[21000, 21255]`. 130 - `kind` - Defaults to `connect-proxy`. This can't be overridden currently. 131 - `check`, `checks` - By default we add a TCP check on the local address and 132 port for the proxy, and a [service alias 133 check](/docs/agent/checks.html#alias) for the parent service. If either 134 `check` or `checks` fields are set, only the provided checks are registered. 135 - `proxy.destination_service_name` - Defaults to the parent service name. 136 - `proxy.destination_service_id` - Defaults to the parent service ID. 137 - `proxy.local_service_address` - Defaults to `127.0.0.1`. 138 - `proxy.local_service_port` - Defaults to the parent service port. 139 140 ## Limitations 141 142 Almost all fields in a [service definition](/docs/agent/services.html) may be 143 set on the `connect.sidecar_service` except for the following: 144 145 - `id` - Sidecar services get an ID assigned and it is an error to override 146 this. This ensures the agent can correctly de-register the sidecar service 147 later when the parent service is removed. 148 - `kind` - Kind defaults to `connect-proxy` and there is currently no way to 149 unset this to make the registration be for a regular non-connect-proxy 150 service. 151 - `connect.sidecar_service` - Service definitions can't be nested recursively. 152 - `connect.proxy` - (Deprecated) [Managed 153 proxies](/docs/connect/proxies/managed-deprecated.html) can't be defined on a 154 sidecar. 155 - `connect.native` - Currently the `kind` is fixed to `connect-proxy` and it's 156 an error to register a `connect-proxy` that is also Connect-native. 157 158 ## Lifecycle 159 160 Sidecar service registration is mostly a configuration syntax helper to avoid 161 adding lots of boiler plate for basic sidecar options, however the agent does 162 have some specific behavior around their lifecycle that makes them easier to 163 work with. 164 165 The agent fixes the ID of the sidecar service to be based on the parent 166 service's ID. This enables the following behavior. 167 168 - A service instance can _only ever have one_ sidecar service registered. 169 - When re-registering via API or reloading from configuration file: 170 - If something changes in the nested sidecar service definition, the change 171 will _update_ the current sidecar registration instead of creating a new 172 one. 173 - If a service registration removes the nested `sidecar_service` then the 174 previously registered sidecar for that service will be deregistered 175 automatically. 176 - When reloading the configuration files, if a service definition changes it's 177 ID, then a new service instance _and_ a new sidecar instance will be 178 registered. The old ones will be removed since they are no longer found in 179 the config files. 180