Connecting a local application to a Kubernetes cluster (Local Mode)
- Local app - a locally running application that can be used instead of a
Deployaction with a local mode configuration.
- Target kubernetes workload - a Kubernetes Workload produced from a
Deployaction with a local mode configuration that's deployed to the target kubernetes cluster.
This feature is still experimental. We're still working on some open tasks to improve the feature stability and usability. It means that:
- some incompatible changes can be made until the first non-experimental release
- there are some functional limitations, see the Current limitations section below
A local application can be used instead of a kubernetes workload by adding a local mode configuration to the
Local mode feature is only supported by certain action types and providers.
Local mode uses
kubectlport-forwarding and plain SSH port forwarding under the hood.
Requirements for the local machine environment:
- OpenSSH 7.6 or higher
There is a number of functional limitations in the current version.
The best matching use-case for local mode is to locally run an "isolated" application, i.e. an application that does not make any calls to other resources in the kubernetes cluster (i.e. databases or other applications).
If your application makes HTTP calls to some other kubernetes resources using kubernetes DNS names, then such calls will fail because the local DNS configuration is not aware about any DNS names configured in the kubernetes cluster.
Deployaction cannot be running in local and sync modes simultaneously. Local mode always takes precedence over sync mode if both are configured in the relevant
garden.ymlconfiguration file and if both
--syncflags are enabled.
The local mode is not supported natively for Windows OS. It should be used with WSL in Windows environments.
The local mode leaves the proxy container deployed in the target kubernetes cluster after exit. The affected
Deploys must be re-deployed manually by using
Usually, a Garden
Deployaction declares a configuration and a deployment policy of a kubernetes workload. A typical deployment flow looks like this:
- 1.build a container image if necessary
- 2.configure a docker container for the image
- 3.prepare kubernetes workloads to be deployed
- 4.deploy the configured kubernetes workloads to the target kubernetes cluster
The local mode changes the usual deployment flow by changing the manifest configuration step (item 3 from the list above) and the deployment step (item 4).
Local mode does the following modifications in the target kubernetes workload configuration before the actual deployment:
- 1.Replaces target kubernetes workload's container with a special proxy container that is based on openssh-server. This container exposes its
SSHport and the same
HTTPports as the
Deployaction configured in local mode.
- 2.Sets the number of replicas of the target kubernetes workload is always set to
- 3.Disables the basic health-checks (startup, readiness and liveness probes). See the section below for details.
The startup, readiness and liveness probes are disabled for all
Deployaxtions running in local mode. This has been done because of some technical reasons.
The lifecycle of a local app can be completely controlled by a user. Thus, the health checks may be unwanted and obstructing.
The kubernetes cluster readiness checks are applied to a proxy container which sends the traffic to the local app. When a readiness probe happens, the target local app and the relevant port forward are not ready yet. Thus, the readiness probe can cause the failure of the local mode startup.
The liveness checks can cause unnecessary re-deployment of the proxy container in the target cluster. Also, those checks create some extra traffic to the local app. That might be noisy and unnecessary if the local app is running in the debugger.
Once the kubernetes workloads are configured, local mode executes the deployment step in a specific way:
- 1.The local app is started by Garden if
localMode.commandfield is specified in the
Deployaction configuration. Otherwise, the local app should be started manually.
- 2.The SSH port forwarding from a randomly assigned local port to the proxy container SSH port is initialized by means of
- 3.The reverse port forwarding (on top of the previous SSH port forwarding) between the remote proxy container's HTTP port and the local application HTTP port is established by means of
As a result, the original target kubernetes workload is replaced by a workload that runs a proxy container, let's call it a proxy-workload. The proxy-workload is connected with the local app via the 2-layered port-forwarding described above. This connection schema allows to route the target kubernetes workload's traffic to the local app and back. For the rest entities in the kubernetes cluster, the local app acts as an original kubernetes workload.
In order to maintain secure connections, Garden generates a new SSH key pair for each
Deployaction running in local mode on every CLI execution.
Note! Garden automates the SSH key acceptance with option
-oStrictHostKeyChecking=accept-new, this is the reason why you need OpenSSH 7.6 or higher.
To configure a
Deployaction for local mode, add
localModeconfiguration entry to the
specfield of your
Deployaction configuration. See the examples below for details.
- local: 8090 # The port of the local app, will be used for port-forward setup.
remote: 8080 # The port of the remote app, will be used for port-forward setup.
# Starts the local app which will replace the target one in the kubernetes cluster.
# Optional. If not specified, then the local app should be started manually.
command: [ npm, run, serve ]
# Defines how to restart the local app on failure/exit.
# Optional. If not specified, then the default values will be applied.
delayMsec: 2000 # 2 sec delay between local app restarts
max: 100 # limit restart attempts to 100
type: kubernetes # this example looks the same for helm actions (i.e. with `type: helm`)
- local: 8090
command: [ "../backend-local/main" ]
# Target resource selector is necessary for `kubernetes` and `helm` action types
# manifests or files
kubernetesexample can be found in the
local-mode-k8s project. A
helmexample can be found in the
To run your
Deployactions in local mode, you can use
deploycommand with the special flag:
# Deploy specific Deploys in local mode:
garden deploy --local=app-1
garden deploy --local=app-1 app-2
# Deploy all applicable Deploys in local mode:
garden deploy --local
garden deploy --local=*
Local mode always runs in persistent mode, it means that the Garden process won't exit until it's terminated explicitly. All port-forwards established by local mode will be stopped on the process exit. The local application will be stopped if it was started via the
localMode.commandconfiguration option. Otherwise, if the local application was started manually, it will continue running.
If you run your local application with the
localMode.commandconfiguration option, then you can easily watch the local application's logs in real-time by running a
garden deploy --local -l 3
Otherwise, you can find the logs in