Sign inSign up

kubed/codeserver

By kubed

•Updated about 16 hours ago

Image
0

198

kubed/codeserver repository overview

⁠Code Server

VS Code in the browser, and the homelab's workbench: the IDE at code.kellyferrone.com⁠, with the whole cluster one terminal away. Agent sessions run here too, so this pod is where most of the homelab gets built.

⁠What you get

  • The cluster at hand — a cluster-admin service account, so kubectl build, plan and up work from any terminal.
  • State that survives restarts — extensions, settings and every CLI's config live on one volume.
  • Projects on the NAS — /projects is NFS, so a pod restart never touches your checkouts.
  • Claude Code, shared — /claude is NFS too, shared with the claude runner: the same memory, settings and sessions in the IDE and in CI.
  • Every click observed — VS Code's telemetry goes to Loki through Alloy, and the dashboard⁠ turns it into activity, performance, extension health, connection drops and crashes.

⁠Namespace

build, pinned to nucster.

⁠Layout

ComponentAdds
components/configthe 1Password Connect token, rendered from an ExternalSecret
components/envenvironment from codeserver.env and an ExternalSecret, Claude and VS Code telemetry included
components/hooksan init script and a post-start hook
components/projects/projects, NFS from puffer
components/volumethe codeserver-state volume
components/claude/claude, NFS shared with the claude runner
components/service-accountthe codeserver service account, bound to cluster-admin
components/ingressthe Ingress and its certificate
components/sshan ssh config (off)

⁠State volume

One codeserver-state claim carries everything that has to survive a pod restart, mounted twice by subpath:

subPathmount pathholds
data/home/coder/.local/share/code-serverextensions, editor settings, workspace state
config/home/coder/.configXDG_CONFIG_HOME — gh, op, gcloud, codex, claude

The init container creates the subdirs and links kustomize back to /kubed/kustomize, where the exec plugins are baked into the image. /kubed itself stays ephemeral.

⁠Dashboard

dashboard/⁠ is the Codeserver dashboard in Grafana, as source: one file per panel, built into a GrafanaManifest and deployed on its own.

kubectl up dashboard

⁠Extensions

Install an extension from a vsix with:

code-server --install-extension /path/to/your-extension.vsix

The LDAP explorer:

curl -LO https://github.com/fengtan/ldap-explorer/releases/download/1.5.2/ldap-explorer-1.5.2.vsix

PromQL highlighting (not on Open VSX, so straight from the marketplace CDN):

curl -LO https://ventura.gallerycdn.vsassets.io/extensions/ventura/prom/1.3.3/1706942171176/Microsoft.VisualStudio.Services.VSIXPackage
mv Microsoft.VisualStudio.Services.VSIXPackage ventura.prom-1.3.3.vsix

⁠Deploy

kubectl build .
kubectl plan .
kubectl up .

Or run the 🔍 Plan and 🚀 Deploy workflows.

⁠Image

kubed/codeserver is built here, from the Dockerfile⁠: upstream codercom/code-server plus the kubed toolchain. Two kubed images are copy-only dependencies — kubed/devcontainers for the shared install scripts and kubed/krm for kubectl, its plugins, helm and yq — pinned beside the base so Dependabot bumps all three.

docker compose up --build   # http://localhost:8088

📸 Image Builder pushes :main on every merge. 🧬 Publish Version cuts a release: it pins newTag in kustomization.yaml⁠ to the new version, tags it, and pushes kubed/codeserver:vX.Y.Z. Run it with push=false first.

⁠Upgrading

WhatPinLatest from
code-serverFROM codercom/code-server in Dockerfile⁠code-server releases⁠
ToolchainFROM kubed/krm in Dockerfile⁠kubed-io/krm⁠
Install scriptsFROM kubed/devcontainers in Dockerfile⁠kubed-io/devcontainers⁠
Deployed imagenewTag in kustomization.yaml⁠written by 🧬 Publish Version

An upgrade replaces the pod the agent usually runs in: expect the session to drop, and check the CLI tools under /kubed/bin afterwards.

⁠References

Tag summary

Content type

Image

Digest

sha256:a412067e3…

Size

516.5 MB

Last updated

about 16 hours ago

docker pull kubed/codeserver