Pushing Apps with Sidecar Processes
Page last updated:
This topic describes sidecar processes and how to include them when you push your app.
Overview
You can run additional processes in the same container as your app. These are called sidecar processes, or sidecars. An example of a sidecar is an Application Performance Monitoring (APM) tool.
When you provide a sidecar for your app, VMware Tanzu Application Service for VMs (TAS for VMs) packages the required code and configuration needed to run the sidecar and app in the same droplet. It deploys this droplet in a single container on Diego. Both processes within the container undergo health checks independently.
You can push sidecar processes with your app by using one of two methods:
- Using an app manifest. For instructions, see Push an App with a Sidecar Using an App Manifest below.
- With a custom buildpack. For instructions, see Sidecar Buildpacks.
For additional information about sidecars, see Sidecars in the Cloud Foundry API (CAPI) documentation.
For sample apps that use sidecars, see the capi-sidecar-samples repository on GitHub. These sample apps use an app manifest.
Use Cases
You can use sidecars for processes that depend on each other or must run in the same container.
For example, you can use sidecars for processes that must:
- Communicate over a Unix socket or through localhost
- Share the same filesystem
- Be scaled and placed together
- Have fast interprocess communication
Limitations
Sidecars have these limitations:
The start and stop order of app processes and their sidecars is undefined.
App processes and sidecars are codependent. If either crashes or exits, the other does also.
Sidecars are currently not independently scalable. Sidecars share resources with the main app process and other sidecars within the container.
Sidecars only support PID-based health checks. HTTP health checks for sidecars are not currently supported.
Requirements for Java Apps
These sections describe several requirements that are specific to pushing sidecars with Java apps.
Reserving Memory
You must allocate memory to the sidecar. If you do not, the Java buildpack allocates all of the available memory to the app. As a result, the sidecar does not have enough memory and the app fails to start.
To allocate memory to the sidecar, use the memory property in the app manifest. For example:
sidecars:
- name: SIDECAR-NAME
process_types: [ 'PROCESS-TYPES' ]
command: START-COMMAND
memory: 256MB
Where:
SIDECAR-NAMEis a name you give your sidecar.PROCESS-TYPESis a list of app processes for the sidecar to attach to, such asweborworker. You can attach multiple sidecars to each process type your app uses.START-COMMANDis the command used to start the sidecar. For example,./binaryorjava -jar java-file.jar.
You must also allocate memory to sidecars that you push with a custom buildpack. For more information, see Sidecar Buildpacks.
Packaging Binaries
If your sidecar is a binary file rather than a set of buildable source files, then you must package the binary file with your Java app.
In some cases, the Java buildpack requires you to push a .jar file. If this is the case with your app, you must include the sidecar binary in the .jar file.
To package the sidecar binary with the .jar file, run:
zip JAR -u SIDECAR-BINARY
Where:
JARis your.jarfile.SIDECAR-BINARYis your sidecar binary.
For more information about packaging assets with your Java app, see Tips for Java Developers.
Push an App with a Sidecar Using an App Manifest
These sections explain how to push an app with a sidecar using an app manifest. For an example that you can try yourself, see Sidecar Tutorial below.
Note: When pushing a Java app, ensure that you follow the requirements listed in Requirements for Java Apps above.
Prerequisites
Before you can push an app with a sidecar with an app manifest, you must have:
An app that is currently running or ready to be pushed.
A file that TAS for VMs can execute inside the app container as a sidecar process. For example, an executable binary, a Java .jar file, or Ruby scripts.
Procedure
To push an app with a sidecar:
Create an app or use an existing app. To create an app:
If you are using cf CLI v7, run:
cf create-app APP-NAMEWhere
APP-NAMEis the name you give your app.If you are using cf CLI v6, run:
cf v3-create-app APP-NAMEWhere
APP-NAMEis the name you give your app.Note: This command is experimental and unsupported. Consider upgrading to cf CLI v7 to use a supported version of this command. To upgrade to cf CLI v7, see Install cf CLI v7 in Upgrading to cf CLI v7.
Create a manifest file in the root directory of your app, such as
manifest.yml. Otherwise, use an existing manifest file for your app. For more information, see Deploying with App Manifests.Add the values below to your app manifest file under the
applicationskey:sidecars: - name: SIDECAR-NAME process_types: [ 'PROCESS-TYPES' ] command: START-COMMANDWhere:
SIDECAR-NAMEis a name you give your sidecar.PROCESS-TYPESis a list of app processes for the sidecar to attach to, such asweborworker. You can attach multiple sidecars to each process type your app uses.START-COMMANDis the command used to start the sidecar. For example,./binaryorjava -jar java-file.jar.
This example manifest file includes multiple sidecars:
--- applications: - name: my-app sidecars: - name: authenticator process_types: [ 'web', 'worker' ] command: bundle exec run-authenticator - name: performance monitor process_types: [ 'web' ] command: bundle exec run-performance-monitorTo apply the manifest file to your app:
If you are using cf CLI v7, run:
cf apply-manifest -f PATH-TO-MANIFESTWhere
PATH-TO-MANIFESTis the path to your manifest file.If you are using cf CLI v6, run:
cf v3-apply-manifest -f PATH-TO-MANIFESTWhere
PATH-TO-MANIFESTis the path to your manifest file.Note: This command is experimental and unsupported. Consider upgrading to cf CLI v7 to use a supported version of this command. To upgrade to cf CLI v7, see Install cf CLI v7 in Upgrading to cf CLI v7.
To push your app:
If you are using cf CLI v7, run:
cf push APP-NAMEWhere
APP-NAMEis the name of your app.If you are using cf CLI v6, run:
cf v3-push APP-NAMEWhere
APP-NAMEis the name of your app.Note: This command is experimental and unsupported. Consider upgrading to cf CLI v7 to use a supported version of this command. To upgrade to cf CLI v7, see Install cf CLI v7 in Upgrading to cf CLI v7.
Sidecar Tutorial
You can explore sidecars using the app in the capi-sidecar-samples repository on GitHub. The sections below describe the app, how to build and push the app, and some ways to observe the app and its processes after pushing.
Note: This tutorial assumes that you are pushing the Ruby sample app. You can also follow this tutorial for a Java app using the sidecar-dependent-java-app and push_java_app_with_binary_sidecar.sh in the samples repository. When pushing a Java app, ensure that you follow the requirements listed in Requirements for Java Apps above.
About the Sample App
The capi-sidecar-samples repository contains:
A simple Ruby app: This app is named
sidecar-dependent-app. It includes a/configendpoint that calls to the sidecar and prints the response, as shown in this code snippet:get '/config' do puts "Sending a request to the config-server sidecar at localhost:#{ENV['CONFIG_SERVER_PORT']}/config/" response = Typhoeus.get("localhost:#{ENV['CONFIG_SERVER_PORT']}/config/") puts "Received #{response.body} from the config-server sidecar" response.body endA Golang sidecar: The
config-server-sidecarproduces aconfig-serverbinary. It provides apps with their required configuration over its/configendpoint. It also accepts connections only over localhost on theCONFIG_SERVER_PORTport. This means the sidecar must be co-located in the same container as the app, so that it shares the same network namespace as the main app.
The diagram below illustrates the app architecture:

