Post authored by Maria Shaldybin, an Engineer on the Diego Team at VMware.
What is container-to-container networking?
To achieve better flexibility and scalability in today’s world a large number of applications are developed using the microservice architecture. Cloud Foundry provides all the necessary tools for developers to easily deploy and manage their microservices. In a typical architecture each microservice is deployed as a separate application container. For secure communication over an internal network, containers can use container-to-container networking.
In Cloud Foundry application containers cannot talk to each other over an internal network by default. To enable that you can create a network policy that will allow applications to talk to each other.
Setting up container-to-container networking
To enable direct communication from app A to app B you can create a network policy that will allow the traffic from app A to app B.
cf add-network-policy app-A –destination-app app-B –protocol tcp –port 8080
Now your app-A can talk to app-B on port 8080:
cf ssh app-A
To use port 8080, unproxied port mappings must be enabled in your Cloud Foundry deployment. This might pose a security risk since every container exposes an application port and it becomes the responsibility of the application developer to terminate the SSL traffic.
Using platform enabled HTTPS for container-to-container networking
To secure communication between application containers we introduced a special port 61443 that will serve HTTPS for container-to-container networking.
Now you can create a network policy for that port:
|cf add-network-policy app-A –destination-app app-B –protocol tcp –port 61443|
And your app-A can talk to app-B on port 61443 over HTTPS:
cf ssh app-A
What is happening behind the scenes?
Every application container that is hosted on the Linux operating system in Cloud Foundry is running Envoy, which proxies all incoming traffic to the application process. Envoy listens on several ports (starting with 61001 port) to serve different traffic to the application, including all specified application ports, SSH port and now port 61443 reserved for HTTPS container-to-container communication.
TLS is terminated by Envoy on port 61443 and then HTTP traffic is proxied to port 8080 inside the container. That means that the server application continues to serve HTTP on port 8080 and doesn’t worry about TLS termination.
For port 61443 Envoy is serving a TLS certificate that includes all application internal routes in its SAN. So now clients can validate the server they intended to talk to.
|Note: Container-to-container networking is not available for apps hosted on Windows.|
Dynamic certificate generation
Historically, the map-route and unmap-route commands magically changed the route for the application, without the need for the restart. We want to preserve this behavior. Whenever an internal route is mapped or unmapped, Cloud Foundry will dynamically update the TLS certificate for the container-to-container networking communication without the need for an application restart.
- Container-to-Container Networking Cloud Foundry Documentation
- Configuring Container-to-Container Networking Cloud Foundry Documentation