이번 포스팅에서는 컨테이너, 도커 컨테이너, 도커 이미지에 대해서 알아보겠습니다. 

 

1. 컨테이너는 무엇이고, 도커는 무엇인가? (What is a Container and Docker?)

2. 왜 도커인가 (Why Docker?)

3. 도커 컨테이너 vs. 도커 이미지 (Docker Container vs. Docker Image)

 

 

1. 컨테이너는 무엇이고, 도커는 무엇인가? (What is a Container and Docker?)


컨테이너(Container)는 애플리케이션이 컴퓨팅 환경 간에 신속하고 신뢰성 있게 실행될 수 있도록 코드와 그 모든 종속성 있는 것들을 패키징하는 소프트웨어의 표준 단위입니다.도커 컨테이너 이미지(Docker container)는 어플리케이션 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정)을 포함 가볍고 스탠드얼론의 실행 가능한 소프트웨어 패키지입니다.

 

Docker (www.docker.com)



컨테이너 이미지는 실행 시 컨테이너가 되며, 도커 컨테이너의 경우 이미지가 도커 엔진에서 실행되면 컨테이너가 됩니다. 컨테이너형 소프트웨어는 Linux 기반 애플리케이션과 Windows 기반 애플리케이션 모두에서 사용할 수 있으며, 인프라스트럭처에 관계없이 항상 동일하게 실행됩니다. 컨테이너는 소프트웨어를 환경에서 격리하고 개발 및 스테이징 간의 차이에도 불구하고 균등하게 작동하도록 보장합니다.

도커 컨테이너 기술은 2013년 오픈 소스 도커 엔진으로 출시되었습니다. 도커 컨테이너는 Linux, Windows, 데이터센터, 클라우드, 서버리스 등 어디에서나 사용할 수 있습니다.[1] 

 

Docker is Everywhere (www.docker.com)

 

 


2. 왜 도커 인가? (Why Docker?)

 

오늘날 앱을 개발하려면 코드 작성 이상의 것이 필요합니다. 라이프 사이클 단계별로 여러 언어, 프레임워크, 아키텍처 및 도구 간의 불연속적인 인터페이스로 인해 엄청난 복잡성이 발생합니다. Docker는 워크플로우를 단순화하고 가속화하는 동시에 개발자가 각 프로젝트에 사용할 툴, 애플리케이션 스택 및 구현 환경을 자유롭게 선택할 수 있도록 지원합니다.

도커 컨테이너(Docker Container)와 가상 머신(Virtual Machine)은 리소스 분리 및 할당에 유사한 이점이 있지만, 도커 컨테이너는 하드웨어 대신 운영 체제(Operating System)를 가상화하기 때문에 다르게 작동합니다. 도커 컨테이너가 가상머신보다 휴대성과 효율이 뛰어납니다. [1]

 

Docker vs. Virtual Machine (www.docker.com)


기존의 가상화 기술은 하이퍼바이저를 이용해 여러 개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식이었습니다. 이러한 여러 개의 운영체제는 가상 머신이라는 단위로 구별되고, 각 가상 머신에는 우분투, CentOS 등의 운영체제가 설치되어 사용됩니다. 하이퍼바이저에 의해 생성되고 관리되는 운영체제는 게스트 운영체제(Guest OS)라고 하며, 각 게스트 운영체제는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용합니다. 이러한 가상화 방식을 사용할 수 있는 대표적인 가상화 툴로 VirtualBox, VMware 등이 있습니다. 

그러나 각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거쳐기 때문에 일반 호스트에 비해 성능의 손실이 발생합니다. 그뿐만 아니라 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을 때 이미지의 크기 또한 커집니다. 즉, 가상 머신은 완벽한 운영체제를 생성할 수 있다는 장점은 있지만 일반 호스트에 비해 성능 손실이 있으며, 수 기가바이트에 달하는 가상 머신 이미지를 애플리케이션으로 배포하기는 부담스럽다는 단점이 있습니다. 

이에 비해 도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스의 자체 기능인 chroot, namespace, cgroup 을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없습니다. 컨테이너에 필요한 커널은 호스트의 커널을 공유해 사용하고, 컨테이너 안에는 애플리케이션을 구도하는 데 필요한 라이브러리 및 실행 파일만 존재하기 때문에 컨테이너를 이미지로 만들었을 때 이미지의 용량 또한 가상 머시에 비해 대폭 줄어듭니다. 따라서 컨테이너를 이미지로 만들어 배포하는 시간이 가상 머신에 비해 빠르며, 가상화된 공간을 사용할 때의 성능 손실도 거의 없다는 장점이 있습니다. [2]

 


3. 도커 컨테이너 vs. 도커 이미지 (Docker Container vs. Docker Image)

 

 Docker 이미지와 컨테이너가 함께 작동하여 혁신적인 Docker 기술의 잠재력을 최대한 끌어낼 수 있습니다. 하지만, 그들은 특히 초보자에게는 알아차리기 어려울 수 있는 미묘한 차이를 가지고 있습니다.

 

도커 이미지(Docker Image)는 컨테이너(Container)를 만드는 데 사용되는 읽기 전용 템플릿(Read-only templates)입니다.  컨테이너(Docner Container)는 이러한 템플릿에서 생성된 배포된 인스턴스(Deployed Instances)입니다. 

 

 그들의 차이점을 비교하는 간단한 비유는 Docker 이미지를 레시피로 생각하고 Docker Container를 그 레시피에서 준비된 케이크로 생각하는 것이다. 그 요리법은 케이크를 굽는 방법을 설명하고 있다. 만약 당신이 그 레서피를 따라서 요리를 하지 않는다면, 당신은 그 케이크를 먹는 것을 즐길 수 없습니다. 마찬가지로 Docker 이미지의 지침에 따라 Docker Container 를 만들고 시작해야 Docker의 이점을 누릴 수 있습니다. 하나의 레시피에서 가능한 한 많은 케이크를 구울 수 있는 것처럼, 하나의 Docker Image로 여러 개의 Docker Container를 만들 수 있습니다. 하지만 레시피를 바꿔도 기존 케이크의 맛은 변하지 않고, 새로 구운 케이크만 수정된 레시피를 사용할 것입니다. 마찬가지로, Docker Image를 변경해도 이미 실행 중인 Docker Container에는 영향을 미치지 않습니다. 

 

 Docker Image와 Container 간의 차이점을 설명하는 표는 다음과 같습니다. [3] [4] 

 

도커 이미지 vs. 도커 컨테이너 (docker image vs. docker container)


[1] https://www.docker.com/resources/what-container/
[2] 용찬호 지음, “시작하세요! 도커 (Beginning! Docker)”, 우키북스, 2017

[3] Comparing Docker Images to Docker Containers 
  : https://www.whitesourcesoftware.com/free-developer-tools/blog/docker-images-vs-docker-containers/

[4] What is the difference between a Docker Image and a Docker Container

  : https://stackoverflow.com/questions/23735149/what-is-the-difference-between-a-docker-image-and-a-container

 

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요! 

 

 

728x90
반응형
Posted by Rfriend
,

Kubernetes 기반의 기계학습 워크플로우를 간소화해주는 Kubeflow 의 Pipelines 를 생성할 때 YAML 파일을 사용합니다. YAML 파일을 쓸 때 들여쓰기나 대소문자에 신경을 써야 하므로, 아무래도 텍스트 편집기나 vmi 편집 기능을 쓰는 것보다는 Kubernetes 를 지원하는 IDE (Integrated Development Environment) 를 사용하는 것이 코딩을 쉽고 빠르게 할 수 있도록 도와주고 또 에러가 사전에 방지할 수 있어서 여러모로 좋습니다.  

 

