Window에서 Minikube / Kubeflow 구축하기

노하람·2022년 5월 23일
0
post-custom-banner

개요

안녕하세요, 오늘은 Window os에서 쿠버네티스를 구축하고, Kubeflow가 정상적으로 동작하는지 확인해보려고 합니다.
항상 Mac 혹은 Linux Ubuntu 계열의 OS만 사용하다보니, Window로 개발환경을 구축하는게 얼마만인지 모르겠네요.

Minikube 구축, Docker 설치, Kubeflow 설치, NFS 설정 등 MLOps를 위한 end to end 개발환경을 구축해봅시다!

설치 환경(버전)

요구사항

+는 그 이상의 버전입니다.

  • chocolatey
    - PowerShell v3+
    - .NET Framework 4.5+

install Minikube

윈도우 패키지 관리자(chocolatey)를 설치

  1. PowerShell을 이용해서 설치하겠습니다. 관리자 권한으로 실행시켜주세요.

  2. 보안정책을 수정합니다.

    • PowerShell에서는 Get-ExecutionPolicy 가 Restricted가 아닌지 확인해야 합니다 . Set-ExecutionPolicy AllSigned or Set-ExecutionPolicy Bypass -Scope Process을 실행해 설정을 변경합니다.

  3. 아래 명령을 복사해서 파워쉘에서 실행합니다.

    Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
  4. choco 명령으로 chocolatey가 정상 설치되었는지 확인합니다.

chocolatey로 Minikube 설치

choco install minikube

쿠버네티스 클러스터 생성(실패)

VM 등을 이용해 다중 노드를 않고, 가상화 드라이버 옵션을 None으로 하여 생성해보겠습니다.
이와 같은 옵션에서는 자동으로 CPUs와 Mem, disk-size 등은 최대(하드웨어의 리소스만큼)로 사용합니다.

  • VM 처럼 일정 리소스를 분할하여 할당하지 않는다고 생각하시면 되겠습니다.
  • minikube start --driver=None --kubernetes-version=1.20.11 --profile=mk
  • 역시나 윈도우는 None 드라이버를 지원하지 않는군요.. WSL2/Docker를 구축하고 이용하겠습니다.
    - X Exiting due to DRV_UNSUPPORTED_OS: The driver 'None' is not supported on windows/amd64

Minikube Driver 설정

minikube can be deployed as a VM, a container, or bare-metal.

위의 문구 그대로 Minikube는 가상머신이나, 컨테이너, 베어메탈로 배포가 가능합니다.
Linux의 경우 None 드라이버로, 그 자신을 이용해서 Minikube를 배포할 수도 있습니다.(GPU를 이용할 때 사용합니다)

도커는 세 OS(Linux, MacOS, Windows)에서 모두 선호되는 드라이버입니다.
도커에 익숙하니 도커로 진행해보도록 합시다.

Install Docker

(옵션, 추가 정보) Hyper-V, WSL2에 대한 자세한 정보는 이 링크에서 확인해주세요!

Windows 10은 Pro Version, Home Version에 따라 도커 설치에 Hyper-V를 사용할 수 있느냐 없느냐가 나뉩니다. WSL2(Windows Subsystem for Linux 2)는 공통으로 지원되니 WSL2를 이용해서 도커를 설치해봅시다.
docker install docs 공식문서

위의 링크에서 Window용 도커 데스크탑 버튼을 눌러 설치해주세요.
완료되면 시스템을 재시작합니다. 재시작 후 커널 오류가 발생하실텐데,
아래를 참고하여 WSL2 설치를 완료하고 Restart를 눌러주시면 됩니다!

리눅스 커널(WSL2) 설치/업데이트

wsl2kernel 페이지로 들어가서, x64 머신용 최신 WSL2 Linux 커널 업데이트 패키지를 클릭하고 다운로드합니다. 다운로드되는 .msi 파일을 클릭하면 설치가 시작됩니다.

이제 커널 설치가 완료되었으니 Restart를 눌러줍니다.

짜잔, 도커 설치가 완료되었습니다.
학부 시절 윈도우에 도커를 설치하는게 그렇게 복잡했는데..(Home 버전에 Hyper-V를 사용하려고 이런 저런 설정을 만졌었죠..)
세상 편해졌네요.

이번엔 명령 프롬프트로 들어갑니다. 파워쉘에선 wsl 명령어가 인식이 안되더라구요.
맥송이라 죄송합니다..
wsl --set-version 2
wsl -l -v
디폴트 wsl 버전을 변경하고 도커의 wsl 버전을 확인합니다.

