Skip to content

Commit 43de899

Browse files
committed
chore: Added template back
1 parent 497c7ec commit 43de899

2 files changed

Lines changed: 394 additions & 0 deletions

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
display_name: Kubernetes Pod Workspace (provide repo)
3+
description: Provision Kubernetes Deployments as Coder workspaces
4+
icon: ../../../site/static/icon/k8s.png
5+
maintainer_github: UMLCloudComputing
6+
verified: true
7+
tags: [kubernetes, container]
8+
---
9+
10+
# Remote Development on Kubernetes Pods
11+
12+
Provision Kubernetes Pods as [Coder workspaces](https://coder.com/docs/workspaces).
13+
14+
Provide your own GitHub repository URL to clone.
Lines changed: 380 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,380 @@
1+
terraform {
2+
required_providers {
3+
coder = {
4+
source = "coder/coder"
5+
}
6+
kubernetes = {
7+
source = "hashicorp/kubernetes"
8+
}
9+
}
10+
}
11+
12+
provider "coder" {
13+
}
14+
15+
variable "use_kubeconfig" {
16+
type = bool
17+
description = <<-EOF
18+
Use host kubeconfig? (true/false)
19+
20+
Set this to false if the Coder host is itself running as a Pod on the same
21+
Kubernetes cluster as you are deploying workspaces to.
22+
23+
Set this to true if the Coder host is running outside the Kubernetes cluster
24+
for workspaces. A valid "~/.kube/config" must be present on the Coder host.
25+
EOF
26+
default = false
27+
}
28+
29+
variable "namespace" {
30+
type = string
31+
description = "The Kubernetes namespace to create workspaces in (must exist prior to creating workspaces). If the Coder host is itself running as a Pod on the same Kubernetes cluster as you are deploying workspaces to, set this to the same namespace."
32+
}
33+
34+
data "coder_parameter" "cpu" {
35+
name = "cpu"
36+
display_name = "CPU"
37+
description = "The number of CPU cores"
38+
default = "2"
39+
icon = "/icon/memory.svg"
40+
mutable = true
41+
option {
42+
name = "2 Cores"
43+
value = "2"
44+
}
45+
option {
46+
name = "4 Cores"
47+
value = "4"
48+
}
49+
option {
50+
name = "6 Cores"
51+
value = "6"
52+
}
53+
option {
54+
name = "8 Cores"
55+
value = "8"
56+
}
57+
}
58+
59+
data "coder_parameter" "memory" {
60+
name = "memory"
61+
display_name = "Memory"
62+
description = "The amount of memory in GB"
63+
default = "2"
64+
icon = "/icon/memory.svg"
65+
mutable = true
66+
option {
67+
name = "2 GB"
68+
value = "2"
69+
}
70+
option {
71+
name = "4 GB"
72+
value = "4"
73+
}
74+
option {
75+
name = "6 GB"
76+
value = "6"
77+
}
78+
option {
79+
name = "8 GB"
80+
value = "8"
81+
}
82+
}
83+
84+
data "coder_parameter" "home_disk_size" {
85+
name = "home_disk_size"
86+
display_name = "Home disk size"
87+
description = "The size of the home disk in GB"
88+
default = "10"
89+
type = "number"
90+
icon = "/emojis/1f4be.png"
91+
mutable = false
92+
validation {
93+
min = 1
94+
max = 99999
95+
}
96+
}
97+
98+
variable "k8s_token" {
99+
type = string
100+
sensitive = true
101+
description = "Token for the coder-provisioner service account"
102+
}
103+
104+
105+
# Choose your repo
106+
data "coder_parameter" "repo_url" {
107+
name = "repo_url"
108+
display_name = "Repository URL"
109+
}
110+
111+
module "git-clone" {
112+
source = "registry.coder.com/modules/git-clone/coder"
113+
agent_id = coder_agent.main.id
114+
url = data.coder_parameter.repo_url.value
115+
}
116+
117+
# Handling private repositories
118+
data "coder_external_auth" "github" {
119+
id = "github-primary"
120+
}
121+
122+
resource "coder_agent" "main" {
123+
os = "linux"
124+
arch = "amd64"
125+
env = {
126+
GITHUB_TOKEN = data.coder_external_auth.github.access_token
127+
}
128+
}
129+
130+
131+
provider "kubernetes" {
132+
host = "https://kubernetes.default.svc" # Internal cluster address
133+
token = var.k8s_token
134+
# Path to the cluster CA
135+
cluster_ca_certificate = file("/var/run/secrets/kubernetes.io/serviceaccount/ca.crt")
136+
}
137+
138+
data "coder_workspace" "me" {}
139+
data "coder_workspace_owner" "me" {}
140+
141+
resource "coder_agent" "main" {
142+
os = "linux"
143+
arch = "amd64"
144+
startup_script = <<-EOT
145+
set -e
146+
147+
# Install the latest code-server.
148+
# Append "--version x.x.x" to install a specific version of code-server.
149+
curl -fsSL https://code-server.dev/install.sh | sh -s -- --method=standalone --prefix=/tmp/code-server
150+
151+
# Start code-server in the background.
152+
/tmp/code-server/bin/code-server --auth none --port 13337 >/tmp/code-server.log 2>&1 &
153+
EOT
154+
155+
# The following metadata blocks are optional. They are used to display
156+
# information about your workspace in the dashboard. You can remove them
157+
# if you don't want to display any information.
158+
# For basic resources, you can use the `coder stat` command.
159+
# If you need more control, you can write your own script.
160+
metadata {
161+
display_name = "CPU Usage"
162+
key = "0_cpu_usage"
163+
script = "coder stat cpu"
164+
interval = 10
165+
timeout = 1
166+
}
167+
168+
metadata {
169+
display_name = "RAM Usage"
170+
key = "1_ram_usage"
171+
script = "coder stat mem"
172+
interval = 10
173+
timeout = 1
174+
}
175+
176+
metadata {
177+
display_name = "Home Disk"
178+
key = "3_home_disk"
179+
script = "coder stat disk --path $${HOME}"
180+
interval = 60
181+
timeout = 1
182+
}
183+
184+
metadata {
185+
display_name = "CPU Usage (Host)"
186+
key = "4_cpu_usage_host"
187+
script = "coder stat cpu --host"
188+
interval = 10
189+
timeout = 1
190+
}
191+
192+
metadata {
193+
display_name = "Memory Usage (Host)"
194+
key = "5_mem_usage_host"
195+
script = "coder stat mem --host"
196+
interval = 10
197+
timeout = 1
198+
}
199+
200+
metadata {
201+
display_name = "Load Average (Host)"
202+
key = "6_load_host"
203+
# get load avg scaled by number of cores
204+
script = <<EOT
205+
echo "`cat /proc/loadavg | awk '{ print $1 }'` `nproc`" | awk '{ printf "%0.2f", $1/$2 }'
206+
EOT
207+
interval = 60
208+
timeout = 1
209+
}
210+
}
211+
212+
# code-server
213+
resource "coder_app" "code-server" {
214+
agent_id = coder_agent.main.id
215+
slug = "code-server"
216+
display_name = "code-server"
217+
icon = "/icon/code.svg"
218+
url = "http://localhost:13337?folder=/home/coder"
219+
subdomain = false
220+
share = "owner"
221+
222+
healthcheck {
223+
url = "http://localhost:13337/healthz"
224+
interval = 3
225+
threshold = 10
226+
}
227+
}
228+
229+
resource "kubernetes_persistent_volume_claim_v1" "home" {
230+
metadata {
231+
name = "coder-${data.coder_workspace.me.id}-home"
232+
namespace = var.namespace
233+
labels = {
234+
"app.kubernetes.io/name" = "coder-pvc"
235+
"app.kubernetes.io/instance" = "coder-pvc-${data.coder_workspace.me.id}"
236+
"app.kubernetes.io/part-of" = "coder"
237+
//Coder-specific labels.
238+
"com.coder.resource" = "true"
239+
"com.coder.workspace.id" = data.coder_workspace.me.id
240+
"com.coder.workspace.name" = data.coder_workspace.me.name
241+
"com.coder.user.id" = data.coder_workspace_owner.me.id
242+
"com.coder.user.username" = data.coder_workspace_owner.me.name
243+
}
244+
annotations = {
245+
"com.coder.user.email" = data.coder_workspace_owner.me.email
246+
}
247+
}
248+
wait_until_bound = false
249+
spec {
250+
access_modes = ["ReadWriteOnce"]
251+
resources {
252+
requests = {
253+
storage = "${data.coder_parameter.home_disk_size.value}Gi"
254+
}
255+
}
256+
}
257+
}
258+
259+
resource "kubernetes_deployment_v1" "main" {
260+
count = data.coder_workspace.me.start_count
261+
depends_on = [
262+
kubernetes_persistent_volume_claim_v1.home
263+
]
264+
wait_for_rollout = false
265+
metadata {
266+
name = "coder-${data.coder_workspace.me.id}"
267+
namespace = var.namespace
268+
labels = {
269+
"app.kubernetes.io/name" = "coder-workspace"
270+
"app.kubernetes.io/instance" = "coder-workspace-${data.coder_workspace.me.id}"
271+
"app.kubernetes.io/part-of" = "coder"
272+
"com.coder.resource" = "true"
273+
"com.coder.workspace.id" = data.coder_workspace.me.id
274+
"com.coder.workspace.name" = data.coder_workspace.me.name
275+
"com.coder.user.id" = data.coder_workspace_owner.me.id
276+
"com.coder.user.username" = data.coder_workspace_owner.me.name
277+
}
278+
annotations = {
279+
"com.coder.user.email" = data.coder_workspace_owner.me.email
280+
}
281+
}
282+
283+
spec {
284+
replicas = 1
285+
selector {
286+
match_labels = {
287+
"app.kubernetes.io/name" = "coder-workspace"
288+
"app.kubernetes.io/instance" = "coder-workspace-${data.coder_workspace.me.id}"
289+
"app.kubernetes.io/part-of" = "coder"
290+
"com.coder.resource" = "true"
291+
"com.coder.workspace.id" = data.coder_workspace.me.id
292+
"com.coder.workspace.name" = data.coder_workspace.me.name
293+
"com.coder.user.id" = data.coder_workspace_owner.me.id
294+
"com.coder.user.username" = data.coder_workspace_owner.me.name
295+
}
296+
}
297+
strategy {
298+
type = "Recreate"
299+
}
300+
301+
template {
302+
metadata {
303+
labels = {
304+
"app.kubernetes.io/name" = "coder-workspace"
305+
"app.kubernetes.io/instance" = "coder-workspace-${data.coder_workspace.me.id}"
306+
"app.kubernetes.io/part-of" = "coder"
307+
"com.coder.resource" = "true"
308+
"com.coder.workspace.id" = data.coder_workspace.me.id
309+
"com.coder.workspace.name" = data.coder_workspace.me.name
310+
"com.coder.user.id" = data.coder_workspace_owner.me.id
311+
"com.coder.user.username" = data.coder_workspace_owner.me.name
312+
}
313+
}
314+
spec {
315+
security_context {
316+
run_as_user = 1000
317+
fs_group = 1000
318+
run_as_non_root = true
319+
}
320+
321+
container {
322+
name = "dev"
323+
image = "codercom/enterprise-base:ubuntu"
324+
image_pull_policy = "Always"
325+
command = ["sh", "-c", coder_agent.main.init_script]
326+
security_context {
327+
run_as_user = "1000"
328+
}
329+
env {
330+
name = "CODER_AGENT_TOKEN"
331+
value = coder_agent.main.token
332+
}
333+
resources {
334+
requests = {
335+
"cpu" = "250m"
336+
"memory" = "512Mi"
337+
}
338+
limits = {
339+
"cpu" = "${data.coder_parameter.cpu.value}"
340+
"memory" = "${data.coder_parameter.memory.value}Gi"
341+
}
342+
}
343+
volume_mount {
344+
mount_path = "/home/coder"
345+
name = "home"
346+
read_only = false
347+
}
348+
}
349+
350+
volume {
351+
name = "home"
352+
persistent_volume_claim {
353+
claim_name = kubernetes_persistent_volume_claim_v1.home.metadata.0.name
354+
read_only = false
355+
}
356+
}
357+
358+
affinity {
359+
// This affinity attempts to spread out all workspace pods evenly across
360+
// nodes.
361+
pod_anti_affinity {
362+
preferred_during_scheduling_ignored_during_execution {
363+
weight = 1
364+
pod_affinity_term {
365+
topology_key = "kubernetes.io/hostname"
366+
label_selector {
367+
match_expressions {
368+
key = "app.kubernetes.io/name"
369+
operator = "In"
370+
values = ["coder-workspace"]
371+
}
372+
}
373+
}
374+
}
375+
}
376+
}
377+
}
378+
}
379+
}
380+
}

0 commit comments

Comments
 (0)