1. 개요

지난 글에 이어서 이번에는 kubeflow를 사용해서 데이터 전처리, 모델 학습, 평가까지의 파이프라인을 작성, 구동해보았다. 파이썬에는 kubeflow pipeline 작성을 위해 kfp 라는 라이브러리가 있는데 이를 활용해서 진행했다. 

2. 사용환경

OS: 윈도우 11

3. 파이프라인

Kubeflow에서 파이프라인을 작성하는 방법에는 크게 2가지 정도의 방향이 있다. 첫번째는 도커 이미지 단위, 두 번째는 함수 단위로 컴포넌트를 구성해서 파이프라인을 이어주는 방법이다. 첫 번째 방법은 kfp 라이브러리의 dsl 에서 ContainerOp 라는 함수를 사용해서 형성할 수 있다.

3.1 docker recret

kubeflow 파이프라인을 작성하는 방법은 여러가지가 있지만 보통 이미지 방식을 선택하는 것 같았다. 그래서 나도 이미지 기반의 파이프라인을 선택했으며 이때 kubernetes 에서 이미지를 당겨오려면 이미지 저장소에 인증할 정보를 미리 저장해두어야 한다. 여기서는 docker recret이라는 이름의 인증 정보를 미리 형성하여 개인 도커 허브 로그인 정보를 저장해두었다. 쿠버네티스를 시작한 후에 파이프라인이 동작할 네임 스페이스에서 시크릿을 형성해주면 된다.

kubectl create secret docker-registry --docker-server=https://index.docker.io/v1/ --docker-username={아이디} --docker-password={비밀번호} --docker-email={이메일}

위의 커맨드를 입력하면 docker secret이 형성된다. 비밀번호는 도커에 로그인할때 입력하는 실제 비밀번호가 아니라 개인 설정/security 에서 토큰을 발급받은 뒤에 해당 토큰을 입력해야 한다. 깃허브처럼 토큰을 형성하고 개인적으로 저장해두지 않으며 나중에 토큰을 다시 형성하는 번거로움이 있으니까 미리 저장해두자. 시크릿을 형성한 후에는 혹시 모르니까 제대로 시크릿이 형성되었는지 확인해야 한다.

 

3.2 Image based component

 data_op = dsl.ContainerOp(
    	name="example component",
        image="example_image/latest"
    ).add_volume(
    	k8s_client.V1Volume(
        	name='data-pvc'
        )
    )

위의 예시처럼 kubeflow ui 상에서 표시할 name과 pull할 베이스 이미지를 설정해주면 해당 이미지를 가져와서 자동으로 실행해주는 방식으로 동작한다. 그리고 예시처럼 add_volume이라는 메소드를 사용하면 원하는 저장소를 마운트할 수 있으며 해당 방식으로 파이프라인 컴포넌트간의 저장소를 공유할 수 있다.

다만 위처럼 이미지 방식의 파이프라인은 kubeflow에서 권장하는 방식은 아니며, kubeflow는 재사용가능한 형태의 파이프라인을 작성하는 것을 권장한다. 사용 방식에 익숙해지는 것에 시간이 조금 걸리긴 했지만 확실히 재사용가능한 함수 형태의 파이프라인을 작성하는 것이 수정, 관리에 훨씬 편하다는 느낌을 받았다.

3.3 function based component

두 번째 방식인 함수 형태의 컴포넌트 구성은 kfp.components의 create_component_from_func 이라는 함수를 사용해서 사용할 수 있다.

def example_component(ex_arg='test'):

    from library_to_use import example
   
    result = do_something_u_want(ex_arg)
    return result
    
@dsl.pipeline(
    name='Pipeline'
) 
def pipeline():
    example_op = comp.create_component_from_func(example_component)
    example_op = data_op(ex_arg='test')
    example_op.apply(onprem.mount_pvc(pvc_name="phmpipeline", volume_name='test-phm', volume_mount_path=volume_path))

