컬리 데이터플랫폼팀이 데이터 사이언티스트에게 인프라를 감춘 추상화된 ML 환경을 주기 위해 Kubeflow를 도입한 과정과 운영 팁을 다룬다. SageMaker와 비교해 Kubeflow를 택한 이유, 그리고 실운영에 맞춘 커스터마이징을 정리한다.
핵심 포인트- 이미 EKS에 JupyterHub·MLFlow·Airflow가 흩어져 있어 연결성이 낮고 복잡해, 통합 MLOps 플랫폼이 필요했다.
- SageMaker와 Kubeflow 중, 이미 Kubernetes를 적극 활용 중이라 이식성·기술 내재화 측면에서 Kubeflow를 선택했다.
- 기본 설치는 운영에 부족해 Elyra·S3 아티팩트 저장소·IRSA·SealedSecrets 등으로 커스터마이징했다.
- credential 유출 방지를 위해 SealedSecrets와 pre-commit git hook으로 Secret 커밋을 이중 차단했다.
상세 정리- 선택 배경: 직접 플랫폼을 만들기보다 잘 패키징된 MLOps 서비스로 빠르게 도입하는 게 낫다고 보고 SageMaker와 Kubeflow 둘로 좁혔다.
- 비교: SageMaker는 AWS 통합·커버 범위가 넓지만 vendor lock-in과 비용이 단점, Kubeflow는 어느 Kubernetes 환경에도 배포 가능하나 레퍼런스가 적고 디버깅이 어렵다.
- 결정: 비용·기술 내재화 관점에서 Kubeflow가 못 커버하는 영역은 직접 개발·오픈소스로 메우기로 하고 Kubeflow를 채택했다(설치 환경 Kubernetes 1.21, Kubeflow 1.5.0, Kustomize 3.2.0).
- Elyra 도입: Kubeflow Pipeline(KFP)의 DAG 문법 학습 부담을 줄이려, JupyterLab UI에서 파이썬·노트북 의존성을 설정해 KFP DAG로 변환해주는 Elyra를 도입했다(Kale은 덜 성숙해 제외).
- Elyra 이미지: 기본 이미지에 Elyra가 없어 익스텐션 설치 이미지를 만들어 ECR로 관리하고, spawner_ui_config.yaml 수정으로 노트북 생성 시 드롭다운으로 제공한다.
- 저장소 변경: KFP 기본 아티팩트 저장소 MinIO(EBS PV) 대신, 대용량·가변 데이터 접근성·확장성을 위해 S3를 기본 저장소로 바꿨다.
- Argo 설정: KFP는 Argo Workflow로 동작해, workflow-controller-configmap의 artifactRepository에 S3 endpoint·bucket·region·useSDKCreds를 지정한다.
- IRSA: 파드가 S3와 통신하려면 credential 주입이 필요한데, multi-tenancy라 네임스페이스마다 Secret을 만드는 불편을 피해 default-editor 서비스어카운트에 IRSA(role-arn)를 설정했다.
- SealedSecrets: 매니페스트의 Dex google client id/secret 등 credential을 Git으로 관리하기 위해, kubeseal로 Secret을 암호화한 SealedSecret CR로 변환해 컨트롤러가 클러스터에서 복호화하게 했다.
- 커밋 방지: 실수로 원본 Secret을 푸시하는 것을 막으려 kind Secret 패턴을 검사하는 pre-commit git hook을 두어 발견 시 커밋을 실패시킨다.
왜 읽나EKS 위에 Kubeflow 기반 MLOps 플랫폼을 실운영 수준으로 세팅하려는 ML·인프라 엔지니어에게 커스터마이징 체크리스트.