Cloud Tech

Kubeflow 구성 비용 최소화 및 대시보드 구성기(feat. JuJu)

Hanhorang31 2025. 2. 16. 02:21
 
 

Kubeflow는 AI/ML 워크로드를 관리하는 강력한 도구이지만, 학습 목적으로 구성하기에 강력한 컴퓨팅 성능이 필요합니다.

클라우드 환경에서는 요구 컴퓨팅 성능이 곧 비용이라, 학습 목적으로는 부담이 큽니다.

 

여러 서칭 결과 비용을 최소화하기 위해 찾았던 툴인 Charmed Kubeflow를 통해 Ubuntu 서버(2xlarge)로 kubeflow 구성하고, addon 대시보드를 구성한 실습 내용을 공유합니다.

 

Kubeflow addons dashboard
Grafana Loki dashboard for istio

 

 

본 실습의 목표는 다음과 같습니다.

  1. Kubeflow 비용 최소화 - EKS 클러스터 구성과 최소 2xlarge 인스턴스 2대가 필요한 비용을 2xlarge 인스턴스 한대로 구성
  2. Kubeflow Add-on 모니터링10여가지의 유기적으로 연결된 Add-on들을 분석할 수 있는 대시보드 구성
  3. Istio 및 Prometheus 구성 확인 – Kubeflow의 네트워크 및 모니터링 구성 확인
❗ Charmed Kubeflow는 Kubeflow를 간편하게 배포할 수 있도록 지원하지만, 공식 가이드는 아직 성숙하지 않은 상태입니다. 최근 2주간 가이드가 여러 차례 변경되었으며, 실습 과정에서 공식 문서와 실제 동작 간 차이가 있었습니다. 본 글의 실습 내용 또한 이후 변경될 가능성이 있음을 참고 바랍니다.

Microk8s and Juju?

Charmed Kubeflow 는 JuJu와 Microk8s 로 구성합니다.

 

Juju

Juju는 모델 기반 애플리케이션 관리를 위한 오픈 소스 도구입니다.

Juju의 Charmed Operator Lifecycle Manager(OLM)와 "Charms"로 패키징된 Charmed Operators의 강력한 조합은 여러 클라우드와 기판에 걸친 배포, 구성 및 업그레이드를 포함한 애플리케이션의 전체 수명 주기를 관리할 수 있게 해줍니다.

Juju는 컨트롤러가 전체 환경을 제어하여 에이전트가 실제 애플리케이션을 실행하는 구조입니다.

아래 Unit은 서버이며, Action 은 특정 애플리케이션 작업입니다.

JuJu 구성 방식은 코드를 기반으로 동작합니다.