해당 함수의 사용 방식은 조금 유의할 사항이 있다. 원하는 동작을 하는 함수 내에서 모든 것을 수행해야하며 이것은 필요한 라이브러리를 import 하는 것까지 포함한다. 이때 나는 약간의 문제가 생겼었는데 내가 만든 모델을 사용할 수가 없었다는 점이었다. 내가 작성한 모델을 포함해서 모든 내가 작성한 함수를 사용하려면 파이썬 기본 경로에 내가 만든 코드들을 넣어줘야 했는데 그렇게 되면 이후 관리가 너무 힘들고 번거로울 것 같다는 생각이 들었다. 그래서 생각한 방법은 작성한 모든 코드들을 담은 이미지 파일을 하나 형성하고 해당 이미지를 불러오면서 PYTHONPATH에 추가하고 그 위에서 component가 돌도록 설정하는 것이었다. 이것도 마찬가지로 번거롭지만 딱히 떠오르는 방식이 없었다. 함수 방식의 component가 이미지를 불러오려면 아래처럼 인자만 추가해주면 되었다.

example_op = comp.create_component_from_func(example_component, base_image=BASE_IMAGE_URL)

이때 BASE_IMAGE_URL은 이미지를 당겨올 때처럼 docker pull ~~ 에서 입력하는 형태의 주소를 넣어주면 된다. 나는 도커 허브에 이미지를 업로드하여 당겨오는 방식으로 구성했으며 이미지를 빌드할때 dockerfile에서 PYTHONPATH에 코드의 경로를 추가하는 과정을 넣어주었다. 

FROM pytorch/pytorch:2.0.0-cuda11.7-cudnn8-runtime
ENV PYTHONUNBUFFERED 1
RUN mkdir /src
COPY src/ /src/
ENV PYTHONPATH="${PYTHONPATH}:/src"
ENV PYTHONPATH="${PYTHONPATH}:/src/model"
ENV PATH="${PATH}:/src"
ENV PATH="${PATH}:/src/model"
WORKDIR /src
RUN mkdir /src/pv
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

PYTHONPATH, PATH를 모두 사용한 이유는 그냥 이래야 작동해서 추가했다... 내가 작성한 코드는 모두 src 폴더에 들어있으며 dockerfile은 이미지를 사용할때 src 폴더를 복사한 후 환경변수에 추가, 그리고 해당 폴더로 이동까지 과정이다. 작업 경로를 src 폴더로 지정했기 때문에 위에서 create_component_from_func을 작성할 때는 해당 경로에 있다고 생각하고 작업을 작성해주면 된다. 이때 굉장히 헷갈린 점이 있었는데 dockerfile에서 지정한 작업 경로와 파이프라인을 작성할 때의 경로, 그리고 마지막으로 컴포넌트에서 작동하는 함수의 경로를 주의해야 한다는 것이다.

 

아까 위에서 파이프라인을 작성할 때 아래처럼 apply 함수를 사용해서 pvc를 마운트해주었다. 적어두진 않았지만 volume_path 는 /src/pv 인데 여기서 작업 경로가 이미 /src 이니까 /pv 만 적으면 될 것이라 생각했었다. 당연히 마운트는 상위 경로의 /pv로 지정되었고 내가 원하는 방향으로 파이프라인이 동작하지 않았다. 컴포넌트를 작성할 때는 이미지에서 설정한 부분은 생각하지 말고 작성해야 한다. 컴포넌트에서 사용할 함수는 도커 이미지에서 설정한 데로 진행하면 된다. 

example_op = comp.create_component_from_func(example_component)
example_op = data_op(ex_arg='test')
example_op.apply(onprem.mount_pvc(pvc_name="phmpipeline", volume_name='test-phm', volume_mount_path=volume_path))

