안녕하세요, 오늘은 Window os에서 쿠버네티스를 구축하고, Kubeflow가 정상적으로 동작하는지 확인해보려고 합니다.
항상 Mac 혹은 Linux Ubuntu 계열의 OS만 사용하다보니, Window로 개발환경을 구축하는게 얼마만인지 모르겠네요.
Minikube 구축, Docker 설치, Kubeflow 설치, NFS 설정 등 MLOps를 위한 end to end 개발환경을 구축해봅시다!
Windows 10 Home, 64bit
kubeflow 1.4.1
minikube 1.17.1
kubernetes 1.20.11
Kubeflow Install
- 참고 문서: https://github.com/kubeflow/manifests
+
는 그 이상의 버전입니다.
PowerShell을 이용해서 설치하겠습니다. 관리자 권한으로 실행시켜주세요.
보안정책을 수정합니다.
Get-ExecutionPolicy
가 Restricted가 아닌지 확인해야 합니다 . Set-ExecutionPolicy AllSigned
or Set-ExecutionPolicy Bypass -Scope Process
을 실행해 설정을 변경합니다.아래 명령을 복사해서 파워쉘에서 실행합니다.
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'))
choco
명령으로 chocolatey가 정상 설치되었는지 확인합니다.
choco install minikube
VM 등을 이용해 다중 노드를 않고, 가상화 드라이버 옵션을 None으로 하여 생성해보겠습니다.
이와 같은 옵션에서는 자동으로 CPUs와 Mem, disk-size 등은 최대(하드웨어의 리소스만큼)로 사용합니다.
minikube start --driver=None --kubernetes-version=1.20.11 --profile=mk
X Exiting due to DRV_UNSUPPORTED_OS: The driver 'None' is not supported on windows/amd64
minikube can be deployed as a VM, a container, or bare-metal.
위의 문구 그대로 Minikube는 가상머신이나, 컨테이너, 베어메탈로 배포가 가능합니다.
Linux의 경우 None 드라이버로, 그 자신을 이용해서 Minikube를 배포할 수도 있습니다.(GPU를 이용할 때 사용합니다)
도커는 세 OS(Linux, MacOS, Windows)에서 모두 선호되는 드라이버입니다.
도커에 익숙하니 도커로 진행해보도록 합시다.
(옵션, 추가 정보) Hyper-V, WSL2에 대한 자세한 정보는 이 링크에서 확인해주세요!
Windows 10은 Pro Version, Home Version에 따라 도커 설치에 Hyper-V를 사용할 수 있느냐 없느냐가 나뉩니다. WSL2(Windows Subsystem for Linux 2)는 공통으로 지원되니 WSL2를 이용해서 도커를 설치해봅시다.
docker install docs 공식문서
위의 링크에서 Window용 도커 데스크탑
버튼을 눌러 설치해주세요.
완료되면 시스템을 재시작합니다. 재시작 후 커널 오류가 발생하실텐데,
아래를 참고하여 WSL2 설치를 완료하고 Restart를 눌러주시면 됩니다!
wsl2kernel 페이지로 들어가서, x64 머신용 최신 WSL2 Linux 커널 업데이트 패키지
를 클릭하고 다운로드합니다. 다운로드되는 .msi
파일을 클릭하면 설치가 시작됩니다.
이제 커널 설치가 완료되었으니 Restart를 눌러줍니다.
짜잔, 도커 설치가 완료되었습니다.
학부 시절 윈도우에 도커를 설치하는게 그렇게 복잡했는데..(Home 버전에 Hyper-V를 사용하려고 이런 저런 설정을 만졌었죠..)
세상 편해졌네요.
이번엔 명령 프롬프트
로 들어갑니다. 파워쉘에선 wsl
명령어가 인식이 안되더라구요.
맥송이라 죄송합니다..
wsl --set-version 2
wsl -l -v
디폴트 wsl 버전을 변경하고 도커의 wsl 버전을 확인합니다.
도커 데스크탑을 실행 한 후 설정-일반으로 들어갑니다.
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
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
를 입력하지 않아도 됩니다.
minikube config set profile mk
를 통해 기본 프로필을 설정해줍니다.
doskey, 레지스트리를 이용한 alias를 등록해두려고 했는데, 두 방법 모두 다 이슈가 있어서 보류합니다.
==============
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을 포함하고 있습니다.
kubectl version --short
아래에 설치할 Kubeflow 설치 과정이 Kustomize 4.x 버전과 호환되지 않기 때문에 3.x버전을 설치합니다.
$ choco install kustomize --version=3.8.4
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
while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done
while($true) {kustomize build example | kubectl apply -f -}
위 링크에서 렌즈를 설치합니다.
이 컴퓨터틀 사용하는 모든 사용자를 대상으로 설치해주시고, 경로는 디폴트에서 수정하지 않습니다.
저는 깃허브로 로그인했습니다. 가입이나, 깃허브나, 구글이나 편한 방식을 사용하시면 됩니다.
Cluster
를 클릭하면, ~\.kube\config
에서 클러스터 정보를 읽어와서 존재하는 클러스터를 보여줍니다.Add to Hotbar
기능이 지원되니 핫바에 올려놓고 쓰도록 합시다.workload-overview
을 클릭한 후 네임스페이스를 all namespace
로 변경해줍니다.클러스터 및 Kubeflow 이슈 해결
섹션에서 해결방법을 확인해보세요!minikube dashboard(쿠버네티스 모니터링)은 minikube dashboard
로 자동실행할 수 있습니다.
Kubeflow dashboard는 포트 포워딩을 이용합니다. kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80
localhost:8080
으로 접근할 수 있습니다.Minikube의 가장 큰 장점은 뭐니뭐니 해도 문제가 있으면 그냥 날려버리면.. 된다 입니다.
Kubeflow는 원래 설치와 삭제가 꽤나 복잡하게 다양한 리소스로 이루어져 있습니다.
모든 리소스에 대해서 finalize를 설정해주어야 하고, CRD도 삭제해야 하고...
이런 방식으로 삭제를 해야하는 경우가 없길 바랍니다. 삭제에 대한 포스팅은 옛날에 한번 한 적이 있으니 찾아보셔도 좋을 것 같습니다.
minikube 위에 kubeflow를 구축했을 경우에는 그냥 minikube 클러스터(profile)을 delete해주시면 함께 삭제됩니다.
문제가 생긴 파드의 로그를 살펴보고, 빠르게 해결하기 어려운 문제같다 싶으면 그냥 minikube delete 후 다시 start하고 kubeflow를 설치해주시는게 가장 좋습니다.
minikube delete
minikube start --driver=docker --memory=10g --cpus=4 --disk-size 100GB --kubernetes-version=1.20.11 --profile=mk2