Always ready-to-code.
Installer
The best way to get started with Gitpod is by using our recommended & default installation method described in our documentation. In fact, our default installation method actually wraps this installer into a UI that helps you manage, update and configure Gitpod in a streamlined way. This document describes how to use the installer directly.
The installer is an internal tool and as such not expected to be used by those external to Gitpod.
Requirements
A machine running Linux
MacOS and Windows are not currently supported, but may be in future
Kubectl installed
The process to install Gitpod is:
generate a base config
amend the config for your own use-case
validate
render the Kubernetes YAML
kubectl apply
Quickstart
Download the Installer on Linux
Releases can be downloaded from GitHub Releases Select your desired binary, download and install
Download the latest release with the command:
Validate the binary (optional)
Download the checksum file:
Validate the binary against the checksum file:
If valid, the output is:
Install the binary
Test to ensure the version you installed is up-to-date:
Generate the base config
Customise your config
There are many things you can change in your config, which can be found in the Config Guide.
For the purposes of a quickstart, just change the domain
to one of your own.
Validate
Any errors here must be fixed before deploying. See Config for more details.
Any errors here must be fixed before deploying. See Cluster Dependencies for more details.
Render the YAML
Deploy
After a few minutes, your Gitpod installation will be available on the specified domain
.
Uninstallation
The Installer generates a ConfigMap with the metadata of every Kubernetes object generated by the Installer. This can be retrieved to remove Gitpod from your cluster.
Important. This may leave certain objects still in your Kubernetes cluster. This will include Secrets
generated from internal Certificates
and PersistentVolumeClaims
. These will need to be manually deleted.
Batch jobs are not included in this ConfigMap by design. These have ttlSecondsAfterFinished
defined in the spec and so will be deleted shortly after the jobs have run.
Advanced topics
Post-processing the YAML
Here be dragons.
Whilst you are welcome to post-process your YAML should the need arise, it is not recommended and is entirely unsupported. Do so at your own risk.
The Gitpod Installer is designed as a way of providing you a robust and well-tested framework for installing Gitpod to your own infrastructure. There may be times when this framework doesn't meet your individual requirements. In these situations, you should post-process the generated YAML.
As an example, this will allow you to change the proxy
service to a ClusterIP
type instead of LoadBalancer
using yq.
Similarly, if you are doing a Workspace
only install (specifying Workspace
as the kind in config) you might want to change the service type of ws-proxy
to ClusterIP
instead of the default LoadBalancer
. You can post-process the YAML to change that.
Error validating StatefulSet.status
Depending upon your Kubernetes implementation, you may receive this error. This is due to a bug in the underlying StatefulSet dependency, which is used to generate the OpenVSX proxy (see #8529).
To fix this, you will need to post-process the rendered YAML to remove the status
field.
What is installed
All Gitpod components
Container registry*
MySQL database*
Minio object storage*
* By default, these dependencies are installed if the inCluster
setting is true
. External dependencies can be used in their place
Config
Not every parameter is discussed in this table, just ones that are likely to need changing. The full config structure is available in config.go.
Property | Required | Description | Notes |
---|---|---|---|
domain | Y | The domain to deploy to | This will need to be changed on every deployment |
kind | Y | Installation type to run - for most users, this will be Full | Available options are: Meta : To install the tools that make up the front-end facing side of Gitpod Workspace : To install the components that make up the Gitpod Workspaces Full : To install the complete setup, i.e. both Meta and Workspace |
metadata.region | Y | Location for your objectStorage provider | If using Minio, set to local |
workspace.runtime.containerdRuntimeDir | Y | The location of containerd on host machine | Common values are: /run/containerd/io.containerd.runtime.v2.task/k8s.io (K3s)/var/lib/containerd/io.containerd.runtime.v2.task/k8s.io (AWS/GCP)/run/containerd/io.containerd.runtime.v1.linux/k8s.io /run/containerd/io.containerd.runtime.v1.linux/moby |
workspace.runtime.containerdSocket | Y | The location of containerd socket on the host machine | |
workspace.runtime.fsShiftMethod | Y | File system | Can be shiftfs . |
Auth Providers
Gitpod must be connected to a Git provider. This can be done via the dashboard on first load, or by providing authProviders
configuration as a Kubernetes secret.
Setting via config
Update your configuration file:
Create a secret file:
Create the secret:
In-cluster vs External Dependencies
Gitpod requires certain services for it to function correctly. The Installer provides all of these in-cluster, but they can be configured to use services external to the cluster.
To use the in-cluster dependency, set inCluster
to be true
.
Container Registry
The container-registry-token
secret must contain a .dockerconfigjson
key - this can be created by using the kubectl create secret docker-registry
command.
Using Amazon Elastic Container Registry (ECR)
Gitpod is compatible with any registry that implements the Docker Registry HTTP API V2 specification. Amazon ECR does not implement this spec fully. The spec expects that, if an image is pushed to a repository that doesn't exist, it creates the repository before uploading the image. Amazon ECR does not do this - if the repository doesn't exist, it will error on push.
To configure Gitpod to use Amazon, you will need to use the in-cluster registry and configure it to use S3 storage as the backend storage.
The secret expects to have two keys:
s3AccessKey
s3SecretKey
Database
Gitpod requires an instance of MySQL 5.7 for data storage.
The default encryption keys are [{"name":"general","version":1,"primary":true,"material":"4uGh1q8y2DYryJwrVMHs0kWXJlqvHWWt/KJuNi04edI="}]
Google Cloud SQL Proxy
If using a GCP SQL instance, a Cloud SQL Proxy connection can be used.
The cloudsql-token
secret must contain the following key/value pairs:
credentials.json
- GCP Service Account key withroles/cloudsql.client
roleencryptionKeys
- database encryption key. Use default value as above if unsurepassword
- database passwordusername
- database username
External Database
For all other connections, use an external database configuration.
The database-token
secret must contain the following key/value pairs:
encryptionKeys
- database encryption key. Use default value as above if unsurehost
- IP or URL of the databasepassword
- database passwordport
- database port, usually3306
username
- database username
Object Storage
Gitpod supports the following object storage providers:
GCP
The gcp-storage-token
secret must contain the following key/value pairs:
service-account.json
- GCP Service Account key withroles/storage.admin
androles/storage.objectAdmin
roles
S3
This is currently only tested with AWS. Other S3-compatible providers should work but there may be compatibility issues - please raise a ticket if you have issues with other providers
The s3-storage-token
secret must contain the following key/value pairs:
accessKeyId
- username that has access to S3 accountsecretAccessKey
- password that has access to S3 account
In AWS, the accessKeyId/secretAccessKey are an IAM user's credentials with
AmazonS3FullAccess
policy
Cluster Dependencies
In order for the deployment to work successfully, there are certain dependencies that need to be installed.
Kernel and Runtime
Your Kubernetes nodes must have the Linux kernel v5.4.0 or above and have a containerd runtime.
Affinity Labels
Your Kubernetes nodes must have the following labels applied to them:
gitpod.io/workload_meta
gitpod.io/workload_ide
gitpod.io/workload_services
gitpod.io/workload_workspace_regular
gitpod.io/workload_workspace_headless
It is recommended to have a minimum of two node pools, grouping the meta
and ide
nodes together and the workspace
nodes together.
TLS certificates
It is a requirement that a certificate secret exists, named as per certificate.name
in your config YAML with tls.crt
and tls.key
in the secret data. How this certificate is generated is entirely your choice - we suggest cert-manager for simplicity, however any certificate authority can be used by creating a Kubernetes secret.
The certificate must be associated with the following domains (where $DOMAIN
is the value in config domain
):
$DOMAIN
*.$DOMAIN
*.ws.$DOMAIN
See FAQs for help with creating a TLS certificate using cert-manager.
cert-manager
cert-manager MUST be installed to your cluster. In order to secure communication between the various components, the application creates internally which are created using the cert-manager Certificate
and Issuer
Custom Resource Definitions.
FAQs
Why are you writing your own Installer instead of using Helm/Kustomize/etc?
The Installer is a complete replacement for our Helm charts. Over time, this had grown to be too complex to effectively support and was a barrier to entry for new users - the base config was many hundreds of lines long and did not have effective validation on it. By contrast, the Installer's config is < 50 lines long and can be fully validated before running.
Also, by baking-in the container image versions to each release of the Installer, we reduce the potential for variance making it easier to support the community.
How do I use Cert Manager to create a TLS certificate?
Please see cert-manager.io for full documentation. This should be considered a quickstart guide.
There are two steps to creating a public TLS certificate using cert-manager.
1. Create the Issuer/ClusterIssuer
As the certificate is a wildcard certificate, you must use the DNS01 Challenge Provider. Please consult their documentation for instructions. This can be either an Issuer
or ClusterIssuer
.
2. Create the certificate
Replace $DOMAIN
with your domain. This example assumes you have created a ClusterIssuer
called gitpod-issuer
- please change this if necessary.
This certificate is called https-certificates
- please use that in your Gitpod installer config.
How do I use my own TLS certificate?
If you don't wish to use cert-manager to create a TLS certificate with a public certificate authority, you can bring your own.
To do this, generate your certificate as you would normally and then create a secret with the CRT set to tls.crt
and the Key set to tls.key
.
The DNS names must be $DOMAIN
, *.$DOMAIN
and *.ws.$DOMAIN
, where $DOMAIN
is your domain.
How can I install to a Kubernetes namespace?
By default, Gitpod will be installed to the default
Kubernetes namespace. To install to a different namespace, pass a namespace
flag to the render
command.
The validate cluster
command also accepts a namespace, allowing you to run the checks on that namespace.
IMPORTANT: this does not create the namespace, so you will need to create that separately. This is so that uninstallation of Gitpod does not remove any Kubernetes objects, such as your TLS certificate or connection secrets.