이런 방식으로 파이프라인 컴포넌트를 하나 하나 구성해서 순서를 지정하면 문제없이 파이프라인이 구동하게 된다. 순서를 지정하는 방법은 아래처럼 after 라는 함수를 사용해서 이어주면 된다.

# data processing
comp1 = comp.create_component_from_func(func1, base_image=BASE_IMAGE_URL)
comp1 = comp1(args)
comp1.apply(onprem.mount_pvc(pvc_name="phmpipeline", volume_name='test-phm', volume_mount_path=volume_path))

# training
comp2 = comp.create_component_from_func(func2, base_image=BASE_IMAGE_URL)
comp2 = comp2(args)
comp2.apply(onprem.mount_pvc(pvc_name="phmpipeline", volume_name='test-phm', volume_mount_path=volume_path))
comp2.after(comp1)

3.4 매트릭 추가

나는 데이터 전처리-모델 학습-모델 테스트의 총 3단계로 파이프라인을 구성했다. 그리고 마지막 테스트 단계에서 모델 결과를 확인하기 위해 metrics를 추가해주었다. metric를 추가하는 방법은 아래와 같이 컴포넌트 함수에 인자를 추가해주는 방식으로 가능하다.

from kfp.components import OutputPath

...
def predict(mlpipeline_metrics_path: OutputPath("Metrics"), model_path)
	import json
    
    accuracy = test_model(model_path)
    
    metrics = {
        "metrics": [
            {
                "name": "Accuracy",
                "numberValue": accuracy
            }
        ]
    }

    print("saving mlpipline metrics")

    with open(mlpipeline_metrics_path, 'w') as f:
        json.dump(metrics, f)
        
@dsl.pipeline(
    name='Pipeline'
)        
def pipeline():
	...
    pred_op = comp.create_component_from_func(predict, base_image=BASE_IMAGE_URL)
    pred_op = pred_op(model_path='pv/result')
    ...

 

특이한 점은 predict 함수에는 첫 번째 인자로 OutputPath 가 들어가지만 컴포넌트를 형성할 때는 이것을 신경쓰지 않고 이후의 인자만 입맛대로 넣어주면 된다는 것이다. 이렇게 해주면 파이프라인이 끝난 뒤에 output 에 알아서 결과가 출력된다.

3.5 파이프라인

파이프라인을 모두 작성했다면 아래의 코드를 실행해서 yaml 파일로 파이프라인을 작성할 수 있다. compile 함수 내에는 아까 @dsl.pipeline 을 달아주었던 함수를 넣어주면 된다. 

kfp.compiler.Compiler().compile(pipeline,'{}.yaml'.format(experiment_name))

그리고 위처럼 파이썬 내에서 선언을 할 수도 있고 아래의 커맨드라인의 형태로도 컴파일 가능하다.

dsl-compile --py $base_dir/pipeline.py --output $base_dir/experiment_name.yaml

4. 파이프라인 실행

위의 과정을 통해 형성된 yaml 파일을 kubeflow ui 에 접속해서 업로드해주면 파이프라인의 과정을 그래프로 확인할 수 있다. 그리고 큰 문제가 없다면 expriment에서 실행을 했을때 성공하는 화면을 볼 수 있다.

추가로 마지막 predict 컴포넌트에 추가했던 metric도 정상적으로 출력되는 것을 확인할 수 있다.

1. 개요

MLOps를 공부하면서 자연스럽게 kubeflow를 사용하게 될 일이 많아졌다. 이미 구축이 되어있던 공용 서버에서 작업을 하다가 혼자 연습을 하고 싶어서 집에 있는 윈도우 데스크톱에 kubeflow 구축을 시도해 봤다. 작년에도 시도는 해봤다가 스펙 문제로 실패했었는데 주말을 바친 끝에 마침내 성공했다... 개인적인 의견이지만 kubeflow는 아직도 진입장벽이 너무 높다는 생각이 든다. 

2. 목차

