From f522249e6be2cd5a2f0cc611d6026d0818667d77 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 5 Jun 2018 22:42:59 -0700 Subject: [PATCH] website: connect native overview --- .../assets/images/connect-native-overview.png | Bin 0 -> 45826 bytes website/source/docs/connect/native.html.md | 119 +++++++++++++++++- website/source/layouts/docs.erb | 5 + 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 website/source/assets/images/connect-native-overview.png diff --git a/website/source/assets/images/connect-native-overview.png b/website/source/assets/images/connect-native-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c016b5221c388ca1ff65a8adc039c72525961d GIT binary patch literal 45826 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

Hq)$ literal 0 HcmV?d00001 diff --git a/website/source/docs/connect/native.html.md b/website/source/docs/connect/native.html.md index 4f31271c37..2d65ecd464 100644 --- a/website/source/docs/connect/native.html.md +++ b/website/source/docs/connect/native.html.md @@ -8,4 +8,121 @@ description: |- # Connect-Native App Integration -TODO +Applications can natively integrate with the Connect API to support +accepting and establishing connections to other Connect services without +the overhead of a [proxy sidecar](/docs/connect/proxies.html). This page +will cover the high-level overview of integration, registering the service, +etc. For language-specific examples, see the sidebar navigation to the left. + +Connect is just basic mutual TLS. This means that almost any application +can easily integrate with Connect. There is no custom protocol in use; +any language that supports TLS can accept and establish Connect-based +connections. + +## Overview + +The primary work involved in natively integrating with Connect is +[acquiring the proper TLS certificate](/api/agent/connect.html#service-leaf-certificate), +[verifying TLS certificates](/api/agent/connect.html#certificate-authority-ca-roots), +and [authorizing inbound connections](/api/agent/connect.html#authorize). +All of this is done using Consul's HTTP API using the previously-linked APIs. + +An overview of the sequence is shown below. The diagram and the following +details may seem complex, but this is a _regular mutual TLS connection_ with +an API call to verify the incoming client certificate. + +

+![Native Integration Overview](connect-native-overview.png) +
+ +Details on the steps are below: + + * **Service discovery** - This is normal service discovery using Consul, + a static IP, or any other mechanism. If you're using Consul DNS, the + [`.connect`](/docs/agent/dns.html#connect-capable-service-lookups) + syntax to find Connect-capable endpoints for a service. After service + discovery, choose one address from the list of **service addresses**. + + * **Mutual TLS** - As a client, connect to the discovered service address + over normal TLS. As part of the TLS connection, provide the + [service certificate](/api/agent/connect.html#service-leaf-certificate) + as the client certificate. Verify the remote certificate against the + [public CA roots](/api/agent/connect.html#certificate-authority-ca-roots). + As a client, if the connection is established then you've established + a Connect-based connection and there are no further steps! + + * **Authorization** - As a server accepting connections, verify the client + certificate against the + [public CA roots](/api/agent/connect.html#certificate-authority-ca-roots). + After verifying the certificate, parse some basic fields from it and call + the [authorizing API](/api/agent/connect.html#authorize) against the local + agent. If this returns successfully, complete the TLS handshake and establish + the connection. If authorization fails, close the connection. + +-> **A note on performance:** The only API call in the connection path is +the [authorization API](/api/agent/connect.html#authorize). The other API +calls to acquire the leaf certificate and CA roots are expected to be done +out of band and reused. The authorize API call should be called against the +local Consul agent. The agent uses locally cached +data to authorize the connection and typically responds in microseconds. +Therefore, the impact to the TLS handshake is typically microseconds. + +## Updating Certificates and Certificate Roots + +The leaf certificate and CA roots can be updated at any time and the +natively integrated application must react to this relatively quickly +so that new connections are not disrupted. This can be done through +Consul blocking queries (HTTP long polling) or through periodic polling. + +The API calls for +[acquiring a leaf TLS certificate](/api/agent/connect.html#service-leaf-certificate) +and [reading CA roots](/api/agent/connect.html#certificate-authority-ca-roots) +both support +[blocking queries](/api/index.html#blocking-queries). By using blocking +queries, an application can efficiently wait for an updated value. For example, +the leaf certificate API will block until the certificate is near expiration +or the signing certificates have changed and will issue and return a new +certificate. + +In some languages, using blocking queries may not be simple. In that case, +we still recommend using the blocking query parameters but with a very short +`timeout` value set. Doing this is documented with +[blocking queries](/api/index.html#blocking-queries). The low timeout will +ensure the API responds quickly. We recommend that applications poll the +certificate endpoints frequently, such as multiple times per minute. + +The overhead for the blocking queries (long or periodic polling) is minimal. +The API calls are to the local agent and the local agent uses locally +cached data multiplexed over a single TCP connection to the Consul leader. +Even if a single machine has 1,000 Connect-enabled services all blocking +on certificate updates, this translates to only one TCP connection to the +Consul server. + +Some language libraries such as the +[Go library](/docs/connect/native/go.html) automatically handle updating +and locally caching the certificates. + +## Service Registration + +Connect-native applications must tell Consul that they support Connect +natively. This enables the service to be returned as part of service +discovery for Connect-capable services, used by other Connect-native applications +and client [proxies](/docs/connect/proxies.html). + +This can be specified directly in the [service definition](/docs/agent/services.html): + +```json +{ + "service": { + "name": "redis", + "port": 8000, + "connect": { + "native": true + } + } +} +``` + +Services that support Connect natively are still returned through the standard +service discovery mechanisms in addition to the Connect-only service discovery +mechanisms. diff --git a/website/source/layouts/docs.erb b/website/source/layouts/docs.erb index 04cc16714b..769bcfb4bc 100644 --- a/website/source/layouts/docs.erb +++ b/website/source/layouts/docs.erb @@ -270,6 +270,11 @@ > Native App Integration + > Develop and Debug