본문으로 건너뛰기

Coder

Coder는 Lumie 개발팀을 위한 자체 호스팅 클라우드 개발 환경(CDE) 플랫폼입니다. 개발자는 로컬 머신 설정 없이 브라우저 또는 SSH를 통해 표준화된 Kubernetes 기반 워크스페이스에서 작업할 수 있습니다.

배포 구성

  • 네임스페이스: coder
  • 차트: coder v2.31.9 (https://helm.coder.com/v2)
  • 이미지: ghcr.io/coder/coder
  • 복제본: 1개
  • 접근 URL: https://coder.lumie-infra.com (Teleport 경유)

아키텍처

Coder 서버 자체는 coder 네임스페이스에서 실행되고, 서버가 생성하는 워크스페이스 Pod는 lumie-dev 네임스페이스에 배포됩니다.

환경 설정

핵심 환경 변수

env:
# 외부 접근 URL (Teleport 도메인)
- name: CODER_ACCESS_URL
value: "https://coder.lumie-infra.com"

# 텔레메트리 비활성화
- name: CODER_TELEMETRY_ENABLE
value: "false"

# 시간대
- name: TZ
value: "Asia/Seoul"

# Teleport 리버스 프록시 신뢰 설정
- name: CODER_PROXY_TRUSTED_HEADERS
value: "X-Forwarded-For,X-Forwarded-Proto,X-Forwarded-Host"
- name: CODER_PROXY_TRUSTED_ORIGINS
value: "10.42.0.0/16"

# 와일드카드 서브도메인 비활성화 (SSH-only 설정)
- name: CODER_WILDCARD_ACCESS_URL
value: ""

CODER_WILDCARD_ACCESS_URL을 빈 값으로 설정하면 code-server 웹 프록시 기능이 비활성화됩니다. 워크스페이스 접근은 SSH 터널링만 사용합니다.

데이터베이스 연결

공유 infra-db CNPG 클러스터의 coder 데이터베이스를 사용합니다. 연결 URL은 Vault에서 동적으로 조합됩니다:

# manifests/vault-static-secret.yaml
spec:
path: infrastructure/coder
destination:
name: coder-db-secret
transformation:
templates:
connection-url:
text: "postgresql://coder:{{ .Secrets.POSTGRES_PASSWORD }}@infra-db-rw.infra-db.svc.cluster.local:5432/coder?sslmode=disable"

Pod에서는 해당 시크릿을 환경 변수로 참조합니다:

- name: CODER_PG_CONNECTION_URL
valueFrom:
secretKeyRef:
name: coder-db-secret
key: connection-url

OIDC 인증 (Keycloak)

Keycloak infra 렐름을 통해 SSO 인증을 처리합니다. 이메일 도메인 제한 없이 Keycloak이 접근 제어를 전적으로 담당합니다.

# OIDC 설정
- name: CODER_OIDC_ISSUER_URL
value: "https://auth.lumie-edu.com/realms/infra"
- name: CODER_OIDC_CLIENT_ID
value: "coder"
- name: CODER_OIDC_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: coder-oidc-secret
key: client-secret
- name: CODER_OIDC_SIGN_IN_TEXT
value: "Sign in with Lumie Keycloak"
- name: CODER_OIDC_ALLOW_SIGNUPS
value: "true"
- name: CODER_OIDC_SCOPES
value: "openid,profile,email"
# Keycloak이 접근을 제어하므로 이메일 인증 확인 생략
- name: CODER_OIDC_IGNORE_EMAIL_VERIFIED
value: "true"

OIDC 클라이언트 시크릿은 Vault의 secret/infrastructure/coder 경로에서 관리합니다:

# manifests/vault-static-secret.yaml (OIDC 시크릿)
spec:
path: infrastructure/coder
destination:
name: coder-oidc-secret
transformation:
templates:
client-secret:
text: "{{ .Secrets.OIDC_CLIENT_SECRET }}"

ServiceAccount 및 RBAC

Coder 서버는 lumie-dev 네임스페이스에 워크스페이스 리소스를 생성하기 위해 광범위한 권한이 필요합니다:

serviceAccount:
workspacePerms: true # pods, pvcs, configmaps 기본 권한
enableDeployments: true # deployments, replicasets 권한 추가
workspaceNamespaces:
- name: lumie-dev
extraRules:
- apiGroups: [""]
resources: ["services", "configmaps", "secrets"]
verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]

리소스 설정

resources:
requests:
cpu: 15m
memory: 422Mi
limits:
memory: 422Mi # CPU 제한 없음 (안정성 우선)

스케줄링

마스터 노드가 가득 찬 상황이므로 워커 노드에만 스케줄링됩니다:

affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/master
operator: DoesNotExist

보안 컨텍스트

podSecurityContext:
fsGroup: 1000

securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
seccompProfile:
type: RuntimeDefault

Vault 시크릿 구조

Vault 경로 secret/infrastructure/coder에 다음 키가 필요합니다:

설명생성된 시크릿
POSTGRES_PASSWORDinfra-db coder 유저 비밀번호coder-db-secret
OIDC_CLIENT_SECRETKeycloak coder 클라이언트 시크릿coder-oidc-secret

접근 방법

Teleport를 통한 접근

# Teleport CLI로 앱 로그인
tsh app login coder

# 브라우저 열기
open https://coder.lumie-infra.com

포트 포워딩 (개발/디버깅용)

kubectl port-forward -n coder svc/coder 8080:80
# http://localhost:8080 에서 접근

운영 확인

파드 상태 확인

kubectl get pods -n coder
kubectl logs -n coder deployment/coder

데이터베이스 연결 확인

kubectl exec -n coder deployment/coder -- \
env | grep CODER_PG_CONNECTION_URL

OIDC 시크릿 확인

kubectl get secret -n coder coder-oidc-secret -o jsonpath='{.data.client-secret}' | base64 -d

워크스페이스 네임스페이스 확인

# 현재 실행 중인 워크스페이스 Pod 목록
kubectl get pods -n lumie-dev

문제 해결

OIDC 로그인 실패

# Coder 서버 로그에서 OIDC 오류 확인
kubectl logs -n coder deployment/coder | grep -i oidc

# Keycloak infra 렐름에서 coder 클라이언트 설정 확인
# - Redirect URI: https://coder.lumie-infra.com/api/v2/users/oidc/callback

워크스페이스 Pod 생성 실패

# Coder의 ServiceAccount 권한 확인
kubectl auth can-i create pods -n lumie-dev \
--as=system:serviceaccount:coder:coder

# 이벤트 확인
kubectl get events -n lumie-dev --sort-by='.lastTimestamp'

Vault 시크릿 동기화 실패

# VaultStaticSecret 상태 확인
kubectl get vaultstaticsecret -n coder
kubectl describe vaultstaticsecret -n coder coder-db-secret-vss

관련 문서