docs: add new best practice doc to speed up templates and workspaces (#15296)

closes https://github.com/coder/coder/issues/14858

- [x] TODO: update `build-timeline.png`
- [x] TODO: `Best practices` doesn't show up in the sidebar until you're
actually in the doc 🤔


[preview](https://coder.com/docs/@bp-speed-up-templates/tutorials/best-practices/speed-up-templates)

---------

Co-authored-by: EdwardAngert <17991901+EdwardAngert@users.noreply.github.com>
Co-authored-by: Muhammad Atif Ali <atif@coder.com>
Co-authored-by: Ben Potter <ben@coder.com>
This commit is contained in:
Edward Angert
2024-11-01 11:24:35 -05:00
committed by GitHub
co-authored by EdwardAngert Muhammad Atif Ali Ben Potter
parent 13b97cf3dc
commit 18ef954a03
5 changed files with 189 additions and 17 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

+29 -17
View File
@@ -1,6 +1,6 @@
# Install Coder on Kubernetes
You can install Coder on Kubernetes using Helm. We run on most Kubernetes
You can install Coder on Kubernetes (K8s) using Helm. We run on most Kubernetes
distributions, including [OpenShift](./openshift.md).
## Requirements
@@ -121,27 +121,27 @@ coder:
We support two release channels: mainline and stable - read the
[Releases](./releases.md) page to learn more about which best suits your team.
For the **mainline** Coder release:
- **Mainline** Coder release:
<!-- autoversion(mainline): "--version [version]" -->
<!-- autoversion(mainline): "--version [version]" -->
```shell
helm install coder coder-v2/coder \
--namespace coder \
--values values.yaml \
--version 2.15.0
```
```shell
helm install coder coder-v2/coder \
--namespace coder \
--values values.yaml \
--version 2.15.0
```
For the **stable** Coder release:
- **Stable** Coder release:
<!-- autoversion(stable): "--version [version]" -->
<!-- autoversion(stable): "--version [version]" -->
```shell
helm install coder coder-v2/coder \
--namespace coder \
--values values.yaml \
--version 2.15.1
```
```shell
helm install coder coder-v2/coder \
--namespace coder \
--values values.yaml \
--version 2.15.1
```
You can watch Coder start up by running `kubectl get pods -n coder`. Once Coder
has started, the `coder-*` pods should enter the `Running` state.
@@ -167,6 +167,18 @@ helm upgrade coder coder-v2/coder \
-f values.yaml
```
## Coder Observability Chart
Use the [Observability Helm chart](https://github.com/coder/observability) for a
pre-built set of dashboards to monitor your control plane over time. It includes
Grafana, Prometheus, Loki, and Alert Manager out-of-the-box, and can be deployed
on your existing Grafana instance.
We recommend that all administrators deploying on Kubernetes set the
observability bundle up with the control plane from the start. For installation
instructions, visit the
[observability repository](https://github.com/coder/observability?tab=readme-ov-file#installation).
## Kubernetes Security Reference
Below are common requirements we see from our enterprise customers when
+12
View File
@@ -723,6 +723,18 @@
"title": "FAQs",
"description": "Miscellaneous FAQs from our community",
"path": "./tutorials/faqs.md"
},
{
"title": "Best practices",
"description": "Guides to help you make the most of your Coder experience",
"path": "./tutorials/best-practices/index.md",
"children": [
{
"title": "Speed up your workspaces",
"description": "Speed up your Coder templates and workspaces",
"path": "./tutorials/best-practices/speed-up-templates.md"
}
]
}
]
},
+5
View File
@@ -0,0 +1,5 @@
# Best practices
Guides to help you make the most of your Coder experience.
<children></children>
@@ -0,0 +1,143 @@
# Speed up your Coder templates and workspaces
October 31, 2024
---
If it takes your workspace a long time to start, find out why and make some
changes to your Coder templates to help speed things up.
## Monitoring
You can monitor [Coder logs](../../admin/monitoring/logs.md) through the
system-native tools on your deployment platform, or stream logs to tools like
Splunk, Datadog, Grafana Loki, and others.
### Workspace build timeline
Use the **Build timeline** to monitor the time it takes to start specific
workspaces. Identify long scripts, resources, and other things you can
potentially optimize within the template.
![Screenshot of a workspace and its build timeline](../../images/best-practice/build-timeline.png)
Adjust this request to match your Coder access URL and workspace:
```shell
curl -X GET https://coder.example.com/api/v2/workspacebuilds/{workspacebuild}/timings \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
```
Visit the
[API documentation](../../reference/api/builds.md#get-workspace-build-timings-by-id)
for more information.
### Coder Observability Chart
Use the [Observability Helm chart](https://github.com/coder/observability) for a
pre-built set of dashboards to monitor your control plane over time. It includes
Grafana, Prometheus, Loki, and Alert Manager out-of-the-box, and can be deployed
on your existing Grafana instance.
We recommend that all administrators deploying on Kubernetes or on an existing
Prometheus or Grafana stack set the observability bundle up with the control
plane from the start. For installation instructions, visit the
[observability repository](https://github.com/coder/observability?tab=readme-ov-file#installation),
or our [Kubernetes installation guide](../../install/kubernetes.md).
### Enable Prometheus metrics for Coder
[Prometheus.io](https://prometheus.io/docs/introduction/overview/#what-is-prometheus)
is included as part of the [observability chart](#coder-observability-chart). It
offers a variety of
[available metrics](../../admin/integrations/prometheus.md#available-metrics),
such as `coderd_provisionerd_job_timings_seconds` and
`coderd_agentstats_startup_script_seconds`, which measure how long the workspace
takes to provision and how long the startup script takes.
You can
[install it separately](https://prometheus.io/docs/prometheus/latest/getting_started/)
if you prefer.
## Provisioners
`coder server` defaults to three provisioner daemons. Each provisioner daemon
can handle one single job, such as start, stop, or delete at a time and can be
resource intensive. When all provisioners are busy, workspaces enter a "pending"
state until a provisioner becomes available.
### Increase provisioner daemons
Provisioners are queue-based to reduce unpredictable load to the Coder server.
However, they can be scaled up to allow more concurrent provisioners. You risk
overloading the central Coder server if you use too many built-in provisioners,
so we recommend a maximum of five provisioners. For more than five provisioners,
we recommend that you move to
[external provisioners](../../admin/provisioners.md).
If you cant move to external provisioners, use the `provisioner-daemons` flag
to increase the number of provisioner daemons to five:
```shell
coder server --provisioner-daemons=5
```
Visit the
[CLI documentation](../../reference/cli/server.md#--provisioner-daemons) for
more information about increasing provisioner daemons, configuring external
provisioners, and other options.
### Adjust provisioner CPU/memory
We recommend that you deploy Coder to its own respective Kubernetes cluster,
separate from production applications. Keep in mind that Coder runs development
workloads, so the cluster should be deployed as such, without production-level
configurations.
Adjust the CPU and memory values as shown in
[Helm provisioner values.yaml](https://github.com/coder/coder/blob/main/helm/provisioner/values.yaml#L134-L141):
```yaml
resources:
limits:
cpu: "0.25"
memory: "1Gi"
requests:
cpu: "0.25"
memory: "1Gi"
```
Visit the
[validated architecture documentation](../../admin/infrastructure/validated-architectures/index.md#workspace-nodes)
for more information.
## Set up Terraform provider caching
By default, Coder downloads each Terraform provider when a workspace starts.
This can create unnecessary network and disk I/O.
`terraform init` generates a `.terraform.lock.hcl` which instructs Coder
provisioners to cache specific versions of your providers.
To use `terraform init` to cache providers:
1. Pull the templates to your local device:
```shell
coder templates pull
```
1. Run `terraform init` to initialize the directory:
```shell
terraform init
```
1. Push the templates back to your Coder deployment:
```shell
coder templates push
```