이번 포스팅에서는 K8s 를 지원하는 프로그래밍 IDE 중에서도 무료로 사용할 수 있는 MS 의

  (1) Visual Studio Code 를 설치하고, 

  (2) Visual Studio Code 에 Kubernetes YAML 언어 지원 확장 팩을 설치하고 설정하고, 

  (3) Visual Studio Code 의 기능 소개

를 해보겠습니다. 

 

 

 (1) Visual Studio Code 를 설치

 

Visual Studio Code 의 홈페이지인 https://code.visualstudio.com/ 에 방문해서 자신이 사용하는 컴퓨터의 OS 에 맞게 VS Code 설치 파일을 다운로드 하여 설치(install)하면 됩니다.

 

저는 MacBook 을 사용하고 있으므로 'Download Mac Universal (Stable Build)' 를 다운로드 해서 설치했습니다. 

 

Visual Studio Code - Download

 

 

 

(2) Visual Studio Code 에 Kubernetes YAML 언어 지원 확장 팩을 설치하고 설정

 

Visual Studio Code 에 Kubernetes YAML 파일의 코드를 인식하고 지원할 수 있도록 Red Hat 에서 제공하는 YAML 확장 팩을 설치해보겠습니다. 

 

Visual Studio Code 의 제일 왼쪽 메뉴의 제일 밑에 있는 네모 모양 (4개의 네모)의 메뉴를 선택한 후 --> YAML 키워드로 검색해서 --> YAML Language Support by Red Hat, with built-in Kubernetes syntax support 를 선택 --> 설치 (install) 단추 클릭

 

의 순서로 K8s 언어 지원 확장 팩을 설치해 줍니다. 

 

Visual Studio Code - Extension YAML Install

 

 

YAML Red Hat 확장 팩을 설치 했으면, 좌측 YAML 의 톱니바퀴 모양의 설정 단추를 선택하고 --> '확장 설정' 을 선택합니다. 

 

Visual Studio Code - Configuration

 

스크롤바를 밑으로 쭉 내리다보면 'Yaml: Schemas' --> 'setting.json 에서 편집' 을 선택합니다. 

 

Visual Studio Code - YAML Schemas

 

아래의 'setting.json 에서 편집' 창이 비어있을 텐데요, Kubernetes 가 모든 YAML 파일("*.yaml")을 인식할 수 있도록 대괄호 {} 안에 JSON 파일에 입력해줍니다. 

 

Visual Studio Code - settings.json

{
    "yaml.schemas": { 
        "kubernetes": "*.yaml"
        },
}

 

 

'settings.json' 파일을 저장하고 닫은 다음에, --> Visual Studio Code 를 종료 --> Visual Studio Code 를 다시 시작 합니다. 이제부터 VS Code 에서 K8s 에서 인식하는 모든 YAML 언어지원이 사용가능해요. 

 

Visual Studio Code - Enabled

 

 

 

(3) Visual Studio Code 의 기능 소개

 

이제 Visual Studio Code 에서 YAML 언어를 선택해서 --> YAML 파일을 생성해보겠습니다. 

 

Visual Studio Code - Select Language YAML

 

 

왼쪽 메뉴바의 제일 위에 있는 '신규 생성' --> 탐색기에서 '신규 파일 +' 클릭 --> '신규 파일 이름 입력 (예: nginx.yaml)  

해줍니다. 

 

 

 

Visual Studio Code 는 신규 생성 파일이 YAML 임을 인식하고는 apiVersion, kind, metadata, spec 을 알려주고, 들여쓰기라든지, dictionary / array 포맷도 알아서 해주고ㅡ Kubernetes  YAML 파일의 포맷에 맞추어서 적당한 명령어를 추천(Recommendation) 해줍니다. 이 기능은 편리하기도 하고, 휴먼 에러를 줄일 수 있어서 매우 유용합니다. 

 

Visual Studio Code - Recommendation

 

 

만약  Kubernetes YAML 코딩을 하다가 잘못된 부분이 있으면 에러 메시지를 팝업으로 띄워주고, 하단의 '문제 (problem)' 메뉴에도 에러가 있는 코드의 라인(예: line 10)과 문제(예: bad indentation of a mapping entry YAML [10, 5]) 의 에러 내용도 볼 수 있습니다. 이 기능은 디버깅을 할 때 매우 유용합니다. 

 

Visual Studio Code - Error Message

 

 

들여쓰기 에러를 바로잡아 주니 에러 메시지가 사라졌습니다. :-)

 

Visual Studio Code - Error Fixed

 

 

Visual Studio Code 의 왼쪽 하단에 '개요 (Outline)' 메뉴를 선택하면 아래와 같이 YAML 파일의 전체 구조(structure)를 한눈에 빠르게 살펴볼 수 있습니다. 

 

Visual Studio Code - Outline

 

 

터미널에서 방금 전에 새로 만든 nginx.yaml 파일을 cat 으로 열어서 살펴보면 아래와 같습니다. 물론 터미널에서 vim 에디터로도 YAML 파일을 만들고 수정할 수 있기는 합니다만, Visual Studio Code 의 편리한 기능들을 생각하면 역시 VS Code IDE 가 훨씬 매력적이긴 합니다. 

 

(base) lhongdon@Hongui-MacBookPro ~ % ls
Applications		Downloads		Music			VirtualBox VMs		minikf			seaborn-data
Desktop			Library			Pictures		examples		minikf-kubeconfig
Documents		Movies			Public			kubernetes		opt
(base) lhongdon@Hongui-MacBookPro ~ % cd kubernetes 
(base) lhongdon@Hongui-MacBookPro kubernetes % ls
nginx.yaml	pod.yml
(base) lhongdon@Hongui-MacBookPro kubernetes % 
(base) lhongdon@Hongui-MacBookPro kubernetes % 
(base) lhongdon@Hongui-MacBookPro kubernetes % cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-2
  labels:
    env: production
spec:
  containers:
    - name: nginx
      image: nginx
                                                                                                                                                             (base) lhongdon@Hongui-MacBookPro kubernetes %

 

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요~!  :-)

 

 