설치 환경은 다음과 같다.

  • 운영체제: 윈도우 11 64bit
  • 환경: Docker, WSL2, Minikube v1.29.0
  • Kubeflow 관련 스펙: kustomize v3.8.4, kubeflow v1.4

3. Minikube 설치

1. Minikube는 윈도우 power shell을 사용해서 설치했다. 설치하기 전에 우선 보안정책부터 수정해야 한다. 윈도우 Power shell을 관리자 권한으로 실행한 후에 다음 명령어를 실행한다

Set-ExecutionPolicy AllSigned

다만 위의 명령어를 실행한 후에 power shell을 실행하면 "profile.ps1 파일이 디지털 서명되지 않았습니다." 라는 에러 메시지가 나왔다. 이럴 경우 권한을 unrestricted로 변경할 경우 위의 에러 메시지가 더 이상 나오지 않았다. 관련해서 검색해 본 결과 위의 방식이 조금 더 안전한 세팅이라고 한다.

Set-ExecutionPolicy Unrestricted

2. 이어서 minikube를 설치를 위해 윈도우 패키지 관리자 chocolatey를 설치한다. 

iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

3. Chocolatey가 정상적으로 설치되었다면 minikube를 설치한다.

choco install minikube

4. Docker 설치

4.1 WSL2 설치

Kubeflow는 쿠버네티스를 기반으로 하기 때문에 윈도우에서 kubeflow를 사용하려면 도커를 설치해야 한다. 그런데 윈도우에서 도커를 사용하려면 Hyper-V 설정을 허용해야 하는데 해당 설정은 윈도우 프로 버전에서만 가능한 설정이라고 한다. 그리고 윈도우 11에서는 Hyper-V 설정도 없다라고 하는데 그 부분은 정확히 확인하지 못했다. 결론적으로 나는 WSL2(Windows Subsystem for Linux 2)라는 것을 사용해서 도커를 설치해야만 했다.

 

1. 우선 power shell에서 간단한 설정을 해줘야한다.

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

2. 그 후에 아래의 링크에서 최신 패키지를 다운로드한다.

 

이전 버전 WSL의 수동 설치 단계

wsl install 명령을 사용하지 않고 이전 버전의 Windows에 WSL을 수동으로 설치하는 방법에 대한 단계별 지침입니다.

learn.microsoft.com

3. 설치하기 전에 컴퓨터를 재부팅해주고 다운로드하였던 파일을 실행해 준다.

4. 윈도우 터미널을 실행해서 아래 명령어를 실행해 준다.

wsl --set-default-version 2

4.2 Docker desktop 설치

WLS2 설치가 끝났다면 도커 데스크톱을 설치할 차례이다. 아래의 링크에서 환경에 맞는 데스크톱을 다운로드한다.

1. https://www.docker.com/products/docker-desktop/

 

Download Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

2. 설치가 끝났다면 도커 데스크톱을 실행하여 설정으로 이동한다. 설정에서 kubernetes 탭에서 관련된 설정을 모두 체크해 준 후에 재실행한다.

모든 설정이 제대로 되었다면 resources > advanced 탭에서 아래처럼 WSL2에 관련된 내용을 볼 수 있다.

3. 도커 설치까지 되었다면 minikube를 실행해서 제대로 실행이 되는지 확인한다.

minikube start --driver=docker --memory=16g --cpus=4 --disk-size 80GB --kubernetes-version=1.20.11 --profile=hm

메모리, CPU 등의 설정은 데스크톱 환경에 맞추어 변경해 주면 된다. 처음에 메모리를 12G를 할당했는데 무한 실행이 된 건지 kubeflow 가 실행되지 않았다. 넉넉하게 잡아주도록 하자. 이때 도커의 기본 설정에 의해서 데스크톱의 전체 메모리의 절반 정도로 사용량이 제한되어 있을텐데 .wslconfig 파일을 수정해서 제한량을 늘릴 수 있다. 

 

