HTTP proxy integration
Virtually all HTTP clients support making calls through an intermediate proxy. Traditionally, this was used to operate in firewalled environments where connections to the external world were restricted. However, since Linkerd functions as an HTTP proxy, and since using a proxy can often be accomplished without code changes, this approach also offers an easy integration path for applications that use HTTP.
Linkerd as an HTTP proxy
Linkerd can act as an HTTP proxy without any additional configuration, providing key features such as load balancing, service discovery and dynamic request routing at no extra cost. By default Linkerd routes HTTP requests based on the HTTP host that is sent as part of the request. For example, suppose that Linkerd is running locally on port 4140, and that it has been configured to route requests to instances of the “hello” service running elsewhere. In that scenario, you could take advantage of Linkerd’s proxy integration and make a curl request to the “hello” service with:
http_proxy=localhost:4140 curl http://hello/
With the http_proxy
variable set, curl will send the proxy request directly to
Linkerd, without actually looking up “hello” in DNS. Linkerd will in turn look
up the “hello” service in whichever backend it is configured to use for service
discovery, and it will route the request accordingly.
Using an HTTP proxy
Configuring your application to use an HTTP proxy can often be done without code changes. However, the specifics of this configuration are language-dependent. Here are some examples for common setups:
C, Go, Python, Ruby, Perl, PHP, curl, wget, Node.js’ request package: these languages and utilities support an
http_proxy
environment variable, which sets a global HTTP proxy across all requests. Simply set the variable and you’re good to go.Java, Scala, Clojure, and JVM languages: the JVM can be configured to use an HTTP proxy by setting the
http.proxyHost
andhttp.proxyPort
environment variables, (e.g.java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=4140 ...
).Node.js. For Node, there is no convenient code-free approach to using a global proxy. Options include the request or global tunnel packages.
Alternatives
In principle, Linkerd can route on any component of the request, from incoming
port to payload content. In practice, for HTTP calls, it is most natural to
route on the host (using the default methodAndHost
identifier) or on the URL path (using the
path
identifier).
If a global HTTP proxy approach is not possible, any mechanism that allows
setting the host or URL path while connecting to Linkerd will also work. For
example, proxy settings can often be configured directly in the HTTP client on
a per-request basis. Alternatively, connecting directly to Linkerd and setting
an explicit Host:
header as part of the request will allow Linkerd to route
on that host just as the proxy approach would.
Another alternative if you are running on Kubernetes is using transparent proxying via iptables rules.