Coder
Coder는 Lumie 개발팀을 위한 자체 호스팅 클라우드 개발 환경(CDE) 플랫폼입니다. 개발자는 로컬 머신 설정 없이 브라우저 또는 SSH를 통해 표준화된 Kubernetes 기반 워크스페이스에서 작업할 수 있습니다.
배포 구성
- 네임스페이스:
coder - 차트:
coderv2.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