.wslconfig 파일은 기본적으로는 user/{사용자}에 자동으로 생성되나 없을 가능성도 있으며 나도 없어서 따로 형성을 해주었다. 메모장 파일이 아니라는 것을 주의해야 한다. 파일을 만들어줬다면 아래의 내용을 저장해 준다.

[wsl2]
memory=32GB
processors=6
swap=0

위의 설정을 저장해도 처음에는 도커에 반영이 되지 않았는데, 속 편하게 컴퓨터를 재부팅했더니 바로 반영이 되었다. 메모리까지 변경했다면 다시 minikube를 실행해 주자.

5. Kubeflow 설치

현재 kubeflow는 v1.6까지 배포되었다. 

Kubeflow를 설치하기 위해서는 kustomize라는 공식 패키지를 사용하면 된다. kustomize는 23.03.20 기준 v5.0.0이 최신 버전으로 아래의 링크에서 다운로드 가능하다. 현재 최신 버전의 kubeflow는 반드시 5.0 버전의 kustomize를 사용해야 한다. 

 

Release kustomize/v5.0.0 · kubernetes-sigs/kustomize

🎉The Kustomize team is so excited to release version 5.0! 🎉 This release is packed with exciting features and improvements. The full list is below, but here are some of our favorites: kustomize lo...

github.com

다만 무엇이 문제인지 kubeflow 설치가 제대로 되지 않아서 나는 kustomize v3.8.4, kubeflow v1.4를 사용했다. Kubeflow v1.4는 아래의 링크에서 branch를 변경하여 다운로드할 수 있다. 

 

GitHub - kubeflow/manifests: A repository for Kustomize manifests

A repository for Kustomize manifests. Contribute to kubeflow/manifests development by creating an account on GitHub.

github.com

Kubeflow는 2가지 설치 방법이 있다. 첫 번째는 싱글 커맨드로 간단하게 구성요소들을 설치하는 방법이며, 두 번째는 각 컴포넌트를 하나하나 직접 설치하는 방법이다. 당연히 두 번째 방법이 더 어렵고 숙련자를 위한 방법이기 때문에 나는 첫 번째 방법을 사용해서 설치를 진행했다. 윈도우 power shell을 관리자 권한으로 실행한 후에 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 -}

공식 깃허브에서도 설명하듯이 위의 명령어를 실행해도 완전하게 kubeflow가 실행되려면 꽤 시간이 걸린다. 여러 권한과 pod들이 서로 얽혀있다 보니 설치, 실행이 완료될 때까지 무한루프를 기다려야 한다...

6. Kubeflow Dashboard 접속

Kubeflow 대시보드는 포트 포워딩을 해줘야 접속이 가능하다. 윈도우 터미널에서 아래의 명령어를 실행해 준 다음에 localhost:8080으로 접속하면 대시보드를 확인할 수 있다.

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

7. 마치며...

Kubeflow 설치는 작년에도 거의 2주일을 넘게 시도했지만 실패했던 기억이 있다. 그래서 거의 반포기 상태로 공용 서버에서 작업하고 있었는데 연습을 하기에는 적절하지 못한 환경이라서 이번에 다시 집 데스크톱에 설치를 도전해 보았다. 작년보다 컴퓨터 스펙이 많이 좋아지기는 했지만 똑같은 과정으로 설치를 했는데 왜 이번에는 되는 건지 모르겠다... 물론 이번에도 쉽지는 않았다. 이번에도 거의 포기하고 자려다가 마지막으로 다시 시도했을 때 성공했는데 주말 하루를 바친 값을 한 것 같다. 최신 버전으로 구성하지 못한 게 아쉽지만 원래 최신 버전은 함부로 쓰는 게 아니니... 다음에는 kubeflow를 활용해서 pipeline을 구성해보고자 한다.

 

 

 

'1. Engineering > Kubeflow' 카테고리의 다른 글

