CDP Private Cloud 의 Cloudera Machine Learning 워크스페이스는 하나의 네임스페이스(기본 cdp-cml) 안에 여러 컨트롤 파드로 구성된다. UI 에서 지나간 작업 로그를 찾지 못할 때 어느 파드와 어느 저장소를 봐야 하는지 정리한 것이다. 내부 구현이므로 버전에 따라 이름이 달라질 수 있고, 지원 대상 인터페이스가 아니라는 점을 전제로 둔다.
워크스페이스 네임스페이스에서 관찰된 주요 파드는 다음과 같다.
| 파드 | 역할 |
|---|---|
db-0 |
워크스페이스 메타데이터용 PostgreSQL. StatefulSet |
api-* |
웹 UI 와 REST API 백엔드 |
cron-* |
예약 작업 트리거 |
livelog-0 |
세션·작업의 실시간 로그 저장소. StatefulSet |
livelog-publisher-* |
노드마다 뜨는 로그 수집기. DaemonSet |
livelog-cleaner-* |
오래된 livelog 를 지우는 CronJob |
s2i-builder-* |
사용자 런타임 이미지를 Source-to-Image 로 빌드 |
ds-operator · ds-reconciler · ds-vfs |
워크스페이스 리소스 조정과 프로젝트 파일 시스템 |
ds-cdh-client-* |
기반 CDH·CDP 클러스터 접속용 클라이언트 설정 |
db-0 은 여러 컨테이너로 구성된다. kubectl exec 를 컨테이너 지정 없이 실행하면 로그 수집용 fluent-bit 컨테이너로 들어가 psql 을 찾지 못한다. 반드시 db 컨테이너를 지정한다.
kubectl exec -it db-0 -n cdp-cml -c db -- bash
psql
데이터베이스 이름은 sense 이고 소유자도 sense 다. 80여 개 테이블이 있으며 작업 추적에 쓰이는 것은 다음과 같다.
| 테이블 | 내용 |
|---|---|
jobs |
작업 정의. 이름 · 소유 프로젝트 · 스케줄 · public_identifier |
runs |
작업 실행 이력. 시작·종료 시각과 상태 |
projects · projects_users |
프로젝트와 소속 사용자 |
users |
계정 |
session_metadata |
세션 실행 정보 |
run_metrics |
실행 중 기록된 지표 |
runtimes · runtime_addons |
런타임 이미지와 애드온 |
UI 에서 보이는 작업 식별자(208r-zpjy-65dc-wvxy 형태)는 public_identifier 컬럼과 맞춘다. 이것으로 runs 를 조인하면 어떤 실행이 언제 돌았는지 나온다.
SELECT r.* FROM runs r JOIN jobs j ON r.job_id = j.id
WHERE j.public_identifier = '<PUBLIC_ID>' ORDER BY r.created_at DESC;
컬럼 이름은 버전에 따라 다르므로 \d jobs · \d runs 로 실제 스키마를 먼저 확인한다 (확인 필요). 이 테이블들은 읽기 전용으로만 쓴다. 직접 수정하면 워크스페이스 상태가 UI 와 어긋난다.
세션과 작업이 돌 때 엔진이 남기는 줄(EngineInit.Livelog ... Start creating LiveLog client 같은 것)은 livelog 로 흘러간다. 실행 파드는 작업이 끝나면 사라지므로 kubectl logs 로는 이미 끝난 작업을 볼 수 없다.
livelog 데이터는 전용 PVC 에 있다.
kubectl get pvc -n cdp-cml | grep livelog
livelog-data-livelog-0 ... 100Gi RWO longhorn
해당 PVC 를 마운트한 파드로 들어가 내용을 본다.
kubectl exec -it livelog-0 -n cdp-cml -- bash
보존 기간은 livelog-cleaner CronJob 이 결정한다. 이 CronJob 이 지운 뒤에는 원본이 남지 않으므로, 감사 목적이라면 보존 주기를 먼저 확인하고 필요하면 외부로 내보내는 경로를 따로 마련해야 한다.
CML 파드는 대부분 사이드카가 붙어 있다. 컨테이너 목록을 먼저 확인하는 습관이 필요하다.
kubectl get pod <POD> -n cdp-cml -o jsonpath='{.spec.containers[*].name}{"\n"}'
kubectl get pod <POD> -n cdp-cml -o jsonpath='{.spec.initContainers[*].name}{"\n"}'
kubectl logs <POD> -n cdp-cml -c <CONTAINER>
재시작으로 사라지기 직전의 로그는 -p 로 본다.
kubectl logs <POD> -n cdp-cml -c <CONTAINER> -p
특정 PVC 를 어떤 파드가 쓰는지는 다음으로 찾는다.
kubectl get pod -n cdp-cml -o json | jq -r \
'.items[] | select(.spec.volumes[]?.persistentVolumeClaim.claimName=="<PVC>") | .metadata.name'