728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 K8s 의 툴인 kubectl을 설치하고 사용하는 방법 (https://rfriend.tistory.com/684) 을 소개하였습니다. 

 

이번 포스팅에서는 Kubeflow를 이용했을 때 얻을 수 있는 큰 혜택 중의 하나인 파이프라인(Pipeline)의 구성요소에 대해서 코드 없이 개념적인 내용을 소개하겠습니다. (* Kubeflow.org 의 파이프라인 페이지 내용을 번역하였음.)

 

(1) Kubeflow Pipelines 의 개념적인 개요

(2) Kubeflow Pipelines 의 Component

(3) Kubeflow Pipelines 의 그래프 (Graph) 

(4) Kubeflow Pipelines 의 실험 (Experiment)

(5) Kubeflow Pipelines 의 실행과 순환실행 (Run and Recurring Run)

(6) Kubeflow Pipelines 의 실행 트리거 (Run Trigger)

(7) Kubeflow Pipelines 의 단계(Step)

(8) Kubeflow Pipelines 의 산출물 Artifact (Output Artifact)

 

 

 

(1) Kubeflow Pipelines 의 개념적인 개요

 

 파이프라인은 기계학습 워크플로우 (Machine Learning Workflow) 를 표현한 것으로서, 워크플로우의 모든 구성요소들을 포함하고, 이들 구성요소들이 서로 어떻게 관련되어 있는지를 그래프(Graph)의 형태로 표현합니다. 파이프라인을 실행하기 위해 필요한 파라미터의 입력값과, 각 구성요소(components)의 입력값과 출력값을 정의함으로써 파이프라인을 설정할 수 있습니다. 

파이프라인을 실행시키면 시스템은 기계학습 워크플로우의 단계(steps)에 해당하는 만큼 한개 또는 여러개의 Kubernetes Pods 를 뜨웁니다. Pods는 Docker container를 시작하고, Container는 차례로 워크플로우 안의 프로그램을 실행시킵니다. 

 일단 파이프라인을 개발하고 나면, Kubeflow Pipelines UIKubeflow Pipelines SDK 를 이용해서 업로드할 수 있습니다. 

 

Kubeflow Pipelines 플랫폼 구성은 아래와 같습니다.  

 - (a) 실험(experiments), 작업(jobs)과 실행(runs)을 관리하고 추적하는 사용자 인터페이스 (UI)

 - (b) 다단계 기계학습 워크플로우를 스케줄링(scheduling multi-step ML workflows)하는 엔진

 - (c) 파이프라인과 컴포넌트를 정의하고 조작하는 SDK(SW Development Kit)

 - (d) SDK를 사용해서 시스템과 상호작용하는 노트북(notebooks)

 

Kubeflow Pipelines 의 목적은 다음과 같습니다. 

  - (a) End-to-End orchestration: 기계학습의 전체 파이프라인을 단순화하고 조정할 수 있게 함.

  - (b) 쉬운 실험(easy experimentation): 수많은 아이디어와 기술을 시도하고 다양한 실험결과를 관리할 수 있게 함. 

  - (c) 쉬운 재사용(easy re-use): 매번 다시 구축할 필요 없이 기존의 컴포넌트와 파이프라인을 재사용해서 빠르게 end-to-end 솔루션을 생성할 수 있게 함. 

 

 

 

(2) Kubeflow Pipelines 의 Component

 

Pipeline Component 는 기계학습 워크플로우에서 한 개의 단계를 실행하는 독립적이고 자기충족적인 코드 집합 (self-contained set of code)입니다. 가령, 데이터 전처리, 데이터 변환, 모델 훈련 등이 독립적인 워크플로우의 단계가 될 수 있습니다. Pipeline Component 는 함수(function)과 유사한데요, 이름, 파라미터, 반환값, (코드블록) 바디를 가지고 있습니다. 레고블록의 하나 하나의 조각블록을 생각하면 이해하기 쉬울거 같아요. 

 

Component 세부 사항(component specifications)으로 아래의 것들을 정의합니다. 

  - (a) component 인터페이스: 인풋과 아웃풋

  - (b) component 실행: 컨테이너 이미지, 실행 명령어

  - (c) component 메타 데이터: 컴포넌트 이름, 설명

 

 

 

 

(3) Kubeflow Pipelines 의 그래프(Graph) 

 

그래프(Graph)는 Pipeline의 실행을 Kubeflow Pipelines UI 에 노드(node)와 에지(edge)의 그래프 형태의 그림으로 표현한 것입니다. 그래프는 Pipeline이 실행되었거나 실행중인 단계(steps)를 보여주며, 화살표로 각 단계의 구성요소 간 부모/자식 관계 (parent/child relationships) 를 나타냅니다. 그래프는 파이프라인이 실행되기 시작하자마자 바로 볼 수 있습니다. 그래프 안의 각 노드는 파이프라인의 단계에 해당하며 각 단계에 맞추어서 이름이 부여됩니다. 

 

[ Pipeline Graph 예시 ]

 

Kubeflow Pipelines - Graph 예시

 

위의 그래프 예시화면에서 보면 각 노드의 상단 우측에 아이콘이 있는데요, 이 아이콘은 각 단계의 진행상태를 의미합니다. 진행상태에는 '실행 중 (running)', '실행 성공 (succeeded)', '실행 실패 (failed)', '건너뜀 (skipped)' 등이 있습니다. 만약 부모 노드에서 조건절이 있고 조건에 해당된다면 자식노드는 '건너뜀 (skipped)' 상태가 될 수 있습니다. 

 

 

 

(4) Kubeflow Pipelines 의 실험 (Experiment)

 

실험(Experiment) 메뉴는 Pipelines 에서 다른 종류의 설정들(different configurations)을 시도해볼 수 있는 작업공간입니다. 우리는 실험 화면에서 다양한 설정의 실험 실행을 논리적인 그룹들로 조직할 수 있습니다. 실험은 순환반복실행(recurring runs)과 같은 임의적인 실행도 포함할 수 있습니다. 

 

[ Kubeflow Pipelines - Experiment UI]

Kubeflow Pipelines - Experiment

 

Kubeflow Pipelines - Experiment UI

 

 

 

(5) Kubeflow Pipelines 의 실행과 순환실행 (Run and Recurring Run)

 

실행(a run)은 파아프라인에서 한번 수행(a single execution)하는 것을 말합니다. 실행(runs)은 당신이 시도하는 모든 실험들의 불변하는 로그로 이루어지며, 재현이 가능하도록(reproducibility) 독립적이고 자기충족적(self-contained) 이도록 설계가 됩니다. 우리는 Kubeflow Pipeline UI 의 상세 페이지(details page)에서 실행의 진척도를 추적할 수 있으며, 수행시간 그래프와 산출물 artifacts, 그리고 실행의 각 단계별 로그도 볼 수 있습니다.  

 

순환실행(recurring run), 또는 Kubeflow Pipelines backend APIs 안의 job, 은 파이프라인의 반복할 수 있는 실행(a repeatable run of a pipeline)을 말합니다. 순환실행을 위한 환경설정은 명시된 모든 파라미터값과 실행 트리거(run trigger) 를 가진 파이프라인의 복사를 포함합니다. 당신은 순환실행을 어느 실험 안에서나 시작할 수 있으며, 그것은 주기적으로 실행 환경설정의 새로운 복사를 시작할 것입니다. 당신은 Kubeflow Pipelines UI에서 순환실행의 활성화/비활성화를 선택할 수 있습니다. (위 Experiment UI의 하단에 있는 Run Type: One-off vs. Recurring). 당신은 또한 동시실행의 최대개수도 구체적으로 명시할 수 있으며, 병렬로 시작하는 실행의 숫자도 제한할 수 있습니다. 이런 기능들은 만약 파이프라인이 오랜 시간동안 수행이 될 것으로 예상되고 자주 실행이 된다면 유용하게 사용될 수 있습니다. 

 

 

 

(6) Kubeflow Pipelines 의 실행 트리거 (Run Trigger)

 

실행 트리거(run trigger)는 시스템에게 언제 순환실행 환경설정(recurring rum configuration)이 새로운 실행을 생성해야 할지를 알려주는 표시(flag)입니다. 아래의 두가지 유형의 순환실행을 사용할 수 있습니다. 

  -. 주기적 (Periodic): 가령 매 2시간 또는 매 45분 간격마다 주기적으로 실행하는 것과 같이, 시간간격 기반의 실행 스케줄링(for an interval-based scheduling of runs)에 사용.

  -. 특정 시기 (Cron): 명시적으로 실행 스케줄링의 '특정 시간 문구(cron semactics)'를 지정하고자 할 때 사용. 

 

 

 

(7) Kubeflow Pipelines 의 단계(Step)

 

단계(step)는 파이프라인 안의 구성요소들 중의 하나의 실행(an execution of one of the components in the pipeline)을 의미합니다. 단계(step)와 구성요소(component)와의 관계는 인스턴스화(steps = component instances)의 하나로서, 실행(run)과 파이프라인(pipeline)의 관계와 상당히 유사합니다.

 

복잡한 파이프라인에서는 구성요소(components)는 순환문에서 여러번 수행할 수도 있으며, 또는 파이프라인 코드 안에서 if/else 조건절을 분석한 후에 조건부로 수행할 수도 있습니다. 

 

 

 

(8) Kubeflow Pipelines 의 산출물 Artifact (Output Artifact)

 

산출물 artifact 는 파이프라인 구성요소에 의해서 생성되는 산출물로서, Kubeflow Pipelines UI 가 이를 이해하고 풍부한 시각화를 생성할 수 있습니다. 파이프라인 구성요소(pipeline components)에 산출물 artifact 를 포함시킴으로써 모델 성능평가, 실행을 위한 빠른 신속한 의사결정, 또는 다른 실행들 간의 비교를 하는데 유용하게 사용할 수 있습니다. Artifact 는 또한 파이프라인의 다양한 구성요소가 어떻게 작동하는지를 이해하는 것을 가능하게 해줍니다. Artifact 는 평범한 텍스트 뷰부터 풍부한 상호작용 시각화까지 다양한 형태를 띨 수 있습니다. 

 

 

[ Reference ]

* Kubeflow Pipelines: https://www.kubeflow.org/docs/components/pipelines/overview/concepts/

 

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요!  :-)

 