Push the App and Sidecar
To push the app and sidecar:
In a terminal window, clone the Git repository to your workspace by running:
git clone https://github.com/cloudfoundry-samples/capi-sidecar-samples.gitNavigate to the
config-server-sidecardirectory.Build the binary for the sidecar by running:
GOOS=linux GOARCH=amd64 go build -o config-server .Note: If you do not have Go installed, download the
config-server_linux_x86-64binary from Releases in thecapi-sidecar-samplesrepository in GitHub.Copy the binary to
sidecar-dependent-appdirectory:cp config-server ../sidecar-dependent-appTo create the app:
If you are using cf CLI v7, run:
cf create-app sidecar-dependent-appIf you are using cf CLI v6, run:
cf v3-create-app sidecar-dependent-appNote: This command is experimental and unsupported. Consider upgrading to cf CLI v7 to use a supported version of this command. To upgrade to cf CLI v7, see Install cf CLI v7 in Upgrading to cf CLI v7.
Navigate to the
sidecar-dependent-appdirectory.Open and review the
manifest.ymlfile. Undersidecars, the sidecar is specified with a name, process type, and start command. Underenv, there is an environment variable that defines the port on which the app and sidecar communicate.To apply the manifest to the app:
If you are using cf CLI v7, run:
cf apply-manifestIf you are using cf CLI v6, run:
cf v3-apply-manifestNote: This command is experimental and unsupported. Consider upgrading to cf CLI v7 to use a supported version of this command. To upgrade to cf CLI v7, see Install cf CLI v7 in Upgrading to cf CLI v7.
To push the app:
If you are using cf CLI v7, run:
cf push sidecar-dependent-appIf you are using cf CLI v6, run:
cf v3-push sidecar-dependent-appNote: This command is experimental and unsupported. Consider upgrading to cf CLI v7 to use a supported version of this command. To upgrade to cf CLI v7, see Install cf CLI v7 in Upgrading to cf CLI v7.
After you push the app, you can further explore it in View the Processes Running in the Container and View the Web URL and App Logs below.
View the Processes Running in the Container
To view the app and sidecar process running in the container:
SSH into the app container by running:
cf ssh sidecar-dependent-appTo see both the
rackupprocess for the main app andconfig-serverprocess for the sidecar, run:ps auxThe output you see should resemble the output below:
vcap@f00949bd-6601-4731-6f7e-e859:~$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1120 0 ? S 22:17 0:00 /tmp/garden-init vcap 7 0.0 0.0 106716 4508 ? S 22:17 0:00 ./config-server vcap 13 0.0 0.1 519688 35412 ? S 22:17 0:00 /home/vcap/deps/0/vendor_bundle/ruby/2.4.0/bin/rackup config.ru -p 8080 vcap 24 0.0 0.0 116344 10792 ? S 22:17 0:00 /tmp/lifecycle/diego-sshd --allowedKeyExchanges= --address=0.0.0.0:2222 --allowUnauthenticatedClients=false --inhe root 82 0.0 0.0 108012 4548 ? S 22:17 0:00 /etc/cf-assets/healthcheck/healthcheck -port=8080 -timeout=1000ms -liveness-interval=30s vcap 215 0.3 0.0 70376 3756 pts/0 S 23:12 0:00 /bin/bash vcap 227 0.0 0.0 86268 3116 pts/0 R 23:12 0:00 ps aux
To see that the sidecar is listening on the port specified by
CONFIG_SERVER_PORTand that the mainrubyprocess is connected to it, run:lsof -i | grep $CONFIG_SERVER_PORTThe output you see should resemble the output below:
vcap@f00949bd-6601-4731-6f7e-e859:~$ lsof -i | grep $CONFIG_SERVER_PORT config-se 7 vcap 3u IPv4 17265901 0t0 TCP *:8082 (LISTEN) config-se 7 vcap 5u IPv4 17265992 0t0 TCP localhost:8082->localhost:42266 (ESTABLISHED) uby 13 vcap 11u IPv4 17274965 0t0 TCP localhost:42266->localhost:8082 (ESTABLISHED)
View the Web URL and App Logs
To view the Web URL and logs for the app:
In a browser, navigate to the
configendpoint of thesidecar-dependent-app. For example:https://sidecar-dependent-app.example.com/config.See that the browser displays
ScopeandPasswordinformation. This is the configuration that the app fetches from theconfig-serversidecar.In a terminal window, begin streaming logs for the app by running:
cf logs sidecar-dependent-appIn your browser, refresh the
/configendpoint page and observe that the log stream in your terminal displays logs for both the sidecar and the main app process.In a separate terminal window from your log stream, SSH into the app container by running:
cf ssh sidecar-dependent-appTerminate the sidecar process by running:
kill -9 $(pgrep config-server)View the output in the terminal window where you are streaming the app logs. The app logs indicate that the sidecar process crashed and that Diego restarted the app container. For example:
2019-04-17T16:48:55.41-0700 [API/0] OUT App instance exited with guid 21df1eb8-f25d-43b2-990b-c1a417310553 payload: {"instance"=>"a8db0eed-7371-4805-5ad3-4596", "index"=>0, "cell_id"=>"86808ce7-afc2-47da-9e79-522a62a48cff", "reason"=>"CRASHED", "exit_description"=>"APP/PROC/WEB/SIDECAR/CONFIG-SERVER: Exited with status 137", "crash_count"=>1, "crash_timestamp"=>1555544935367052708, "version"=>"50892dcb-274d-4cf6-b944-3eda1e000283"}
