나 JAVA 봐라

로컬 K8s에 Kubeflow 설치하기 본문

DevOps, MLOps/K8s

로컬 K8s에 Kubeflow 설치하기

cool_code 2024. 7. 2. 16:28

[로컬 K8s에 Kubeflow 설치하기]

 

 


 

Kubeflow는 K8s 위에서 동작하는 ML 플랫폼이기 때문에, Kubeflow를 사용하려면 먼저 K8s를 설치해야 한다. 

 

K8s 설치

K8s를 설치하는 방법도 여러 가지가 있는데, 보통 초보자는 간단하게 사용할 수 있는 Docker Desktop, Minikube를 주로 사용한다. 

 

방법1. Docker Desktop으로 K8s 실행하는 방법

: Docker Desktop 프로그램을 설치한 후, 설정 화면에서 단순히 Kubernetes를 활성화 시켜주면 쿠버네티스가 실행된다. (= 명령어 입력 없이 버튼 딸깍. 끝.)

 

OS (Windows, Mac OS)에 맞춰 Docker Desktop을 설치한다. 

https://docs.docker.com/desktop/install/mac-install/

 

Install Docker Desktop on Mac

Install Docker for Mac to get started. This guide covers system requirements, where to download, and instructions on how to install and update.

docs.docker.com

 

설치 딸깍딸깍

 

설치가 완료되었으면, 실행 후 설정 -> Kubenetes -> Enable Kubenetes -> Apply & restart 누르면 끝. 

왼쪽 아래 쿠버네티스 이모지와 함께 초록색으로 표시되면 성공적으로 설치가 된 것이다. 

딸깍딸깍22

 

Kubeflow를 설치하기 위해 최소 8GB의 RAM, 4개 이상의 vCPU가 필수이니, Kubeflow 설치 전에 리소스 확보도 해야한다.  

Docker Desktop의 리소스 설정 UI를 통해 쉽게 확보할 수 있다. 

 

 

방법2. Minikube로 실행하기

: Minikube는 단일 노드 쿠버네티스 클러스터를 실행하는 용도이며, 설치가 간단하고 리소스 사용이 적어 많이 사용된다. 

 

 Homebrew를 사용하여 터미널에서 아래의 명령어를 통해 직접 최신 버전의 Minikube를 다운로드한다. 

brew install minikube

 

설치가 완료 되었다면, Minikube를 실행한다. 단, 이 후에 Kubeflow를 설치하기 위해서는 위에서 언급되었듯이 충분한 CPU, 메모리 등의 리소스가 필요하다. 

minikube start
// 최소 스펙
minikube start --cpus 4 --memory 8g --disk-size 20g
// 스펙 지정한 예시

minikube start \
  --cpus=2 \                       --cpus=2: 가상 머신에 할당할 CPU 코어 수를 2개로 설정
  --memory=4096 \                  --memory=4096: 가상 머신에 할당할 메모리를 4096MB (4GB)로 설정
  --disk-size=20g \                --disk-size=20g: 가상 머신의 디스크 크기를 20GB로 설정
  --driver=virtualbox \            --driver=virtualbox: 가상화 드라이버로 VirtualBox를 사용
  --kubernetes-version=v1.24.3 \   --kubernetes-version=v1.24.3: 특정 버전의 Kubernetes를 설치
  --addons=ingress,dashboard \     --addons=ingress,dashboard: ingress와 dashboard 애드온을 활성화
  --nodes=2                        --nodes=2: 2개의 노드로 구성된 클러스터를 생성

 

 

그 외에도 더 복잡한 설정이 필요하거나, 사용 목적에 따라 kind(Kubernetes in Docker), k3s, kubeadm, microk8s 등으로 K8s를 설치할 수 있다.

 

Kubeflow 설치하기 

위에서 K8s 설치를 끝냈으면, Kubeflow를 설치할 차례이다. 

 

K8s 설치와 마찬가지로 Kubeflow를 설치하는 방법도 여러가지지만, 그 중 간단하게 설치할 수 있는 방법은 Minikube를 사용하거나, KFCTL을 사용할 수 있다. 하지만, 해당 방식은 공식적으로 지원하지 않는 버전, 특정 버전까지만 release 되기 때문에 Kubeflow manifests 방식으로 설치하는 것이 가장 정석이다. 

(+ 또 다른 방법으로는 GKE(Google Kubernetes Engine)로 설치하는 방법 등이 있다.) 

 

Kubeflow manifests

먼저 Kustomize, Kubectl을 설치한다.

 

Kustomize는 Kubernetes 리소스를 YAML 파일로 정의하고 관리하는 도구로, 템플릿 기반의 Helm과 달리 Kustomize는 템플릿을 사용하지 않고 직접 YAML 파일을 편집하여 리소스를 정의한다. 

Kubectl은 Kubernetes API 서버와 상호 작용하여 클러스터를 관리하고 배포하는 도구로, Kubectl 명령으로 API 서버를 통해 클러스터의 상태를 변경하거나 정보를 가져올 수 있다.

 

kustomize 기본 구조