도커 설치 후 WSL2 설정

Docker Desktop WSL 2 backend

도커 데스크탑을 실행 한 후 설정-일반으로 들어갑니다.
Use the WSL 2 based engine이 설정되어 있는지 확인합니다.
안되어 있다면 체크 후 Apply&Restart를 진행합니다.

다음으로 왼쪽 사이드바에서 Resource > WSL Integration 메뉴로 이동합니다.

’Enable Integration with my default WSL distro’에 체크되어있는지 확인합니다. 체크가 되어있지 않을 텐데 체크하고 오른쪽 아래의 Apply & Restart 버튼을 클릭해주면 도커 엔진이 재실행됩니다. (distro warning은 무시해주셔도 됩니다.)

도커가 정상적으로 동작하는지 마지막으로 확인해봅시다.
docker run -p 4567:80 -d nginx:latest

잘 되는군요, 이미지를 삭제하고 마무리합시다.

$ docker rm -f $(docker ps -aq --filter ancestor=nginx:latest)
$ docker rmi nginx:latest

자, 도커 설정이 끝났습니다. 고생하셨습니다! 이제 Minikube 클러스터 생성으로 돌아가볼까요?

쿠버네티스 클러스터 생성

가상화 드라이버를 이용하면 할당할 cpu나 메모리, 디스크 사이즈, 다중 노드 등의 추가적인 설정이 가능해집니다.

  • minikube start --driver=docker --memory=12g --cpus=4 --disk-size 80GB --kubernetes-version=1.20.11 --profile=mk
  • 혹시 리소스를 제한하거나 다중 노드를 사용하고 싶으면, 아래와 같이 수정해주시면 되겠습니다. Kubeflow에서 요구하는 리소스가 꽤 많으니 주의하시고, Minikube 또한 2cpus, 2GB of free memory, 20GB of free disk space는 기본 요구 조건입니다.
    - minikube start --driver=docker --memory=12g --cpus=8 --disk-size 40GB --kubernetes-version=1.20.11 --nodes=2 --profile=mk

cpus, memory 옵션을 주지 않으면 Default가 2, 2200MB군요. Kubeflow를 돌리기엔 너무너무 부족합니다. MLOps를 위해 활용되는 툴이 많아서요. minikube delete -p mk를 이용해 클러스터를 삭제하고 재생성하였습니다. 또한 굳이 워커 노드까지 돌릴만큼 시스템의 리소스가 여유롭지 않아 단일 노드로 생성하겠습니다.

시간이 꽤 걸리는군요.

위와 같은 화면이 나오면 정상적으로 구축된 것입니다.

기본 설정

기본적인 설정을 진행하겠습니다.
아까 --profile=mk 로 생성한 것 기억나시나요? 기본 프로필을 설정해주어야 minikube 명령어를 입력할 때 추가로 -p mk를 입력하지 않아도 됩니다.

  1. minikube config set profile mk를 통해 기본 프로필을 설정해줍니다.

  2. doskey, 레지스트리를 이용한 alias를 등록해두려고 했는데, 두 방법 모두 다 이슈가 있어서 보류합니다.

==============

Install Kubeflow

  • minikube에 Kubeflow 1.4.1을 설치합니다.
    - 5월부로 AWS EKS도 Kubeflow 1.4.1을 공식 지원하기 시작했습니다. 드디어 EKS에서도 수월한 Kubeflow 구축이 가능하겠네요.

  • Kubeflow 설치 방식이 버전 1.2까지는 kfctl를 사용하였으나, 1.3부터는 kustomize를 사용합니다.

  • Kubeflow 1.4.1는 Istio 1.9.6, Knative 0.22.1을 포함하고 있습니다.

  1. 클러스터와 상호작용(클러스터 시작 후 아래의 kubectl 설명을 더 읽고 진행하시면 도움이 되겠습니다.)
  • kubectl
    - kubectl version --short
  1. Kustomize
    ✓ Kustomize는 kustomization 파일을 통해 Kubernetes 오브젝트를 사용자가 원하는 대로 변경하는(customize) 툴입니다.
    ✓ 본 문서에서는 맥에 설치되어 있는 kustomize (v4.0.5)를 사용하였습니다.
    ✓ Kubeflow 문서에서는 kustomize 4.x 최신 버전과는 호환되지 않으며 3.2.0 사용을 권고하고 있습니다.

Install Kustomize

  • PowerShell을 이용합니다.

