본문으로 건너뛰기

Coder

Coder는 Lumie의 셀프호스팅 개발 워크스페이스 control plane입니다. 서버는 coder 네임스페이스에서 실행되지만, 생성되는 워크스페이스는 lumie-dev에서 pod로 실행되며, 그 안에서 Teleport가 Tilt UI, code-server, agents UI에 사용하도록 안정적인 dev-workspace 서비스를 공유합니다.

책임

  • 개발자별 워크스페이스를 위한 control plane 제공
  • Keycloak infra realm을 통해 운영자 인증
  • 공유 infra-db PostgreSQL 클러스터에 control-plane 상태 저장
  • lumie-dev에 workspace pod와 home PVC 생성

소스 경로

경로역할
lumie-infra/applications/coder/argocd.yamlcoder 네임스페이스를 대상으로 하는 ArgoCD Application
lumie-infra/applications/coder/kustomization.yamlHelm 차트 진입점과 추가 매니페스트
lumie-infra/applications/coder/helm-values.yaml서버 설정, OIDC, RBAC, 데이터베이스 연결
lumie-infra/applications/coder/manifests/vault-static-secret.yamlDB 및 OIDC 자격 증명을 위한 Vault-to-Kubernetes 시크릿 동기화
lumie-infra/applications/coder/template/main.tflumie-dev에 PVC와 pod를 생성하는 워크스페이스 템플릿
lumie-infra/applications/coder/template/Dockerfile.dev-workspace메인 dev 컨테이너의 베이스 이미지
lumie-infra/applications/lumie/develop/common-values.yaml안정적인 dev-workspace ServiceAccount와 네임스페이스 범위 RBAC
lumie-infra/applications/lumie/develop/manifests/dev-workspace-service.yamlTilt, code-server, agents를 위한 안정적인 ClusterIP 서비스
lumie-infra/security/teleport/agent/helm-values.yamlcoder.lumie-infra.com 외부 접근 경로

소유권 경계

  • ArgoCD는 Coder 서버, 해당 네임스페이스 메타데이터, coder의 Vault 기반 시크릿을 관리합니다.
  • Coder 워크스페이스 템플릿은 lumie-dev의 워크스페이스별 PVC와 pod를 관리합니다.
  • 영속적인 dev-workspace ServiceAccount와 싱글턴 dev-workspace 서비스는 Coder가 아니라 lumie-dev 네임스페이스 overlay가 소유합니다.
  • 외부 브라우저 접근은 Teleport가 소유합니다.

퍼블릭 표면과 계약

표면계약
Teleport 앱security/teleport/agent/helm-values.yaml에 선언된 coder.lumie-infra.com
인클러스터 서비스coder.coder.svc.cluster.local:80
OIDC issuerhttps://auth.lumie-edu.com/realms/infra
OIDC clientclientId: coder, redirect는 https://coder.lumie-infra.com/api/v2/users/oidc/callback
데이터베이스coder-db-secret을 통해 주입되는 postgresql://coder@infra-db-rw.infra-db.svc.cluster.local:5432/coder
워크스페이스 네임스페이스serviceAccount.workspaceNamespaces를 통한 lumie-dev만 허용

런타임 흐름

워크스페이스 템플릿 동작

template/main.tf의 워크스페이스 템플릿이 개발자 pod의 실제 런타임 계약입니다.

  • local-path30Gi 크기의 coder-<owner>-<workspace>-home 이름 home PVC를 생성합니다.
  • 세 개의 컨테이너를 실행합니다.
    • dev: build, shell, Tilt, kubectl, Docker CLI, code-server용
    • agents: 포트 3000의 브라우저 UI용
    • dind: 이미지 빌드를 위한 privileged sidecar
  • public Teleport URL은 workspace pod 내부에서 사용할 수 없으므로, Coder agent를 인클러스터 URL http://coder.coder.svc.cluster.local에서 다운로드합니다.
  • lumie-dev 안에서만 Kubernetes admin ClusterRole에 바인딩된 공유 dev-workspace ServiceAccount를 마운트합니다.

안정적인 dev-workspace 서비스는 의도적으로 템플릿 밖에 두었습니다. 각 워크스페이스가 별도 Terraform state를 가지기 때문에, 그렇지 않으면 두 번째 워크스페이스 생성 시 싱글턴 서비스 오브젝트에서 충돌이 발생합니다.

시크릿 및 의존성 연결

  • coder-db-secret-vss는 Vault 경로 secret/infrastructure/coder에서 PostgreSQL 연결 URL을 렌더링합니다.
  • coder-oidc-secret-vss는 같은 Vault 경로에서 Keycloak client secret을 렌더링합니다.
  • CODER_PROXY_TRUSTED_HEADERSCODER_PROXY_TRUSTED_ORIGINS는 Teleport의 인클러스터 포워딩 헤더를 신뢰합니다.
  • CODER_WILDCARD_ACCESS_URL은 명시적으로 비워 두므로 Lumie는 Coder의 와일드카드 서브도메인 앱 프록시를 사용하지 않습니다.

장애 동작과 운영 리스크

  • 오래되었거나 누락된 coder-db-secret 또는 coder-oidc-secret은 서버 시작이나 OIDC 로그인을 막습니다.
  • Teleport가 Host 헤더를 coder.lumie-infra.com으로 다시 쓰지 않으면, Coder 배포가 정상이어도 브라우저 세션과 WebSocket 검사가 실패합니다.
  • 공유 dev-workspace 서비스나 포트가 템플릿과 어긋나면 워크스페이스 생성은 성공해도 사용자 도구는 실패할 수 있습니다.
  • dind sidecar는 설계상 privileged입니다. lumie-dev의 admission-policy나 runtime-policy 변경이 있으면 이미지 빌드 워크플로가 가장 먼저 깨질 수 있습니다.
  • 워크스페이스 pod는 master 노드를 피하도록 고정되어 있으므로, worker 노드 압박 시 Pending 상태가 될 수 있습니다.

관측성

  • control-plane 상태는 ArgoCD 앱 codercoder 배포 로그에서 확인할 수 있습니다.
  • 워크스페이스 장애는 lumie-dev의 pod 로그에서 진단하는 것이 가장 쉽습니다.
  • 이 저장소에는 Coder용 ServiceMonitor가 체크인되어 있지 않으므로, 로그와 pod readiness가 주요 신호입니다.

검증

kubectl get applications.argoproj.io -n argocd coder
kubectl get deploy,pods,secrets -n coder
kubectl get svc -n coder
kubectl get sa,rolebinding -n lumie-dev dev-workspace
kubectl get svc -n lumie-dev dev-workspace
kubectl get pods,pvc -n lumie-dev | rg '^coder-'
kubectl logs -n coder deploy/coder

관련 페이지