온프레미스로 쿠버플로 1.4 인프라 구축하기!

노하람·2022년 1월 7일
0

안녕하세요!
오늘은 문제가 많은 AWS(EKS) 인프라를 기반으로 구축하는 Kubeflow 1.2 버전이 아닌,
온프레미스 환경에서(Minikube를 이용합니다!) Kubeflow 1.4버전을 구축해보도록 하겠습니다.

개요

  • minikube에 Kubeflow 1.4.1을 설치한다.

  • Kubeflow 설치 방식이 버전 1.2까지는 kfctl를 사용하였으나, 1.3부터는 kustomize를 사용한다.
    - 이전에 AWS 상에 쿠버플로를 구축하였을 때 계속 kfctl을 사용하신 것 기억하시나요?

    ✓ kfctl is a CLI for deploying and managing Kubeflow, Latest release: 1.2.0(21 Nov 2020), https://github.com/kubeflow/kfctl

     ▷ Kubeflow 1.2 in On-prem 구성
    
     ▷ Kubeflow 1.2 in Minikube 구성

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

설치 환경(버전)

Minikube install

  1. 미니큐브 공식 홈페이지를 통해 brew install을 진행하겠습니다.

  2. 내 맥의 환경정보을 확인합니다.(https://luran.me/403)

    • 사실 brew를 통한 install은 자세한 사양을 확인할 필요가 없습니다 ㅎㅎ
    • 프로세서 이름: 쿼드 코어 Intel Core i5 -> 64비트(x86-64를 깔면 되겠죠?)
  3. 드라이버를 설치합니다.

    • brew install hyperkit

How to use Minikube

앞으로 Minikube kubectl을 이용해 작업을 진행할 것이기 때문에,
간단하게 미니쿠버를 어떻게 이용하는지 살펴봅시다.

  1. 클러스터 시작
    관리자 액세스 권한이 있는 터미널에서(루트로 로그인하지 않음) 다음을 실행합니다.
  • minikube start --driver=hyperkit --kubernetes-version=1.20.11 --memory=8g —cpus=4 --profile kf-1.4
  • CPU 제한으로 PODS가 자꾸 Pending 상태에서 진행하지 않아 사양을 높혔습니다. minikube start --driver=hyperkit --kubernetes-version=1.20.11 --memory=12288 —cpus=6 --disk-size=55g --profile mk
(base) noharam@nohalam-ui-MacBookPro ~ % minikube start --driver=hyperkit --kubernetes-version=1.20.11 --memory=8g —cpus=4 --profile kf-1.4
😄  [kf-1.4] Darwin 12.0.1 의 minikube v1.24.0
✨  유저 환경 설정 정보에 기반하여 hyperkit 드라이버를 사용하는 중
💾  드라이버 docker-machine-driver-hyperkit 다운로드 중 :
    > docker-machine-driver-hyper...: 65 B / 65 B [----------] 100.00% ? p/s 0s
    > docker-machine-driver-hyper...: 8.35 MiB / 8.35 MiB  100.00% 6.55 MiB p/s
🔑  The 'hyperkit' driver requires elevated permissions. The following commands will be executed:

    $ sudo chown root:wheel /Users/noharam/.minikube/bin/docker-machine-driver-hyperkit 
    $ sudo chmod u+s /Users/noharam/.minikube/bin/docker-machine-driver-hyperkit 


Password:
💿  가상 머신 부트 이미지 다운로드 중 ...
    > minikube-v1.24.0.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
    > minikube-v1.24.0.iso: 225.58 MiB / 225.58 MiB [] 100.00% 5.68 MiB p/s 40s
👍  kf-1.4 클러스터의 kf-1.4 컨트롤 플레인 노드를 시작하는 중
💾  쿠버네티스 v1.20.11 을 다운로드 중 ...
    > preloaded-images-k8s-v13-v1...: 471.84 MiB / 471.84 MiB  100.00% 5.35 MiB
🔥  hyperkit VM (CPUs=2, Memory=8192MB, Disk=20000MB) 를 생성하는 중 ...
🐳  쿠버네티스 v1.20.11 을 Docker 20.10.8 런타임으로 설치하는 중
    ▪ 인증서 및 키를 생성하는 중 ...
    ▪ 컨트롤 플레인이 부팅...
    ▪ RBAC 규칙을 구성하는 중 ...
🔎  Kubernetes 구성 요소를 확인...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  애드온 활성화 : storage-provisioner, default-storageclass

❗  /usr/local/bin/kubectl is version 1.23.1, which may have incompatibilites with Kubernetes 1.20.11.
    ▪ Want kubectl v1.20.11? Try 'minikube kubectl -- get pods -A'
🏄  끝났습니다! kubectl이 "kf-1.4" 클러스터와 "default" 네임스페이스를 기본적으로 사용하도록 구성되었습니다.
(base) noharam@nohalam-ui-MacBookPro ~ % minikube addons list -p kf-1.4
|-----------------------------|---------|--------------|-----------------------|
|         ADDON NAME          | PROFILE |    STATUS    |      MAINTAINER       |
|-----------------------------|---------|--------------|-----------------------|
| ambassador                  | kf-1.4  | disabled     | unknown (third-party) |
| auto-pause                  | kf-1.4  | disabled     | google                |
| csi-hostpath-driver         | kf-1.4  | disabled     | kubernetes            |
| dashboard                   | kf-1.4  | disabled     | kubernetes            |
| default-storageclass        | kf-1.4  | enabled ✅   | kubernetes            |
| efk                         | kf-1.4  | disabled     | unknown (third-party) |
| freshpod                    | kf-1.4  | disabled     | google                |
| gcp-auth                    | kf-1.4  | disabled     | google                |
| gvisor                      | kf-1.4  | disabled     | google                |
| helm-tiller                 | kf-1.4  | disabled     | unknown (third-party) |
| ingress                     | kf-1.4  | disabled     | unknown (third-party) |
| ingress-dns                 | kf-1.4  | disabled     | unknown (third-party) |
| istio                       | kf-1.4  | disabled     | unknown (third-party) |
| istio-provisioner           | kf-1.4  | disabled     | unknown (third-party) |
| kubevirt                    | kf-1.4  | disabled     | unknown (third-party) |
| logviewer                   | kf-1.4  | disabled     | google                |
| metallb                     | kf-1.4  | disabled     | unknown (third-party) |
| metrics-server              | kf-1.4  | disabled     | kubernetes            |
| nvidia-driver-installer     | kf-1.4  | disabled     | google                |
| nvidia-gpu-device-plugin    | kf-1.4  | disabled     | unknown (third-party) |
| olm                         | kf-1.4  | disabled     | unknown (third-party) |
| pod-security-policy         | kf-1.4  | disabled     | unknown (third-party) |
| portainer                   | kf-1.4  | disabled     | portainer.io          |
| registry                    | kf-1.4  | disabled     | google                |
| registry-aliases            | kf-1.4  | disabled     | unknown (third-party) |
| registry-creds              | kf-1.4  | disabled     | unknown (third-party) |
| storage-provisioner         | kf-1.4  | enabled ✅   | kubernetes            |
| storage-provisioner-gluster | kf-1.4  | disabled     | unknown (third-party) |
| volumesnapshots             | kf-1.4  | disabled     | kubernetes            |
|-----------------------------|---------|--------------|-----------------------|
(base) noharam@nohalam-ui-MacBookPro ~ % minikube profile list
|---------|-----------|---------|--------------|------|----------|---------|-------|
| Profile | VM Driver | Runtime |      IP      | Port | Version  | Status  | Nodes |
|---------|-----------|---------|--------------|------|----------|---------|-------|
| kf-1.4  | hyperkit  | docker  | 192.168.64.2 | 8443 | v1.20.11 | Running |     1 |
|---------|-----------|---------|--------------|------|----------|---------|-------|
  1. 클러스터와 상호작용(클러스터 시작 후 아래의 kubectl 설명을 더 읽고 진행하시면 도움이 되겠습니다.)
  • kubectl
    - kubectl version --short

    • 위에서 설치후 kubectl이 "kf-1.4" 클러스터와 "default" 네임스페이스를 기본적으로 사용하도록 구성되었습니다 라고 하나 /usr/local/bin/kubectl에 미리 구성해둔 버전이 1.23.1 버전이기 때문에 방금 설치한 1.20.11 버전을 사용하기 위해선 'minikube kubectl -- get pods -A'를 이용하라고 하네요.
  • kubectl이 이미 설치되어 있다면 이제 이를 사용하여 새 클러스터에 액세스할 수 있습니다.
    - kubectl get po -A

    • 다만 저는 AWS kubeflow 환경에서 사용하던 kubectl과 혼동되지 않도록 별칭을 따로 설정해서 사용하도록 하겠습니다. alias k="kubectl"
    • 저는 minikube kubectl -- get pods -A을 입력했을 때 미니쿠브 서버를 찾지 못하는 오류가 있었습니다. 이유는 모르겠지만, kubectl이 방금 설치한 쿠버네티스를 잘 인식하는 것을 확인했기 때문에 일단 진행합니다!
  • 대시보드도 확인해봅시다. minikube dashboard -p kf-1.4
    - 프로필을 설정해주면 minikube 명령 입력시 프로필을 지정해주지 않아도 됩니다. minikube profile kf-1.4 -> minikube dashboard 가 가능해집니다.

  • 추가적으로 AWS와 컨텍스트 등을 혼동하지 않기 위해 현재 컨텍스트가 잘 설정되어있나 확인을 진행했습니다.

(base) noharam@nohalam-ui-MacBookPro ~ % kubectl config current-context
kf-1.4
(base) noharam@nohalam-ui-MacBookPro ~ % kubectl config get-clusters   
NAME
kf-1.4
arn:aws:eks:ap-northeast-2:174950111464:cluster/automl-dsme-knu
arn:aws:eks:ap-northeast-2:174950111464:cluster/environment-predict
(base) noharam@nohalam-ui-MacBookPro ~ % kubectl config get-user    
error: unknown command "get-user"
See 'kubectl config -h' for help and examples
(base) noharam@nohalam-ui-MacBookPro ~ % kubectl config get-users
NAME
arn:aws:eks:ap-northeast-2:174950111464:cluster/automl-dsme-knu
arn:aws:eks:ap-northeast-2:174950111464:cluster/environment-predict
kf-1.4
  1. 미니쿠버의 서비스 및 로드밸런서에 대해서는 추후에 더 알아보도록 하겠습니다.

Prerequisites

  • Kubernetes

    • Minikube에서 Kubeflow가 설치/실행 될 수 있도록 리소스(CPU/Memory)를 할당,
      kubernetes 1.20.11를 설치한다.

    • minikube start --driver=hyperkit --kubernetes-version=1.20.11 --memory=8g —cpus=4 --profile kf-1.4

    • kubeflow 설치에 필요한 default storageclass는 자동으로 구성된다.

  • Kustomize

    ✓ Kustomize는 kustomization 파일을 통해 Kubernetes 오브젝트를 사용자가 원하는 대로 변경하는(customize) 툴이다.

    ✓ 본 문서에서는 맥에 설치되어 있는 kustomize (v4.0.5)를 사용하였다.

    ✓ Kubeflow 문서에서는 kustomize 4.x 최신 버전과는 호환되지 않으며 3.2.0 사용을 권고하고 있다.

Install Kustomize

wget https://github.com/kubernetes-sigs/kustomize/releases/download/v3.2.0/kustomize_3.2.0_darwin_amd64
chmod +x kustomize_3.2.0_darwin_amd64
mv kustomize_3.2.0_darwin_amd64 /usr/local/bin/kustomize
export PATH=$PATH:/usr/local/bin/kustomize
(base) noharam@nohalam-ui-MacBookPro kustomize % kustomize version
Version: {KustomizeVersion:3.2.0 GitCommit:a3103f1e62ddb5b696daa3fd359bb6f2e8333b49 BuildDate:2019-09-18T16:26:36Z GoOs:darwin GoArch:amd64}

Install Kubeflow

  • Kubeflow를 설치하는 방법으로는 단일 명령어 설치와 개별 컴포넌트 설치가 있다.

  • github에서 Kubeflow Manifests 최신 소스를 복제한다.
    git clone https://github.com/kubeflow/manifests.git

(base) noharam@nohalam-ui-MacBookPro minikube % git clone https://github.com/kubeflow/manifests.git
'manifests'에 복제합니다...
remote: Enumerating objects: 24463, done.
remote: Counting objects: 100% (18/18), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 24463 (delta 5), reused 8 (delta 2), pack-reused 24445
오브젝트를 받는 중: 100% (24463/24463), 41.43 MiB | 5.49 MiB/s, 완료.
델타를 알아내는 중: 100% (14559/14559), 완료.
Updating files: 100% (7077/7077), 완료.
(base) noharam@nohalam-ui-MacBookPro minikube % ls
manifests
(base) noharam@nohalam-ui-MacBookPro minikube % cd manifests 
(base) noharam@nohalam-ui-MacBookPro manifests % 
  • Kubeflow 1.4.1를 단일 명령어로 설치한다.
    while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done
  • Kubeflow의 Pod들이 정상적으로 기동 되었는지 확인한다.
    - 저는 cpus:4, memory=8196으로 설정했음에도 메모리가 부족해서 13개 정도의 pods가 계속 pending 상태로 진행하지 못하고 있습니다. 심지어 memory를 16g로 올려서 설정해도 마찬가지입니다.
    • 설정 변경은 1. minikube stop 2. vim ~/.minikube/config/config.json(설정 변경 후 저장해주세요) 3. minikube start 입니다.
    • 해당 방식으로는 hyperkit 드라이버로 설치한 경우에 가능하다는 이야기가 있습니다. 혹시 안될 경우 minikube delete로 클러스터를 삭제한 후 설정을 바꿔 새로 클러스터를 생성하시기 바랍니다.

Kubeflow Central Dashboard 접속

  • Dashboard에 접속하기 위한 URL 정보를 조회한다.
    - Kubeflow Central Dashboard는 Istio를 통해서 제공되기 때문에 istio-ingressgateway 서비스의 NodePort 정보를 알아야 합니다.
    • k get svc istio-ingressgateway -n istio-system
    • 서비스 리스트에서 http2/80의 URL를 찾아서 접속해주시면 됩니다!
(base) noharam@nohalam-ui-MacBookPro manifests % minikube profile mk
✅  minikube profile was successfully set to mk
(base) noharam@nohalam-ui-MacBookPro manifests % m service list
|---------------------------|-----------------------------------------------------------|-------------------|---------------------------|
|         NAMESPACE         |                           NAME                            |    TARGET PORT    |            URL            |
|---------------------------|-----------------------------------------------------------|-------------------|---------------------------|
| auth                      | dex                                                       | dex/5556          | http://192.168.64.5:32000 |
| cert-manager              | cert-manager                                              | No node port      |
| cert-manager              | cert-manager-webhook                                      | No node port      |
| default                   | kubernetes                                                | No node port      |
| istio-system              | authservice                                               | No node port      |
| istio-system              | cluster-local-gateway                                     | No node port      |
| istio-system              | istio-ingressgateway                                      | status-port/15021 | http://192.168.64.5:30850 |
|                           |                                                           | http2/80          | http://192.168.64.5:31050 |
|                           |                                                           | https/443         | http://192.168.64.5:30199 |
|                           |                                                           | tcp/31400         | http://192.168.64.5:30602 |
|                           |                                                           | tls/15443         | http://192.168.64.5:30088 |
| istio-system              | istiod                                                    | No node port      |

컴포넌트 간 데이터 패싱 예제 실험

AWS에서 한달 간 별의 별 방법을 다 써서 해결방법을 찾아도 실패했던
컴포넌트간 아티팩트 전달 파이프라인입니다..
과연 온프레미스 환경에서는 동작할까요!?!?!?

와... 됩니다.... 감동.......
이 예제 토대로 데이터 패싱 연습해서 실무에 바로 적용해보도록 하겠습니다!

Minikube 추가 기능

+ Minikube Cache 공유

다중 노드로 구성

https://minikube.sigs.k8s.io/docs/tutorials/multi_node/
minikube start --driver=hyperkit --kubernetes-version=1.23.1 --memory=max —cpus=max --disk-size=55g --nodes 3 --profile miku

profile
MLOps, MLE 직무로 일하고 있습니다😍

0개의 댓글