Coder
Coder는 Lumie의 셀프호스팅 개발 워크스페이스 control plane입니다. 서버는 coder 네임스페이스에서 실행되지만, 생성되는 워크스페이스는 lumie-dev에서 pod로 실행되며, 그 안에서 Teleport가 Tilt UI, code-server, agents UI에 사용하도록 안정적인 dev-workspace 서비스를 공유합니다.
책임
- 개발자별 워크스페이스를 위한 control plane 제공
- Keycloak
infrarealm을 통해 운영자 인증 - 공유
infra-dbPostgreSQL 클러스터에 control-plane 상태 저장 lumie-dev에 workspace pod와 home PVC 생성
소스 경로
| 경로 | 역할 |
|---|---|
lumie-infra/applications/coder/argocd.yaml | coder 네임스페이스를 대상으로 하는 ArgoCD Application |
lumie-infra/applications/coder/kustomization.yaml | Helm 차트 진입점과 추가 매니페스트 |
lumie-infra/applications/coder/helm-values.yaml | 서버 설정, OIDC, RBAC, 데이터베이스 연결 |
lumie-infra/applications/coder/manifests/vault-static-secret.yaml | DB 및 OIDC 자격 증명을 위한 Vault-to-Kubernetes 시크릿 동기화 |
lumie-infra/applications/coder/template/main.tf | lumie-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.yaml | Tilt, code-server, agents를 위한 안정적인 ClusterIP 서비스 |
lumie-infra/security/teleport/agent/helm-values.yaml | coder.lumie-infra.com 외부 접근 경로 |
소유권 경계
- ArgoCD는 Coder 서버, 해당 네임스페이스 메타데이터,
coder의 Vault 기반 시크릿을 관리합니다. - Coder 워크스페이스 템플릿은
lumie-dev의 워크스페이스별 PVC와 pod를 관리합니다. - 영속적인
dev-workspaceServiceAccount와 싱글턴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 issuer | https://auth.lumie-edu.com/realms/infra |
| OIDC client | clientId: 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-path에30Gi크기의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안에서만 KubernetesadminClusterRole에 바인딩된 공유dev-workspaceServiceAccount를 마운트합니다.
안정적인 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_HEADERS와CODER_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서비스나 포트가 템플릿과 어긋나면 워크스페이스 생성은 성공해도 사용자 도구는 실패할 수 있습니다. dindsidecar는 설계상 privileged입니다.lumie-dev의 admission-policy나 runtime-policy 변경이 있으면 이미지 빌드 워크플로가 가장 먼저 깨질 수 있습니다.- 워크스페이스 pod는 master 노드를 피하도록 고정되어 있으므로, worker 노드 압박 시 Pending 상태가 될 수 있습니다.
관측성
- control-plane 상태는 ArgoCD 앱
coder와coder배포 로그에서 확인할 수 있습니다. - 워크스페이스 장애는
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