기본 예제 프로젝트(https://github.com/juju/hello-juju-charm/tree/master)를 확인하면

Python 코드 기반으로 각 Action 이 정의되어 있습니다.

동작 방식은 다음과 같습니다.

  • Juju가 Kubernetes에 Model을 생성 (Namespace로 매핑됨)
  • Charm을 이용해 StatefulSet을 배포 (Juju Unit = K8s Pod)
  • 각 Pod 내에서 Unit Agent가 애플리케이션을 조정 (Pebble로 애플리케이션 관리)
  • Workload Container가 실제 애플리케이션을 실행 (Persistent Volume이 필요할 경우 연결)

 

 

Microk8s

Microk8s는 경량 쿠버네티스 구성 도구입니다. 바이너리 기반으로 동작하며 일반 addon를 기본 내장 패키지로 제공합니다. Kind와 같은 로컬 머신에서 동작하는 쿠버네티스 구성 도구이나 도커 기반이 아닌 바이너리로 실행하하여 가볍다는 장점이 있습니다.

로컬에서 Microk8s를 구성하여 juju 를 통해 kubeflow 배포하겠습니다.

필자가 실행한 테스트 시나리오는 3가지였습니다.

  • Mac 기반 Microk8s + kubeflow 구성 - 실패. kubeflow 파드가 컨트롤러에서 전체 배포 안됨
  • EKS 에서 Kubeflow 구성 - 실패. 모니터링 통합이 안됨
  • Ubuntu 기반 Microk8s + kubeflow 구성 - 성공 🤒
 

Microk8s 설치 On Mac(실패)

더보기

모델 배포시 파드가 배포되지 않음

 

Ubuntu + EKS 에서 KUBEFLOW 배포 (실패)

더보기

모델 배포를 완료했으나 COS 통신을 하지 못함

 

EC2 Ubuntu + microk8s (성공)

Ubutnu 24.04, CPU 4 Core, 16 RAM, 50GB 이상의 EC2 자원 필요합니다. 필자는 t3.2xlarge로 구성하였습니다.
sudo snap install microk8s --channel=1.29/stable --classic

# 접근 권한 추가 
sudo usermod -a -G microk8s $USER 

# refrsh permission 
newgrp microk8s 

# addon 추가 
sudo microk8s enable dns hostpath-storage metallb:10.64.140.43-10.64.140.49 rbac 

# 클러스터 상태 확인 
microk8s status

microk8s kubectl get pods -A 
microk8s kubectl get nodes 

juju 설치와 kubeflow 배포

sudo snap install juju --channel=3.4/stable
mkdir -p ~/.local/share 


# juju config 설정
microk8s config | juju add-k8s my-k8s --client

# juju 컨트롤러 배포 
juju bootstrap my-k8s uk8sx

# 모델 추가
juju add-model kubeflow 


# 메모리 설정
sudo sysctl fs.inotify.max_user_instances=1280
sudo sysctl fs.inotify.max_user_watches=655360 

sudo vi /etc/sysctl.conf 
------- 
# 아래 수정 
fs.inotify.max_user_instances=1280
fs.inotify.max_user_watches=655360



juju deploy kubeflow --trust --channel=1.9/stable

juju status --watch 5s
  • 배포에 약 20분 소비됩니다.

 

Kubeflow 대시보드 확인

# 비밀번호 설정
juju config dex-auth static-username=admin
juju config dex-auth static-password=admin


# 포트 포워딩
microk8s kubectl -n kubeflow get svc istio-ingressgateway-workload -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
microk8s kubectl -n kubeflow port-forward svc/istio-ingressgateway-workload 8080:80 --address=0.0.0.0
# 인자 수정 방법
sudo vi /var/snap/microk8s/current/args/kube-apiserver 

 

 

COS Lite 설치

COS 란 Canonical 가 제공하는 observability 도구 모음입니다.

COS를 설치하면 Prometheus, grafana, loki, grafana, traefik 가 자동으로 배포됩니다.

juju add-model cos
juju switch cos 
juju deploy cos-lite --trust 

watch --color juju status --color --relations

 

 

COS 연동

juju controllers 
juju deploy -m uk8sx:kubeflow grafana-agent-k8s --channel=stable

sudo snap install jq 

juju show-unit -m uk8sx:cos catalogue/0 --format json | jq '.["catalogue/0"]["relation-info"][]."application-data".url | select(. != null)'
---
"http://10.64.140.44/cos-grafana"
"http://10.64.140.44/cos-prometheus-0"
"http://10.64.140.44/cos-alertmanager" 


#그라파나 에이전트에서 kubeflow 통신 확인
juju exec --unit grafana-agent-k8s/0 -m uk8sx:kubeflow 'curl -s http://10.64.140.44/cos-prometheus-0/api/v1/status/runtimeinfo'
juju offer -c uk8sx cos.prometheus:receive-remote-write prometheus-receive-remote-write
juju offer -c uk8sx cos.grafana:grafana-dashboard grafana-dashboards
juju offer -c uk8sx cos.loki:logging loki-logging

juju consume -m uk8sx:kubeflow uk8sx:cos.prometheus-receive-remote-write
juju consume -m uk8sx:kubeflow uk8sx:cos.grafana-dashboards
juju consume -m uk8sx:kubeflow uk8sx:cos.loki-logging


juju integrate -m uk8sx:kubeflow grafana-agent-k8s:send-remote-write prometheus-receive-remote-write
juju integrate -m uk8sx:kubeflow grafana-agent-k8s:grafana-dashboards-provider grafana-dashboards
juju integrate -m uk8sx:kubeflow grafana-agent-k8s:logging-consumer loki-logging

juju status -m uk8sx:cos grafana-agent-k8s --relations

Integrate with Prometheus

 

juju switch uk8sx:kubeflow
juju integrate argo-controller:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate dex-auth:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate envoy:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate istio-ingressgateway:metrics-endpoint grafana-agent-k8s:metrics-endpoint  
juju integrate istio-pilot:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate jupyter-controller:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate katib-controller:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate kfp-api:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate knative-operator:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate knative-eventing:otel-collector knative-operator:otel-collector
juju integrate knative-serving:otel-collector knative-operator:otel-collector
juju integrate kserve-controller:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate kubeflow-profiles:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate metacontroller-operator:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate minio:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate seldon-controller-manager:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate pvcviewer-operator:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate tensorboard-controller:metrics-endpoint grafana-agent-k8s:metrics-endpoint
juju integrate training-operator:metrics-endpoint grafana-agent-k8s:metrics-endpoint

juju integrate argo-controller:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate dex-auth:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate envoy:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate istio-pilot:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate jupyter-controller:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate katib-controller:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate kfp-api:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate kubeflow-dashboard:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate metacontroller-operator:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate minio:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate seldon-controller-manager:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate pvcviewer-operator:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
juju integrate training-operator:grafana-dashboard grafana-agent-k8s:grafana-dashboards-consumer
  • seldon not found : seldon 은 kubeflow 에서 배포되지 않은 컴포넌트로 연동되지 않아 발생하는 에러입니다. 무시해주세요.

 

Integrate with Loki

juju switch uk8sx:kubeflow
juju integrate admission-webhook:logging grafana-agent-k8s:logging-provider
juju integrate jupyter-ui:logging grafana-agent-k8s:logging-provider
juju integrate katib-db-manager:logging grafana-agent-k8s:logging-provider
juju integrate katib-ui:logging grafana-agent-k8s:logging-provider
juju integrate kfp-metadata-writer:logging grafana-agent-k8s:logging-provider
juju integrate kfp-persistence:logging grafana-agent-k8s:logging-provider
juju integrate kfp-profile-controller:logging grafana-agent-k8s:logging-provider
juju integrate kfp-schedwf:logging grafana-agent-k8s:logging-provider
juju integrate kfp-ui:logging grafana-agent-k8s:logging-provider
juju integrate kfp-viewer:logging grafana-agent-k8s:logging-provider
juju integrate kfp-viz:logging grafana-agent-k8s:logging-provider
juju integrate kubeflow-dashboard:logging grafana-agent-k8s:logging-provider
juju integrate kubeflow-volumes:logging grafana-agent-k8s:logging-provider
juju integrate mlmd:logging grafana-agent-k8s:logging-provider
juju integrate oidc-gatekeeper:logging grafana-agent-k8s:logging-provider
juju integrate tensorboards-web-app:logging grafana-agent-k8s:logging-provider
juju integrate argo-controller:logging grafana-agent-k8s:logging-provider
juju integrate dex-auth:logging grafana-agent-k8s:logging-provider
juju integrate envoy:logging grafana-agent-k8s:logging-provider
juju integrate jupyter-controller:logging grafana-agent-k8s:logging-provider
juju integrate katib-controller:logging grafana-agent-k8s:logging-provider
juju integrate kfp-api:logging grafana-agent-k8s:logging-provider
juju integrate knative-operator:logging grafana-agent-k8s:logging-provider
juju integrate kserve-controller:logging grafana-agent-k8s:logging-provider
juju integrate kubeflow-profiles:logging grafana-agent-k8s:logging-provider
juju integrate pvcviewer-operator:logging grafana-agent-k8s:logging-provider
juju integrate seldon-core:logging grafana-agent-k8s:logging-provider
juju integrate tensorboard-controller:logging grafana-agent-k8s:logging-provider

 

 

Grafana Dashboard 접근

juju show-unit -m uk8sx:cos catalogue/0 --format json | jq '.["catalogue/0"]["relation-info"][]."application-data".url | select(. != null)'
---

"http://10.64.140.44/cos-grafana"
"http://10.64.140.44/cos-prometheus-0"
"http://10.64.140.44/cos-alertmanager" 

#프로메테우스 포트포워딩
microk8s kubectl -n cos port-forward svc/prometheus 9090:9090 --address=0.0.0.0

#그라파나 포트포워딩
microk8s kubectl -n cos port-forward svc/grafana 3000:3000 --address=0.0.0.0

# 비밀번호 확인
juju run -m uk8sx:cos grafana/leader get-admin-password 
  • 프로메테우스 기본 경로는 404 not found 로 설정되어 있습니다. 경로 http://3.39.250.71:9090/targets 로 접근하여 확인해주세요 .

Grafna 대시보드 확인

구성한 대시보드는 kubeflow를 구성하는 addon 들에 대한 대시보드들입니다.

공식 문서에서와는 달리 배포되지 않은 대시보드가 존재하여 아래 대시보드는 직접 배포하였습니다.

공식문서 참고시 대시보드 구성 요소는 다음과 같습니다.

 

 

전체 addon 모니터링

  • up{juju_application=~".",juju_model=~"kubeflow",juju_model_uuid=~".",juju_unit=~".*"} juju 커스텀 메트릭으로 떠있는 모든 addon을 대상으로 상태를 체크합니다.

Control Plane

  • Deployed Versions: 배포된 버전 변경 여부 추적하여 문제 발생 시점의 버전 확인
  • Resource Usage: 메모리/CPU 사용량 및 Goroutine 증가 감지로 성능 이슈 사전 대응
  • Push Information: XDS Push 및 이벤트 빈도 추적으로 네트워크 및 제어 플레인 부하 감시
  • Connections: 활성 연결 수 모니터링하여 네트워크 및 애플리케이션 문제 감지

Loki 로깅(내용이 없어 공식문서 대시보드로 대체합니다.)

Envoy Dashboard

지표
목적
확인할 사항
Egress RPS/CPS
외부로 나가는 요청 및 연결 수 모니터링
요청이 급증하거나 비정상적으로 낮아지는지 확인
Total Connections/Requests
활성 연결 및 총 요청 수 확인
트래픽 흐름이 정상적으로 유지되는지
Success Rate
정상 응답 비율 체크 (5xx 제외)
100% 유지되는지, 낮아질 경우 원인 분석
4xx Response
클라이언트 오류 발생률 분석
특정 시간대에 오류 증가 여부
Upstream Request Errors
요청 실패 원인 분석
연결 타임아웃, 장애 발생 여부
Upstream Flow Control
네트워크 병목 감지
서비스가 정상적으로 응답하는지
Cluster Membership
Envoy 인스턴스 상태 확인
활성 인스턴스 수가 정상인지

스토리지(Minio)

  • S3 사용 가능한 공간과 저장 용량
  • S3 트래픽
  • S3 API 요청 오류와 전송된 데이터
  • 노드의 CPU, 메모리, 파일 디스크립터, IO 사용량

ArgoCD

  • 실패했거나 에러 상태인 워크플로우의 수
  • 워크플로우가 실행되기 전 큐에서 대기하는 시간
  • 워크플로우 파드에서 S3로 전송되는 로그의 총 크기

 

 

Mircok8S 중지 및 재시작

microk8s 를 중지 및 재시작하여 kubeflow를 손쉽게 중지하고 다시 구성할 수 있습니다.

# 상태 확인
microk8s status
# 중지 
microk8s stop
# 재시작 
microk8s start 

 

 

'Cloud Tech' 카테고리의 다른 글

EKS 노드 그룹  (1) 2025.02.23
EBS CSI Controller 정리  (1) 2025.02.23
RayCluster on EKS and Serving LLM Model  (1) 2025.02.09
Kubernetes CI & CD (ArgoCD, Jenkins)  (2) 2024.12.22
Github Action CI/CD  (1) 2024.12.15