2021-04-16 19:50:02 +00:00
|
|
|
---
|
|
|
|
layout: docs
|
|
|
|
page_title: Connect - Transparent Proxy
|
|
|
|
sidebar_title: Transparent Proxy <sup>Beta</sup>
|
|
|
|
description: |-
|
|
|
|
Transparent proxy is used to direct inbound and outbound traffic to services via the Envoy proxy and configure
|
|
|
|
upstreams via intentions.
|
|
|
|
---
|
|
|
|
|
|
|
|
# Transparent Proxy <sup>Beta</sup>
|
|
|
|
|
|
|
|
Transparent proxy allows users to reach other services in the service mesh while ensuring that inbound and outbound
|
|
|
|
traffic for services in the mesh are directed through the sidecar proxy. This makes it more likely that traffic is secure
|
|
|
|
and only reaches intended destinations since the proxy can enforce security and policy like TLS and Service Intentions.
|
|
|
|
|
|
|
|
Previously, service mesh users would need to explicitly define upstreams for a service as a local listener on the sidecar
|
|
|
|
proxy, and dial the local listener to reach the appropriate upstream. Users would also have to set intentions to allow
|
|
|
|
specific services to talk to one another. Transparent proxying reduces this duplication, by determining upstreams
|
|
|
|
implicitly from Service Intentions. Explicit upstreams are still supported in the [proxy service
|
|
|
|
registration](/docs/connect/registration/service-registration) on VMs and via the
|
|
|
|
[annotation](/docs/k8s/connect#consul-hashicorp-com-connect-service-upstreams) in Kubernetes.
|
|
|
|
|
|
|
|
To support transparent proxying, Consul now supports a command
|
|
|
|
[`consul connect redirect-traffic`](/commands/connect/redirect-traffic) to redirect traffic through an inbound and
|
|
|
|
outbound listener on the sidecar. It also watches Service Intentions and configures the Envoy proxy with the appropriate
|
|
|
|
upstream IPs. If the default ACL policy is "allow", then Service Intentions are not required. In Consul on Kubernetes,
|
|
|
|
the traffic redirection command is automatically set up via an init container.
|
|
|
|
|
|
|
|
## Prerequisites
|
|
|
|
|
|
|
|
### Kubernetes
|
|
|
|
|
|
|
|
* To use transparent proxy on Kubernetes, Consul-helm >= `0.32.0` and Consul-k8s >= `0.26.0` are required in addition to
|
2021-05-03 20:15:22 +00:00
|
|
|
the Consul >= `1.10.0`.
|
2021-04-16 19:50:02 +00:00
|
|
|
* If the default policy for ACLs is "deny", then Service Intentions should be set up to allow intended services to connect to each other.
|
|
|
|
Otherwise, all Connect services can talk to all other services.
|
|
|
|
|
|
|
|
The Kubernetes integration takes care of registering Kubernetes services with Consul, injecting a sidecar proxy, and
|
|
|
|
enabling traffic redirection.
|
|
|
|
|
|
|
|
|
|
|
|
## Configuration
|
|
|
|
|
|
|
|
Transparent proxy can be enabled in Kubernetes on the whole cluster via the Helm value:
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
connectInject:
|
|
|
|
transparentProxy:
|
|
|
|
defaultEnabled: true
|
|
|
|
```
|
|
|
|
|
|
|
|
It can also be enabled on a per service basis via the annotation `consul.hashicorp.com/transparent-proxy=true` on the
|
|
|
|
Pod for each service:
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
apiVersion: v1
|
|
|
|
kind: Service
|
|
|
|
metadata:
|
|
|
|
name: static-server
|
|
|
|
spec:
|
|
|
|
selector:
|
|
|
|
app: static-server
|
|
|
|
ports:
|
|
|
|
- protocol: TCP
|
|
|
|
port: 80
|
|
|
|
targetPort: 8080
|
|
|
|
---
|
|
|
|
apiVersion: v1
|
|
|
|
kind: ServiceAccount
|
|
|
|
metadata:
|
|
|
|
name: static-server
|
|
|
|
---
|
|
|
|
apiVersion: apps/v1
|
|
|
|
kind: Deployment
|
|
|
|
metadata:
|
|
|
|
name: static-server
|
|
|
|
spec:
|
|
|
|
replicas: 1
|
|
|
|
selector:
|
|
|
|
matchLabels:
|
|
|
|
app: static-server
|
|
|
|
template:
|
|
|
|
metadata:
|
|
|
|
name: static-server
|
|
|
|
labels:
|
|
|
|
app: static-server
|
|
|
|
annotations:
|
|
|
|
'consul.hashicorp.com/connect-inject': 'true'
|
|
|
|
'consul.hashicorp.com/transparent-proxy': 'true'
|
|
|
|
spec:
|
|
|
|
containers:
|
|
|
|
- name: static-server
|
|
|
|
image: hashicorp/http-echo:latest
|
|
|
|
args:
|
|
|
|
- -text="hello world"
|
|
|
|
- -listen=:8080
|
|
|
|
ports:
|
|
|
|
- containerPort: 8080
|
|
|
|
name: http
|
|
|
|
serviceAccountName: static-server
|
|
|
|
```
|
|
|
|
|
2021-05-03 20:15:22 +00:00
|
|
|
## Known Beta Limitations
|
2021-04-16 19:50:02 +00:00
|
|
|
|
2021-05-03 20:15:22 +00:00
|
|
|
* There is no first class support for transparent proxying on VMs.
|
|
|
|
* Traffic can only be transparently proxied within a Consul datacenter.
|
2021-04-16 19:50:02 +00:00
|
|
|
|
|
|
|
## Using Transparent Proxy
|
|
|
|
|
|
|
|
In Kubernetes, services can reach other services via their
|
|
|
|
[KubeDNS](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/) address or via Pod IPs, and that
|
|
|
|
traffic will be transparently sent through the proxy. Connect services in Kubernetes are required to have a Kubernetes
|
|
|
|
service selecting the Pods.
|
|
|
|
|
|
|
|
~> Note: In order to use KubeDNS, the Kubernetes service name will need to match the Consul service name. This will be the
|
|
|
|
case by default, unless the service Pods have the annotation `consul.hashicorp.com/connect-service` overriding the
|
|
|
|
Consul service name.
|
|
|
|
|
|
|
|
Transparent proxy is enabled by default in Consul-helm >=`0.32.0`. The Helm value used to enable/disable transparent
|
|
|
|
proxy for all applications in a Kubernetes cluster is `connectInject.transparentProxy.defaultEnabled`.
|
|
|
|
|
|
|
|
Each Pod for the service will be configured with iptables rules to direct all inbound and outbound traffic through an
|
|
|
|
inbound and outbound listener on the sidecar proxy. The proxy will be configured to know how to route traffic to the
|
|
|
|
appropriate upstream services based on [Service
|
|
|
|
Intentions](/docs/connect/config-entries/service-intentions). This means Connect services no longer
|
|
|
|
need to use the `consul.hashicorp.com/connect-service-upstreams` annotation to configure upstreams explicitly. Once the
|
|
|
|
Service Intentions are set, they can simply address the upstream services using KubeDNS.
|
|
|
|
|
|
|
|
As of Consul-k8s >= `0.26.0` and Consul-helm >= `0.32.0`, a Kubernetes service that selects application pods is required
|
|
|
|
for Connect applications, i.e:
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
apiVersion: v1
|
|
|
|
kind: Service
|
|
|
|
metadata:
|
|
|
|
name: sample-app
|
|
|
|
namespace: default
|
|
|
|
spec:
|
|
|
|
selector:
|
|
|
|
app: sample-app
|
|
|
|
ports:
|
|
|
|
- protocol: TCP
|
|
|
|
port: 80
|
|
|
|
```
|
|
|
|
|
|
|
|
In the example above, if another service wants to reach `sample-app` via transparent proxying,
|
|
|
|
it can dial `sample-app.default.svc.cluster.local`, using
|
|
|
|
[KubeDNS](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/).
|
|
|
|
If ACLs with default "deny" policy are enabled, it also needs a
|
|
|
|
[ServiceIntention](/docs/connect/config-entries/service-intentions) allowing it to talk to
|
|
|
|
`sample-app`.
|