├── base
│   ├── deployment.yaml
│   ├── env.startup.txt
│   ├── kustomization.yaml
│   └── service.yaml
├── integration_test.sh
├── overlays
│   ├── production
│   │   ├── deployment.yaml
│   │   └── kustomization.yaml
│   └── staging
│       ├── config.env
│       ├── deployment.yaml
│       └── kustomization.yaml
└── README.md

 

깃허브에서 각 OS에 맞게 다운로드 받을 수 있다. 

https://github.com/kubernetes-sigs/kustomize/

 

또는, Homebrew를 사용하여 더 쉽게 다운 받을 수 있다. 

brew install kustomize
brew install kubectl

 

 

다음으로는 Kubeflow를 설치한다. 

 

코드를 간단히 요약하자면, 

1. 깃허브의 Kubeflow manifests를 로컬 시스템에 복제

2. manifests 디렉터리로 이동

3. kustomize, kubectl 명령어를 사용하여 K8s에 Kubeflow를 적용

4. 적용 과정에서 오류 발생하면 10초간 대기 후 다시 시도(성공할 때까지)

git clone https://github.com/kubeflow/manifests
cd manifests
while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done

 

Kubeflow를 구성하는 컴포넌트가 많고 각 컴포넌트 간의 의존성도 있어 설치하는 데에 시간이 걸린다. 5-10분 정도 기다리면 정상적으로 설치가 된다.

 

Kubeflow UI에 접속한다. 

 

아래의 명령어로 kubectl을 사용하여 Istio 서비스의 포트를 로컬 머신으로 포워딩하는 작업을 수행한다. 

 

더 쉽게 말해 , 로컬 머신의 포트 8080과 istio-system 네임스페이스에 있는 Istio 입구 게이트웨이 서비스의 포트 80 사이에 터널을 만든다. 로컬 머신의 포트 8080로 전송되는 모든 트래픽은 Istio 입구 게이트웨이의 포트 80으로 전달되어 로컬 브라우저 또는 기타 도구를 통해 Istio 서비스에 의해 노출된 리소스에 액세스할 수 있다. 

kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80

 

이제 http://localhost:8080/ 에 들어간다. 처음에 로그인 화면이 나오는데 default 값을 입력한다. 

 

Notebook 생성하기

방법1. 

오른쪽 상단에 위치한 Notebook으로, ML 연구에 필요한 개발환경을 생성할 수 있다. 

New Notebook 버튼을 누른 후, 원하는 사양의 노트북 정보를 입력하고 생성한다. 

 

생성이 완료되면, Status 버튼이 초록 체크문양으로 바뀐다. CONNECT 버튼을 클릭하여 생성한 노트북에 접속할 수 있다. 

 

방법2. 쿠버네티스 API 사용하기 

혹은 API를 호출하여 노트북을 생성할 수도 있다. K8s에서는 클러스터의 상태를 조회, 변경하도록 하는 쿠버네티스 API가 있다. 이 쿠버네티스 API를 사용하면, 

  • 리소스 관리: 파드(Pod), 서비스, 디플로이먼트 등을 생성, 수정, 삭제
  • 상태 조회: 클러스터 내 리소스의 현재 상태 확인
  • 작업 수행: 스케일링, 롤아웃, 롤백 등의 작업 실행

등의 작업을 할 수 있다. 또한 API는 

  • kubectl: 명령줄 도구로, API를 간접적으로 사용
  • REST API: HTTP 요청을 통해 직접 API와 통신
  • 클라이언트 라이브러리: 다양한 프로그래밍 언어로 API를 사용

등의 방법으로 사용 가능하다. 

Kubeflow의 노트북도 리소스에 해당하므로 API를 사용하여 노트북을 생성할 수 있다. 

 

 

+ 노트북 사용 예시) 자원 반환하기

또한, 노트북은 생성되어 있는 동안 서버 자원을 점유하고 있기 때문에 장기적으로 사용하지 않을 경우 STOP 버튼을 눌러 노트북을 중지시켜 자원을 반환해야 한다.

 

'kubeflow-user-example-com' 네임스페이스에 있는 파드 목록을 조회해보자.

중지된 노트북의 STATUS가 Terminate로 변경되었다.

 

 

+ 노트북 사용 예시) CR 수정하여 리소스 변경하기

이 때, 중지된 노트북 정보는 notebook 이라는 CR로 저장된다. CR을 수정하여 노트북을 재생성할 수도 있다. 

 

 

CR에 Kubeflow 환경에서 사용되는 Jupyter 노트북의 Kubernetes 리소스가 yaml로 정의되어 있다. 

notebook CR에 저장된 노트북 정보

 

매니페스트의 CPU 요청 코어수를 1에서 2코어로 변경하여 띄우면

 

아래처럼 노트북의 요청 코어수가 1-> 2로 변경된다. 

(+ 요청 코어수는 컨테이너가 보장받을 최소한의 CPU 리소스이며, 사용 가능하다면 더 많은 CPU 리소스를 사용할 수 있다.)

 

'DevOps, MLOps > K8s' 카테고리의 다른 글

Kubernetes (쿠버네티스, K8s)  (2) 2024.06.17