아래에 설치할 Kubeflow 설치 과정이 Kustomize 4.x 버전과 호환되지 않기 때문에 3.x버전을 설치합니다.

$ choco install kustomize --version=3.8.4

Install Kubeflow

  • Kubeflow를 설치하는 방법으로는 단일 명령어 설치와 개별 컴포넌트 설치가 있습니다.
    - 개별 컴포넌트 설치는 고급 사용자용입니다. KFServing만 이용한다 등 필요에 따라 선택해서 설치할 수도 있지만 Kubeflow 자체가 연관되어 사용되는 툴이 많고 버전 관리가 힘들어 단일 명령어 설치를 추천드립니다.

  • github에서 Kubeflow Manifests 최신 소스를 복제한다.
    choco install git
    refrestenv

  • git --version이 오류난다면, 파워쉘을 종료했다 재시작합니다.

$ cd ~/Desktop/
$ mkdir minikube
$ cd minikube
$ git clone https://github.com/kubeflow/manifests.git
$ cd manifests 
  • Kubeflow 1.4.1를 단일 명령어로 설치합니다.
    while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done
  • Windows PowerShell의 경우.
    while($true) {kustomize build example | kubectl apply -f -}

Lens로 쿠버네티스 리소스 모니터링/수정/생성

Windows Lens 설치

위 링크에서 렌즈를 설치합니다.
이 컴퓨터틀 사용하는 모든 사용자를 대상으로 설치해주시고, 경로는 디폴트에서 수정하지 않습니다.

저는 깃허브로 로그인했습니다. 가입이나, 깃허브나, 구글이나 편한 방식을 사용하시면 됩니다.

  1. Cluster를 클릭하면, ~\.kube\config에서 클러스터 정보를 읽어와서 존재하는 클러스터를 보여줍니다.
    • 앞서 설치한 mk(profile)이 있습니다. 마우스를 올리면 Add to Hotbar 기능이 지원되니 핫바에 올려놓고 쓰도록 합시다.
    • 더블클릭해서 클러스터에 접속해주세요!
  2. workload-overview 을 클릭한 후 네임스페이스를 all namespace로 변경해줍니다.
    • 현재 68개의 파드 중 2개가 문제가 있군요, 앞선 실습에선 문제점을 해결하고 진행했으니 모두 정상 파드로 올라오신 걸 확인하시면 되겠습니다.
    • 이렇게 문제가 있을 경우 아래 클러스터 및 Kubeflow 이슈 해결 섹션에서 해결방법을 확인해보세요!
    • 아래는 모든 파드가 정상적으로 가동하는 모습입니다.

Kubeflow Central Dashboard 접속

  1. minikube dashboard(쿠버네티스 모니터링)은 minikube dashboard로 자동실행할 수 있습니다.

  2. Kubeflow dashboard는 포트 포워딩을 이용합니다. kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80

    • 포트 포워딩 후 localhost:8080으로 접근할 수 있습니다.
    • 아래 내용은 Windows에선 정상적으로 동작하지 않는 것을 확인하였습니다. 포트포워딩을 이용해주세요.

클러스터 및 Kubeflow 이슈 해결

Minikube의 가장 큰 장점은 뭐니뭐니 해도 문제가 있으면 그냥 날려버리면.. 된다 입니다.
Kubeflow는 원래 설치와 삭제가 꽤나 복잡하게 다양한 리소스로 이루어져 있습니다.
모든 리소스에 대해서 finalize를 설정해주어야 하고, CRD도 삭제해야 하고...
이런 방식으로 삭제를 해야하는 경우가 없길 바랍니다. 삭제에 대한 포스팅은 옛날에 한번 한 적이 있으니 찾아보셔도 좋을 것 같습니다.

minikube 위에 kubeflow를 구축했을 경우에는 그냥 minikube 클러스터(profile)을 delete해주시면 함께 삭제됩니다.
문제가 생긴 파드의 로그를 살펴보고, 빠르게 해결하기 어려운 문제같다 싶으면 그냥 minikube delete 후 다시 start하고 kubeflow를 설치해주시는게 가장 좋습니다.

  1. minikube delete

  2. minikube start --driver=docker --memory=10g --cpus=4 --disk-size 100GB --kubernetes-version=1.20.11 --profile=mk2

    • 혹시 모르니 profile 이름은 다르게 설정해주었습니다.
profile
MLOps, MLE 직무로 일하고 있습니다😍
post-custom-banner

0개의 댓글