[Kubeflow] 파이프라인 실행  (1) 2023.04.23
[Kubeflow] ENAS RNN pipeline  (0) 2022.10.20
[Kubeflow] Kubeflow 설치  (0) 2022.10.20
[Kubeflow] GNN 파이프라인  (0) 2022.10.20

소개

  • ENAS
    • NAS 기법 중 parameter sharing 기법을 제안한 모델로 학습시간을 획기적으로 단축시켰던 모델이다.
  • Pipeline
    • Docker, kubernetes, kubeflow를 사용하여 데이터 준비, 모델 학습, 서비스 제공까지 일련의 자동화 과정을 구축하는 것
  • 깃허브 링크
 

GitHub - Hyunmok-Park/enas_pipeline

Contribute to Hyunmok-Park/enas_pipeline development by creating an account on GitHub.

github.com

모델

파이프라인

  • 콤포넌트
    • train
      • ENAS의 controller, shared를 학습하는 과정으로 출력으로 최적의 모델을 찾아낸다.
    • re-train
      • train 단계에서 찾아낸 최적의 모델을 다시 scratch부터 학습하는 단계
    • serve
      • bentoML 라이브러리를 사용해서 재학습한 네트워크를 API 형태로 제공
    • 위의 과정은 오픈 소스를 그대로 활용
  • 파이프라인
    • 파이썬 kfp 라이브러리를 사용해서 pipeline을 형성한다.
    • 출력 tar 파일을 kubeflow에 업로드하면 pipeline을 사용할 수 있다.
    • 도커 이미지 파일은 개인 pc에 private registry를 형성해서 사용했다.
    • 도커 private registry 형성 방법은 따로 정리해두었다.
    • 도커 private registry 만들기
import kfp.dsl as dsl
from kubernetes import client as k8s_client

def TrainOp(vop):
    return dsl.ContainerOp(
        name="training pipeline",
        image="xx.xxx.xx.xx:5000/phm:0.1-enas-train",

        command = [
            "sh", "run_train_container.sh"
        ],

        pvolumes={"src/data": vop},
    ).add_pod_label("app", "enas-application")

def ReTrainOp(trainop):
    return dsl.ContainerOp(
        name="retraining pipeline",
        image="xx.xxx.xx.xx:5000/phm:0.1-enas-retrain",

        command = [
            "sh", "run_retrain_container.sh"
        ],

        pvolumes={"src/data": trainop.pvolume},
    ).add_pod_label("app", "enas-application")

def ServeOp(retrainop):
    return dsl.ContainerOp(
        name="serve pipeline",
        image="xx.xxx.xx.xx:5000/phm:0.1-enas-serve",
        command = [
            "sh", "run_serve_container.sh"
        ],
        pvolumes={"src/data": retrainop.pvolume},
    ).add_pod_label("app", "enas-application")

def VolumnOp():
    return dsl.PipelineVolume(
        pvc="phm-volume"
    )

@dsl.pipeline(
    name='enas_pipeline',
    description='Probabilistic inference with graph neural network'
)
def enas_pipeline(
):
    print('enas_pipeline')

    vop = VolumnOp()

    dsl.get_pipeline_conf().set_image_pull_secrets([k8s_client.V1LocalObjectReference(name='regcredidc')])

    train_and_eval = TrainOp(vop)

    retrain = ReTrainOp(train_and_eval)
    retrain.after(train_and_eval)

    serve = ServeOp(retrain)
    serve.after(train_and_eval)

if __name__ == '__main__':
    import kfp.compiler as compiler
    # compiler.Compiler().compile(enas_pipeline, __file__ + '.tar.gz')
    compiler.Compiler().compile(enas_pipeline, __file__ + '.yaml')

결과

  • 학습 파라미터
    • 데이터: PTB