728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 MacOS 맥북에 MiniKF (Kubeflow 의 로컬 머신 버전)를 설치하고, VM 과 Kubernetes 를 작동시켜서 Kubeflow 실행시키고 접속하는 방법을 소개하였습니다. (https://rfriend.tistory.com/676

 

 

MiniKF 를 잘 설치하고 작동시켰다면 아래와 같이 kubectl 사용에 대한 안내문이 나올 거예요. 일단 이전 포스팅 참고해서 MiniKF 설치하고 구동시킨 다음에, 이어서 이번 포스팅을 참고하시면 되겠습니다. 

 

 

K8s tool Kubectl

 

이번 포스팅에서는 Kubernetes 의 커맨드라인 툴인 kubectl 에 대해서 고급 사용자가 이용할 수 있도록,

    (1) kubectl 설치 및 설정 

    (2) kubectl 사용

하는 방법을 소개하겠습니다.  

이번 포스팅은 Kubernetes install tools 페이지를 참고하였습니다. 

 

 

(1) MacOS에 kubectl 설치 및 설정하기

 

(1-1) kubectl 설치

 

MacOS 맥북에 kubectl 설치하는 방법에는

    (a) curl 을 사용해서 kubectl binary 를 설치하는 방법

    (b) Homebrew 를 사용해서 kubectl 설치하는 방법

    (c) Macports 를 사용해서 kubectl 설치하는 방법 

이 있습니다.  

 

이번 포스팅에서는 curl 과 Homebrew 를 사용한 kubectl 설치 방법을 소개하겠습니다. 

 

 

(1-1-a) curl 을 사용해서 kubectl binary 를 설치하는 방법

 

먼저 curl 을 사용해서 최신 버전의 kubectl binary 파일을 다운로드 합니다. Intel 칩과 Apple Silicon 칩의 두가지 종류별로 다운로드 하는 경로가 다르므로, 본인의 맥북을 확인 후 자신의 것에 맞게 다운로드 하세요. 

 

-- Download the latest release
-- Intel
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"

-- Apple Silicon
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl"

 

 

만약, 특정 버전의 kubectl 을 다운로드 하고 싶다면  $(curl -L -s https://dk.k8s.io/release/stable.txt) 부분의 커맨드를 특정 버전으로 바꿔주면 됩니다. 가령, Intel macOS의 kubectl v1.22.0 를 더운로드 하고 싶다면 아래처럼 버전을 명시해주면 됩니다. 

 

-- 특정 버전의 kubectl 을 다운로드 하려면, 
-- for example, to download kubectl version v1.22.0 macOS on Intel macOS
$ curl -LO "https://dl.k8s.io/release/v1.22.0/bin/darwin/amd64/kubectl"


-- for macOS on Apple Sillicon, type:
$ curl -LO "https://dl.k8s.io/release/v1.22.0/bin/darwin/arm64/kubectl"

 

 

 

(Optional) binary 를 검증해보고 싶으면 아래의 kubectk checksum file 을 다운로드 받아서 확인해볼 수 있습니다. 이때 kubectl binary 와 같은 버전의 checksum file 을 다운로드 해주세요. 

 

-- (optional) Validate the binary

-- Intel 
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl.sha256"
 
-- Apple Silicon
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl.sha256"

 

 

만약 binary 파일이 유효하다면 kubectl: OK 라는 메시지가 나올 거예요. 

 

-- Validate the kubectl binary against the checksum file
$ echo "$(<kubectl.sha256)  kubectl" | shasum -a 256 --check

==> (output) kubectl: OK

 

 

 

(1-1-b) Homebrew 를 사용해서 kubectl 설치하는 방법

 

Homebrew 는 macOS 운영 체제의 소프트웨어 설치를 단순하게 해주는 소프트웨어 패키지 관리자입니다. 

맥북에 이미 Homebrew 를 설치해서 사용 중이라면 아래의 한 줄이면 kubectl 을 간단하게 설치할 수 있습니다. 완전 심플 그 자체예요! 

 

-- Install the kubectl with Homebrew on macOS

$ brew install kubectl

 

 

 

(1-2) MiniKF's kubeconfig 파일 다운로드

 

MiniKF's kubeconfig 파일은 아래 화면 캡쳐한 곳에 파란색 점선으로 표시해 놓은 링크를 클릭하면 다운로드 할 수 있습니다. (아래 화면은 MiniKF 실행하면 아래에 나오는 화면이구요, MiniKF 설치 및 실행은 https://rfriend.tistory.com/676 를 참고하세요.)

Download MiniKF's kubeconfig file

 

아래처럼 minikf-kubeconfig file이 잘 다운로드 된거 확인했습니다. 

 

(base) lhongdon@Hongui-MacBookPro minikf % cd ..
(base) lhongdon@Hongui-MacBookPro ~ % cd Downloads
(base) lhongdon@Hongui-MacBookPro Downloads % ls
minikf-kubeconfig
(base) lhongdon@Hongui-MacBookPro Downloads %

 

 

(1-3) 다운로드한 minikf-kubecinfig 파일을 홈 디렉토리(home directory)에 옮겨서 저장해주세요. 

 

(base) lhongdon@Hongui-MacBookPro Downloads % 
(base) lhongdon@Hongui-MacBookPro Downloads % mv minikf-kubeconfig /Users/lhongdon/
(base) lhongdon@Hongui-MacBookPro Downloads % 
(base) lhongdon@Hongui-MacBookPro Downloads % cd ..                                    
(base) lhongdon@Hongui-MacBookPro ~ % pwd
/Users/lhongdon
(base) lhongdon@Hongui-MacBookPro ~ % ls
Applications		Documents		Library			Music			Public			minikf			opt
Desktop			Downloads		Movies			Pictures		VirtualBox VMs		minikf-kubeconfig	seaborn-data
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

 

(1-4) kubectl 설정

 

kubectl 이 minikf-kubeconfig 파일을 찾아서 사용할 수 있도록 KUBECONFIG 환경 변수를 설정해주세요. 

 

-- macOS / Linux: Open a terminal, then run:
$ export KUBECONFIG=$HOME/minikf-kubeconfig


-- Windows: Open a Command Prompt, then run:
$ SET KUBECONFIG=%HOMEPATH%/minikf-kubeconfig

 

(base) lhongdon@Hongui-MacBookPro ~ % 
(base) lhongdon@Hongui-MacBookPro ~ % export KUBECONFIG=$HOME/minikf-kubeconfig
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

 

 

(2) kubectl 사용

 

kubectl command 에는 정말 여러가지가 있는데요, 그중에서도 가장 기본적인것 몇 가지만 소개하겠습니다. 

 

 

(2-1) kubectl 버전 확인: $ kubectl version --client

 

(base) lhongdon@Hongui-MacBookPro ~ % 
(base) lhongdon@Hongui-MacBookPro ~ % kubectl version --client
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.1", GitCommit:"632ed300f2c34f6d6d15ca4cef3d3c7073412212", GitTreeState:"clean", BuildDate:"2021-08-19T15:45:37Z", GoVersion:"go1.16.7", Compiler:"gc", Platform:"darwin/amd64"}
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

(2-2) cluster 의 마스터와 서비스 상태 정보 확인: $ kubectl cluster-info

 

(base) lhongdon@Hongui-MacBookPro ~ % kubectl cluster-info
Kubernetes control plane is running at https://10.10.10.10:8443
KubeDNS is running at https://10.10.10.10:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

(2-3) cluster 의 환경설정 정보 확인: $ kubectl config view

 

(base) lhongdon@Hongui-MacBookPro ~ % kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://10.10.10.10:8443
  name: minikf
contexts:
- context:
    cluster: minikf
    user: minikf
  name: minikf
current-context: minikf
kind: Config
preferences: {}
users:
- name: minikf
  user:
    token: REDACTED
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

(2-4) 모든 kubectl 관리 정보 보기: $ kubectl get all

 

(base) lhongdon@Hongui-MacBookPro ~ % kubectl get all                 
NAME                                    READY   STATUS    RESTARTS   AGE
pod/admission-webhook-7cdddfc7b-r2p78   1/1     Running   1          32d
pod/startup-lock-kf4tg                  1/1     Running   1          32d

NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/admission-webhook   ClusterIP   10.105.96.165   <none>        443/TCP   32d
service/kubernetes          ClusterIP   10.96.0.1       <none>        443/TCP   32d

NAME                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/startup-lock   1         1         1       1            1           <none>          32d

NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/admission-webhook   1/1     1            1           32d

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/admission-webhook-7cdddfc7b   1         1         1       32d
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

(2-5) pods 목록 보기: $ kubectl get pod

 

(base) lhongdon@Hongui-MacBookPro ~ % 
(base) lhongdon@Hongui-MacBookPro ~ % kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
admission-webhook-7cdddfc7b-r2p78   1/1     Running   1          31d
startup-lock-kf4tg                  1/1     Running   1          31d
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

(2-6) 서비스 목록 보기: $ kubectl get service

 

(base) lhongdon@Hongui-MacBookPro ~ % kubectl get service
NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
admission-webhook   ClusterIP   10.105.96.165   <none>        443/TCP   32d
kubernetes          ClusterIP   10.96.0.1       <none>        443/TCP   32d
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

(2-7) Daemonsets 목록 보기: $ kubectl get daemonset

 

(base) lhongdon@Hongui-MacBookPro ~ % kubectl get daemonset
NAME           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
startup-lock   1         1         1       1            1           <none>          32d
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

(2-8) Deployment 목록 보기: $ kubectl get deployment

 

(base) lhongdon@Hongui-MacBookPro ~ % kubectl get deployment
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
admission-webhook   1/1     1            1           32d
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

(2-9) ReplicaSets 목록 보기: $ kubectl get replicasets

 

(base) lhongdon@Hongui-MacBookPro ~ % kubectl get replicasets
NAME                          DESIRED   CURRENT   READY   AGE
admission-webhook-7cdddfc7b   1         1         1       32d
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

(2-10) Nodes 목록 보기: $ kubectl get node

 

(base) lhongdon@Hongui-MacBookPro ~ % kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
minikf   Ready    master   32d   v1.16.15
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

(2-11) Events 목록 보기: $ kubectl get events

 

(base) lhongdon@Hongui-MacBookPro ~ % kubectl get events
No resources found in default namespace.
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

[ Reference ]

* K8s install tools: https://kubernetes.io/docs/tasks/tools/

* install and set up kubectl on MacOS https://kubernetes.io/docs/tasks/tools/install-kubectl-macos/

* Kubectl Command Cheatsheet: https://www.bluematador.com/learn/kubectl-cheatsheet

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요!  :-)

 

 

728x90
반응형
Posted by Rfriend
,

지난번 포스팅(https://rfriend.tistory.com/674)에서는 오픈소스 Kubeflow 이 무엇이고 특장점에는 무엇이 있는지 알아보았습니다. 

 

Kubeflow 는 아래의 표에서 확인할 수 있는 바와 같이 다양한 클라우드 플랫폼 위에서 유연하게 사용할 수 있습니다. (As of Aug. 2021)

 

[ Kubeflow 의 플랫폼 별 다양한 버전 ]

Kubeflow on various Platforms

 * 출처: https://www.kubeflow.org/docs/started/installing-kubeflow/

 

 

이번 포스팅에서는 이들 여러개의 플랫폼 중에서도 Laptop/ Desktop에 간편하게 설치해서 쉽게 Kubeflow 기능을 체험해보고 싶은 사용자에게 적합한 "Vagrant 플랫폼 기반의 Arrikto MiniKF (Mini-Kubeflow)" 를 MacOS의 맥북에 설치하는 방법을 소개하겠습니다.

 

MiniKF 는 이름에서 유추할 수 있듯이, 단지 몇 번의 클릭만으로 Kubeflow의 전체 파이프라인을 사용해볼 수 있게 해줌으로써 Kubernetes를 전문적으로 알지는 못하는 데이터 과학자 또는 개발자라도 Kubeflow 를 빠르고 쉽게 시작할 있도록 해줍니다.  더불어서, 만약 나중에 MiniKF에서 만든 기계학습/딥러닝 모델을 규모있게 운영을 하고 싶으면, 기존 코드를 다시 쓰는 것 없이 단지 원클릭 만으로 Kubeflow 클라우드 배포로 이동시킬 수 있습니다. 완전 신기하고 멋지죠?!! 

 

MiniKF로 로컬머신에서 원활한 실험을 하기 위한 시스템 사양으로 Kubeflow 커뮤니티 사이트에서는 아래의 사양을 추천하고 있습니다. 

 

[ System Requirements for MiniKF ]

  • 12 GB RAM
  • 2 CPUs
  • 50 GB disk space

제가 사용하는 맥북 사양은 메모리 32GB, CPU 2.4 Ghz 8코어 Intel Core i9, 1TB disk space 인데요, MiniKF 구동시킬때마다 비행기 이륙하는 소리가 나는 것으로 봐서는 MiniKF가 리소스를 상당히 많이 사용하는 것 같습니다. 

 

MiniKF 는 Linux, macOS, Windows 의 주요 OS 에서 사용 가능합니다.

 

이번 포스팅에서는 macOS (Big Sur 버전 11.3) 에 Homebrew, Vagrant 를 사용해서 MiniKF를 설치해보겠습니다. 

 

사전 준비사항으로 랩탑/데스크탑에 Vagrant, Virtual Box 를 설치해야 합니다. 

 

- (1) Vagrant 사전 설치

- (2) Virtual Box 가상머신 사전 설치

 

 

 

(1) Vagrant 사전 설치

 

Vagrant 는 단일 워크플로우에서 가상 머신 환경을 구성하고 관리하는 툴입니다. Vagrant 는 사용하기 쉬운 워크플로우오ㅓ 자동화에 중점을 두어 개발환경 구성에 소요되는 시간을 줄이고 생산성을 올려줍니다. 

 

% brew tap hashicorp/tap

% brew install vagrant

 

(base) lhongdon@Hongui-MacBookPro ~ % brew tap hashicorp/tap
Updating Homebrew...
==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> New Formulae
firefoxpwa
==> Updated Formulae
Updated 127 formulae.

==> Tapping hashicorp/tap
Cloning into '/usr/local/Homebrew/Library/Taps/hashicorp/homebrew-tap'...
remote: Enumerating objects: 1444, done.
remote: Counting objects: 100% (198/198), done.
remote: Compressing objects: 100% (127/127), done.
remote: Total 1444 (delta 122), reused 117 (delta 71), pack-reused 1246
Receiving objects: 100% (1444/1444), 263.75 KiB | 5.27 MiB/s, done.
Resolving deltas: 100% (818/818), done.
Tapped 1 cask and 11 formulae (42 files, 380.5KB).
(base) lhongdon@Hongui-MacBookPro ~ % 
(base) lhongdon@Hongui-MacBookPro ~ % 
(base) lhongdon@Hongui-MacBookPro ~ % 
(base) lhongdon@Hongui-MacBookPro ~ % brew install vagrant
==> Tapping homebrew/cask
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask'...
remote: Enumerating objects: 586340, done.
remote: Counting objects: 100% (510/510), done.
remote: Compressing objects: 100% (264/264), done.
remote: Total 586340 (delta 262), reused 384 (delta 246), pack-reused 585830
Receiving objects: 100% (586340/586340), 258.95 MiB | 6.46 MiB/s, done.
Resolving deltas: 100% (414124/414124), done.
Tapped 3975 casks (4,055 files, 277.8MB).
==> Downloading https://releases.hashicorp.com/vagrant/2.2.18/vagrant_2.2.18_x86_64.dmg
######################################################################## 100.0%
==> Installing Cask vagrant
==> Running installer for vagrant; your password may be necessary.
Package installers may write to any location; options such as `--appdir` are ignored.
Password:
Sorry, try again.
Password:
installer: Package name is Vagrant
installer: Installing at base path /
installer: The install was successful.
🍺  vagrant was successfully installed!
(base) lhongdon@Hongui-MacBookPro ~ % 
(base) lhongdon@Hongui-MacBookPro ~ %

 

 

 

(2) Virtual Box 사전 설치

 

가상 머신 Virtual Box 를 https://www.virtualbox.org/wiki/Downloads 에서 자신의 OS 에 맞는 패키지를 다운로드해서 랩탑/데스크탑에 설치해 줍니다. 저는 MacBook Pro 에 설치할 것이므로 OS X hosts 메뉴에서 VirtualBox-6.1.26-145957-OSX.dmg 파일을 다운로드하여 앱을 실행시켰습니다. 

 

 

 

사전 준비사항이 완료되었으면 이제 MiniKF를 설치하고 업그레이드 해보겠습니다. 

- (3) MiniKF 설치

- (4) MiniKF 업그레이드

 

 

 

(3) MiniKF 설치

 

% vagrant init arrikto/minikf
$ vagrant up

 

먼저 터미널에서 'minikf' 라는 디렉토리를 만들고, 'minikf' 로 디렉토리를 변경하여, 위의 vagrant 명령문을 실행하여 MiniKF 를 설치하였습니다. 

 

(base) lhongdon@Hongui-MacBookPro ~ % 
(base) lhongdon@Hongui-MacBookPro ~ % mkdir minikf
(base) lhongdon@Hongui-MacBookPro ~ % cd minikf
(base) lhongdon@Hongui-MacBookPro minikf % 
(base) lhongdon@Hongui-MacBookPro minikf % 
(base) lhongdon@Hongui-MacBookPro minikf % vagrant init arrikto/minikf
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
(base) lhongdon@Hongui-MacBookPro minikf % 
(base) lhongdon@Hongui-MacBookPro minikf % 
(base) lhongdon@Hongui-MacBookPro minikf % vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'arrikto/minikf' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'arrikto/minikf'
    default: URL: https://vagrantcloud.com/arrikto/minikf
==> default: Adding box 'arrikto/minikf' (v20210428.0.1) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/arrikto/boxes/minikf/versions/20210428.0.1/providers/virtualbox.box
Download redirected to host: storage.googleapis.com
Progress: 0% (Rate: 5291k/s, Estimated time remaining: 5:06:30)


Progress: 0% (Rate: 5865k/s, Estimated time remaining: 1:52:28)

Progress: 3% (Rate: 5216k/s, Estimated time remaining: 0:52:52)vagrant box update
Progress: 3% (Rate: 5324k/s, Estimated time remaining: 0:51:46)
Progress: 4% (Rate: 5418k/s, Estimated time remaining: 0:51:17)

==> default: Successfully added box 'arrikto/minikf' (v20210428.0.1) for 'virtualbox'!
Plugin 'vagrant-persistent-storage' is missing, running `vagrant plugin install vagrant-persistent-storage`...
Installing the 'vagrant-persistent-storage --version '>= 0.0.47'' plugin. This can take a few minutes...
Fetching vagrant-persistent-storage-0.0.49.gem
Installed the plugin 'vagrant-persistent-storage (0.0.49)'!
Plugin installed successfully, please re-run `vagrant up`.
(base) lhongdon@Hongui-MacBookPro minikf % 
(base) lhongdon@Hongui-MacBookPro minikf %

 

 

 

(4) MiniKF 업그레이드

 

(4-1) MiniKF box를 최신버전으로 업그레이드 하기

% vagrant box update
(base) lhongdon@Hongui-MacBookPro minikf % vagrant box update
==> default: Checking for updates to 'arrikto/minikf'
    default: Latest installed version: 20210428.0.1
    default: Version constraints: 
    default: Provider: virtualbox
==> default: Box 'arrikto/minikf' (v20210428.0.1) is running the latest version.

 

 

(4-2) 최신 버전으로 업데이트 했는지 확인해보기

% vagrant box list
(base) lhongdon@Hongui-MacBookPro minikf % vagrant box list
arrikto/minikf (virtualbox, 20210428.0.1)

 

 

(4-3) 'vagrant-persistent-storage' 플러그인을 v0,0.47 또는 이후 버전으로 업그레이드 하기

% vagrant plugin update vagrant-persistent-storage
(base) lhongdon@Hongui-MacBookPro minikf % vagrant plugin update vagrant-persistent-storage
Updating plugins: vagrant-persistent-storage. This may take a few minutes...
All plugins are up to date.

 

 

(4-4) VM 없애기

% vagrant destroy
(base) lhongdon@Hongui-MacBookPro minikf % vagrant destroy
==> default: VM not created. Moving on...

 

 

(4-5) 모든 local state 제거하기.

(notebooks, pipelines, Rok snapshots 등의 MiniKF의 모든 custimization 을 제거함)

[Linux/macOS] % rm minikf-user-data.vdi
[Windows] % del minikf-user-data.vdi

 

 

(4-6) VM 을 다시 생성하기

% vagrant up
(base) lhongdon@Hongui-MacBookPro minikf % 
(base) lhongdon@Hongui-MacBookPro minikf % vagrant up

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Using /Users/lhongdon/minikf/minikf-user-data.vdi for persistent storage.
==> default: Importing base box 'arrikto/minikf'...
==> default: Generating MAC address for NAT networking...
==> default: Using /Users/lhongdon/minikf/minikf-user-data.vdi for persistent storage.
==> default: Checking if box 'arrikto/minikf' version '20210428.0.1' is up to date...
==> default: Setting the name of the VM: minikf_default_1628746272800_96697
Vagrant is currently configured to create VirtualBox synced folders with
the `SharedFoldersEnableSymlinksCreate` option enabled. If the Vagrant
guest is not trusted, you may want to disable this option. For more
information on this option, please refer to the VirtualBox manual:

  https://www.virtualbox.org/manual/ch04.html#sharedfolders

This option can be disabled globally with an environment variable:

  VAGRANT_DISABLE_VBOXSYMLINKCREATE=1

or on a per folder basis within the Vagrantfile:

  config.vm.synced_folder '/host/path', '/guest/path', SharedFoldersEnableSymlinksCreate: false
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 32123 (guest) => 32123 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Using /Users/lhongdon/minikf/minikf-user-data.vdi for persistent storage.
==> default: Running 'pre-boot' VM customizations...
==> default: Using /Users/lhongdon/minikf/minikf-user-data.vdi for persistent storage.
==> default: ** Creating persistent storage **
==> default: Using /Users/lhongdon/minikf/minikf-user-data.vdi for persistent storage.
==> default: ** Attaching persistent storage **
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default: 
    default: Guest Additions Version: 5.2.42_Ubuntu r137960
    default: VirtualBox Version: 6.1
==> default: Using /Users/lhongdon/minikf/minikf-user-data.vdi for persistent storage.
==> default: ** Managing persistent storage **
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/lhongdon/minikf

==> default: Machine 'default' has a post `vagrant up` message. This is a message
==> default: from the creator of the Vagrantfile, and not from Vagrant itself:
==> default: 
==> default:     Welcome to MiniKF!
==> default:     Visit http://10.10.10.10/ to get started.
==> default: 
(base) lhongdon@Hongui-MacBookPro minikf % 
(base) lhongdon@Hongui-MacBookPro minikf %

 

 

(5) MiniKF 설치 여부 확인해 보기

 

웹 브라우저를 열어서 "http://10.10.10.10" 주소로 접속했을 때 아래와 같은 화면이 나타난다면 랩탑/데스크탑에 MiniKF 설치가 성공한 것입니다. 

 

첫 화면의 중앙에 'OK' 라는 부분에 커서를 가져다놓고 엔터를 치면 Kubeflow 가 실행이 되면서 한참동안  progress bar 가 진행이 되고, 맥북에서 비행기 이륙하는 소리가 날거예요. (MiniKF 가 실행되는데 5분 정도 걸리니깐 커피 한잔 하고 오세요.) 

 

 

 

Provisioning 이 모두 끝나면 아래의 화면처럼 "Provisioning completed" 라는 메시지와 함께 "Credentials" 에 Username 과 Password 가 나타납니다. 오른쪽 하단의 "Connect to MiniKF"를 메뉴를 누르면 Log-In 화면이 새로 뜹니다. 

 

Connect to MiniKF

 

 

아래의 화면처럼 MiniKF Log In 화면이 나타나면 바로 앞의 화면에서 왼쪽 하단에 있는 Credentials 의 Username, Password 를 사용해서 로그인을 해주면 됩니다. 

 

Log In to MiniKF

 

 

쨔잔~ 드디어 Kubeflow의 main home 페이지의 UI 화면이 떴습니다. 이제 Kubeflow 를 로컬 머신에서 UI 를 통해 편리하게 사용할 수 있는 환경이 마련되었습니다. ^^b

 

Kubeflow Main Home UI

 

 

Kubernetes 고급사용자라면 Kubernetes Commandline Tool 인 kubectl 을 설치해서 사용하면 빠르고 편리하게 K8s 상태를 조회하고 조작할 수 있습니다. (* kubectl 설치 참조: https://kubernetes.io/docs/tasks/tools/)

 

아래 화면의 2번에 'MiniKF's kubeconfig file: Download file' 링크를 클릭하면 kubeconfig file을 다운로드할 수 있습니다. 이 파일이 있으면 누구나 당신의 MiniKF 에 접근할 수 있으므로 보안에 신경써서 보관해야 합니다. 이 파일을 Home directory에 보관해주세요. 아래의 4번을 참고해서 KUBECONFIG 환경변수를 설정해주면 kubectl 이 이 파일을 찾을 수 있습니다.

$ kubectl -n kubeflow get pods  을 커맨드라인에 입력해주면 MiniKF 에서 실행 중인 Kubeflow pods 목록을 볼 수 있을거예요. 

 

kubectl

 

MacOS 에 kubectl 설치하고 환경설정하기, 자주 사용하는 커맨드라인 명령어는  https://rfriend.tistory.com/684 를 참고하세요. 

 

 

MiniKF 와 Kubernetes, Vurtual Box 를 모두 종료하려면 아래와 같이 % vagrant halt 를 해주면 됩니다. 

 

(base) lhongdon@Hongui-MacBookPro minikf % 
(base) lhongdon@Hongui-MacBookPro minikf % vagrant halt
==> default: Attempting graceful shutdown of VM...
==> default: Using /Users/lhongdon/minikf/minikf-user-data.vdi for persistent storage.
==> default: ** Detaching persistent storage **
(base) lhongdon@Hongui-MacBookPro minikf %

 

 

위에서 새로 만들었던 VM을 $ vagrant halt 로 종료하고 내렸는데요, 이전에 만들었던 VM target machine 을 새로 시작하려면, $ vagrant global-status 로 VM ID를 확인하고 ==> $ vagrant up [target machine ID] 를 입력해주면 됩니다. 

 

-- get an ID of target machine --

(base) lhongdon@Hongui-MacBookPro ~ % vagrant global-status
id       name    provider   state    directory                           
-------------------------------------------------------------------------
a6427be  default virtualbox poweroff /Users/lhongdon/minikf              
 
The above shows information about all known Vagrant environments
on this machine. This data is cached and may not be completely
up-to-date (use "vagrant global-status --prune" to prune invalid
entries). To interact with any of the machines, you can go to that
directory and run Vagrant, or you can use the ID directly with
Vagrant commands from any directory. For example:
"vagrant destroy 1a2b3c4d"
(base) lhongdon@Hongui-MacBookPro ~ % 



-- run target machine ID again --
'
(base) lhongdon@Hongui-MacBookPro ~ % vagrant up a6427be
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Using /Users/lhongdon/minikf/minikf-user-data.vdi for persistent storage.
==> default: Using /Users/lhongdon/minikf/minikf-user-data.vdi for persistent storage.
==> default: Checking if box 'arrikto/minikf' version '20210428.0.1' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
....
....

 

 

 

참고로, Vagrant 의 명령어 리스트와 설명을 보려면 % vagrant -h 또는 % vagrant --help 로 해서 command line 명령어를 인쇄할 수 있습니다. 아래의 Vagrant 명령어 리스트 참고하세요. 

 

(base) lhongdon@Hongui-MacBookPro minikf % vagrant -h  
Usage: vagrant [options] <command> [<args>]

    -h, --help                       Print this help.

Common commands:
     autocomplete    manages autocomplete installation on host
     box             manages boxes: installation, removal, etc.
     cloud           manages everything related to Vagrant Cloud
     destroy         stops and deletes all traces of the vagrant machine
     global-status   outputs status Vagrant environments for this user
     halt            stops the vagrant machine
     help            shows the help for a subcommand
     init            initializes a new Vagrant environment by creating a Vagrantfile
     login           
     package         packages a running vagrant environment into a box
     plugin          manages plugins: install, uninstall, update, etc.
     port            displays information about guest port mappings
     powershell      connects to machine via powershell remoting
     provision       provisions the vagrant machine
     push            deploys code in this environment to a configured destination
     rdp             connects to machine via RDP
     reload          restarts vagrant machine, loads new Vagrantfile configuration
     resume          resume a suspended vagrant machine
     snapshot        manages snapshots: saving, restoring, etc.
     ssh             connects to machine via SSH
     ssh-config      outputs OpenSSH valid configuration to connect to the machine
     status          outputs status of the vagrant machine
     suspend         suspends the machine
     up              starts and provisions the vagrant environment
     upload          upload to machine via communicator
     validate        validates the Vagrantfile
     version         prints current and latest Vagrant version
     winrm           executes commands on a machine via WinRM
     winrm-config    outputs WinRM configuration to connect to the machine

For help on any individual command run `vagrant COMMAND -h`

Additional subcommands are available, but are either more advanced
or not commonly used. To see all subcommands, run the command
`vagrant list-commands`.
        --[no-]color                 Enable or disable color output
        --machine-readable           Enable machine readable output
    -v, --version                    Display Vagrant version
        --debug                      Enable debug output
        --timestamp                  Enable timestamps on log output
        --debug-timestamp            Enable debug output with timestamps
        --no-tty                     Enable non-interactive output

(base) lhongdon@Hongui-MacBookPro minikf %

 

 

[ References ]

* MiniKF on laptop/desktop: https://www.kubeflow.org/docs/distributions/minikf/minikf-vagrant/

* Installing Kubeflow: https://www.kubeflow.org/docs/started/installing-kubeflow/

* Homebrew 설치https://brew.sh/

* Vagrant 설치: https://www.vagrantup.com/downloads

* Virtual Box 설치: https://www.virtualbox.org/wiki/Downloads

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터과학자 되세요! :-)

 

728x90
반응형
Posted by Rfriend
,

데이터 과학자가 다른 엔지니어의 도움없이 어떤 플랫폼(AWS, GCP, Azure, On-prem)에라도 스스로 분석 환경을 구성(Provisioning)하고, 데이터 전처리 및 모델 훈련을 해서, 모델 배포까지 하는 데이터 과학의 전체 워크플로우, 파이프라인을 관리할 수 있고, 필요 시 Scale out 할 수 있다면 정말 근사하겠지요? 업무 생산성도 획기적으로 향상되고, 절약한 시간만큼 데이터 분석 및 모델링에 더 투자할 수 있으니 모델의 예측 성과도 향상될 기회가 있겠구요. 

 

데이터 과학자가 Kubernetes (K8s) 대한 약간(?)의 지식이 있다면 구글이 주도하는 오픈소스 Kubeflow 를 사용해서 앞서 말한 장점을 누릴 수 있습니다. 2021년 8월 현재 Kubeflow 1.3 버전까지 나왔는데요, 올 초 봤던 1.0 대비 Kale, Katib, RStudio 연동 등 향상된 기능들이 눈에 들어오고 무척 마음에 드네요.

Colab에 이어 KubeFlow 까지, Google 은 사랑입니당~! :-)

 

자, 그럼 Kubeflow 에 대해서 차근차근 같이 알아볼까요?

(*참조: https://www.kubeflow.org)

 

 

Kubeflow 는 무엇인가? 

 

Kubeflow 오픈소스 프로젝트는 Kubernetes 위에서 기계학습 워크플로우를 배포하는 것을 다양한 인프라(diverse infrastructures)에서 쉽고(simple), 이동 가능하고(portable), 확장 가능하게(scalable) 구현하는 것을 목표로 시작이 되었습니다. Kubernetes를 사용할 수 있는 어떤 Cloud 환경이라도 Kubeflow 도 사용할 수 있게 말이지요. 

 

kubeflow

 

Kubeflow의 특징 및 기능을 소개해보겠습니다. 

 

 

1-1. Notebooks 

 

데이터 과학자들이 Jupyter Notebook 을 많이 사용하잖아요. Kubeflow 에서는 데이터 과학자가 Jupyter Notebook 을생성하고 관리할 수 있습니다. 이때 분석에 사용할 언어(Python, R 등)와 패키지가 포함되어 있는 도커 컨테이너 이미지를 선택할 수 있고, 또 분석에 필요로 하는 CPU, 메모리, GPU 에 대한 자원 할당 수준을 데이터 과학자가 직접 설정하여 분석환경을 수 초 내에 Kubernetes 위에 도커 컨테이너로 생성할 있습니다. 

분석환경 생성(Provisioning)할 때는 UI를 제공하고 이후의 생성은 완전 자동화되어 있기 때문에 Kubernetes 를 몰라도 어렵지 않게 사용할 수 있습니다. 완전 멋지지요?! 세상 참 편해졌습니다!

 

 

1-2. TensorFlow model training

 

Kubeflow 는 TensorFlow 로 기계학습 모델 훈련을 위한 custom job operator 를 제공합니다. 특히, Kubeflow의 job operator는 TensorFlow 모델 훈련을 분산 병렬처리 (distributed TensorFlow training jobs) 할 수 있게 해줍니다. 그리고 TensorFlow 모델을 훈련할 때 CPU나 GPU를 사용할 수 있고 다양한 클러스터 크기에 적합하게 설정, 조정할 수 있도록 해줍니다.

 

 

1-3. Model serving

 

Kubeflow는 훈련이 된 TensorFlow 모델을 Kubernetes 에 배포할 때 사용하는 TensorFlow Serving 컨테이너를 지원합니다. 또한 Kubeflow는 훈련된 기계학습 모델을 Kubernetes 위에 배포할 수 있도록 해주는 오픈소스 플랫폼 Seldon Core 와도 통합이 되어 있습니다. 

Kubeflow는 기계학습/딥러닝(ML/DL) 모델을 규모있게 배포할 때 GPU 활용을 극대화하기 위해 NVIDA Triton Inference Server 와도 통합이 되어있습니다. 그리고 ML/DL 모델 배포하고 실시간으로 모니터링을 할 때 사용하는 오픈소스 serverless 프레임웍인 MLRun Serving 도 지원합니다. 

 

 

1-4. Pipelines

 

Kubeflow Pipelines 는 기계학습/딥러닝 학습 모델을 배포하고 관리하는 end-to-end 워크플로우에 대한 종합적인 솔루션입니다. KubeFlow Pipelines 를 사용하여 모델 학습/실험을 스케줄링(scheduling)하고, 실험 결과를 비교하고, 각 실험 결과에 대한 상세한 내용을 살펴볼 수 있어서, 신속하고 신뢰할만한 실험을 할 수 있습니다. 

 

ML components and challenges

 

 

1-5. Multi-framework

 

KubeFlow 는 기계학습/딥러닝 프레임웍으로서 TensorFlow 뿐만이 아니라, PyTorch, Apache MXNet, MPI, XGBoost, Chainer 도 지원합니다. 또한 KubeFlow는 이종 서비스 간 트래픽 관리 및 보안을 위한 Istio, Ambassador 와도 통합되어 있으며, 신속한 다용도 서버리스 프레임웍인 Nuclio, 그리고 데이터 과학 파이프라인 관리를 위한 Pachyderm 과도 통합되어 있습니다. 

 

 

1-6. Community

 

KubeFlow 는 오픈소스로서, 소프트웨어 개발자, 데이터 과학자 및 기계학습/딥러닝 관련 조직의 참여를 환영하고 있습니다. 커뮤니터의 Slack channel 은 https://www.kubeflow.org/docs/about/community/ 를 참고하세요. 

 

 

유튜브에 있는 3분 46초짜리 'KubeFlow 101 : Introduction to KubeFlow' 영상도 한번 보시면 KubeFlow 개념 정리하는데 도움이 될거예요. 

 

Introduction to KubeFlow

 

다음 포스팅에서는 MacOS 맥북에 MiniKF 설치하는 방법(https://rfriend.tistory.com/676)을 소개하겠습니다. 

 

 

[Reference]

* Kubeflow 공식 사이트: https://www.kubeflow.org/

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요!  :-)

 

728x90
반응형
Posted by Rfriend
,