python main.py --network_type rnn --dataset ptb --controller_optim adam --controller_lr 0.00035 --controller_max_step=10 --controller_hid=32 --shared_max_step=10 --shared_hid=32 --shared_embed=32 --shared_optim sgd --shared_lr 20.0 --entropy_coeff 0.0001 --num_blocks=4 --max_epoch=10 --derive_num_sample=5
  • 모델 학습 결과
    • controller, shared weight parameter.pth 파일
    • best performance DAG 를 담은 json 파일
{"-1": [[0, "identity"]], "-2": [[0, "identity"]], "0": [[1, "identity"], [2, "sigmoid"]], "1": [[3, "ReLU"]], "2": [[4, "avg"]], "3": [[4, "avg"]], "4": [[5, "h[t]"]]}
  • bentoML

  1. NFS 설정
  2. PV, PVC, StorageClass 구성
  3. Kubeflow 설치

1. NFS 설정

  • Worker node 서버를 NFS 서버로 사용

1.1 NFS 서버 구성

  • worker node 접속 후 명령 수행
$ sudo -i 
$ apt-get update 
$ apt install nfs-common nfs-kernel-server portmap 
$ mkdir /home/share/nfs -p 
$ chmod 777 /home/share/nfs 
$ vi /etc/exports
# 내용 추가 /home/share/nfs *(rw,no_root_squash,sync,insecure,no_subtree_check) # 
$ service nfs-server restart $ systemctl status nfs-server.service 
$ showmount -e 127.0.0.1 
$ mount -t nfs 192.168.72.102:/home/share/nfs /mnt

 

  • master node 접속 후 명령 수행
$ sudo -i 
$ apt-get update
$ apt install nfs-common nfs-kernel-server portmap

2. PV, PVC, StorageClass 구성

  • Master node 접속 후 yaml 파일 생성
$ vim test.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
        name: my-storageclass
provisioner: kubernetes.io/no-provisioner
parameters:
        server: 192.168.72.102
        path: /home/share/nfs
        readOnly: "false"

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pc
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.72.102
    path: /home/share/nfs

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dpl-nginx
spec:
  selector:
    matchLabels:
      app: dpl-nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: dpl-nginx
    spec:
      containers:
      - name: master
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /mnt
          name: pvc-volume
      volumes:
      - name: pvc-volume
        persistentVolumeClaim:
          claimName: nfs-pvc

$ kubectl apply -f test.yaml
$ kubectl patch storageclass my-storageclass -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
$ sudo vim /etc/kubernetes/manifests/kube-apiserver.yaml

# 내용 추가
    - --enable-admission-plugins=NodeRestriction,PodNodeSelector,DefaultStorageClass
    - --service-account-signing-key-file=/etc/kubernetes/pki/sa.key
    - --service-account-issuer=kubernetes.default.svc
#
$ kubectl taint nodes --all node-role.kubernetes.io/master-

3. Kubeflow 설치

  • Master node 접속 후 명령 수행
$ git clone https://github.com/kubeflow/manifests.git
$ cd manifests
$ git checkout tags/v1.3.1
$ wget https://github.com/kubernetes-sigs/kustomize/releases/download/v3.2.0/kustomize_3.2.0_linux_amd64 -O kustomize
$ sudo mv ./kustomize /usr/local/bin/kustomize
$ chmod 777 /usr/local/bin/kustomize
$ while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done
  • 설치완료 후 실행확인
kubectl get pod -A | egrep 'NAME|^auth|^cert-manager|^istio-system|^knative-|^kubeflow'

Trouble

  • 스펙 문제인지 현재 kubeflow관련 container들이 생성되는 도중에 VM이 다운되는 문제가 발생
    • 현재 스펙:
      • 4 CPU, Memory 12GB, VDI 100GB
 

GitHub - Hyunmok-Park/pipelines_gnn

Contribute to Hyunmok-Park/pipelines_gnn development by creating an account on GitHub.

github.com

 

+ Recent posts