diff --git a/README.md b/README.md index 95321db3..6c952c4e 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,17 @@ ### How to Start 1. 필요한 node module을 설치합니다. -```bash +```text npm install ``` 2. 글 수정 및 추가를 후 ci 를 실행합니다. -```bash +```text npm ci ``` -3. node 서버를 실행 후 수정한 글이 정상적으로 나오는지 확인합니다. -```bash +3. node 클러스터를 실행 후 수정한 글이 정상적으로 나오는지 확인합니다. +```text npm run start ``` diff --git a/content/en/docs/help/how-to-contribute.md b/content/en/docs/help/how-to-contribute.md index 14eafc38..055182bc 100644 --- a/content/en/docs/help/how-to-contribute.md +++ b/content/en/docs/help/how-to-contribute.md @@ -15,19 +15,19 @@ toc: true 1. 필요한 node module을 설치합니다. -```bash +```text npm install ``` 2. 글 수정 및 추가를 후 ci 를 실행합니다. -```bash +```text npm ci ``` -3. node 서버를 실행 후 수정한 글이 정상적으로 나오는지 확인합니다. +3. node 클러스터를 실행 후 수정한 글이 정상적으로 나오는지 확인합니다. -```bash +```text npm run start ``` @@ -71,13 +71,13 @@ draft: false pre-commit을 통해 대부분의 test를 통과할 수 있습니다. -```bash +```text pip install pre-commit pre-commit run -a ``` pre-commit 후 test를 진행합니다. -```bash +```text npm test ``` diff --git a/content/en/docs/introduction/why_kubernetes.md b/content/en/docs/introduction/why_kubernetes.md index 7ebecce6..28bb8e87 100644 --- a/content/en/docs/introduction/why_kubernetes.md +++ b/content/en/docs/introduction/why_kubernetes.md @@ -18,7 +18,7 @@ menu: 간단하게는 수많은 머신러닝 모델의 학습 요청을 순차적으로 실행 하는 것, 다른 작업 공간에서도 동일한 실행 환경을 보장해야 하는 것, 배포된 서비스에 장애가 생겼을 때 빠르게 대응해야 하는 것 등의 이슈 등을 생각해볼 수 있습니다. 여기서 컨테이너(Container)와 컨테이너 오케스트레이션 시스템(Container Orchestration System)의 필요성이 등장합니다. -쿠버네티스와 같은 컨테이너 오케스트레이션 시스템을 도입하면 실행 환경의 격리와 관리를 효율적으로 수행할 수 있습니다. 컨테이너 오케스트레이션 시스템을 도입한다면, 머신러닝 모델을 개발하고 배포하는 과정에서 다수의 개발자가 소수의 서버를 공유하면서 *'1번 서버 사용 중이신가요?', 'GPU 사용 중이던 제 프로세스 누가 죽였나요?', '누가 서버에 x 패키지 업데이트 했나요?'* 와 같은 상황을 방지할 수 있습니다. +쿠버네티스와 같은 컨테이너 오케스트레이션 시스템을 도입하면 실행 환경의 격리와 관리를 효율적으로 수행할 수 있습니다. 컨테이너 오케스트레이션 시스템을 도입한다면, 머신러닝 모델을 개발하고 배포하는 과정에서 다수의 개발자가 소수의 클러스터를 공유하면서 *'1번 클러스터 사용 중이신가요?', 'GPU 사용 중이던 제 프로세스 누가 죽였나요?', '누가 클러스터에 x 패키지 업데이트 했나요?'* 와 같은 상황을 방지할 수 있습니다. ## Container @@ -43,15 +43,15 @@ menu: 그렇다면 컨테이너 오케스트레이션 시스템은 무엇일까요? **오케스트레이션**이라는 단어에서 추측해 볼 수 있듯이, 수많은 컨테이너들이 있을 때 컨테이너들이 서로 조화롭게 구동될 수 있도록 지휘하는 시스템에 비유할 수 있습니다. 컨테이너를 도입이 되면 서비스는 컨테이너의 형태로 사용자들에게 제공됩니다. 이 때 관리해야 할 컨테이너의 수가 적다면 운영 담당자 한 명이서도 충분히 모든 상황에 대응할 수 있습니다. -하지만, 수 백 개 이상의 컨테이너가 수 십 대 이상의 서버에서 구동되고 있고 장애를 일으키지 않고 항상 정상 동작해야 한다면, 모든 서비스의 정상 동작 여부를 담당자 한 명이 파악하고 이슈에 대응하는 것은 불가능에 가깝습니다. +하지만, 수 백 개 이상의 컨테이너가 수 십 대 이상의 클러스터에서 구동되고 있고 장애를 일으키지 않고 항상 정상 동작해야 한다면, 모든 서비스의 정상 동작 여부를 담당자 한 명이 파악하고 이슈에 대응하는 것은 불가능에 가깝습니다. 예를 들면, 모든 서비스가 정상적으로 동작하고 있는지를 계속해서 모니터링(Monitoring)해야 합니다. 만약, 특정 서비스가 장애를 일으켰다면 여러 컨테이너들의 로그를 확인해가며 문제를 파악해야 합니다. -또한 특정 서버나 특정 컨테이너에 작업이 몰리지 않도록 스케줄링(Scheduling)하고 로드 밸런싱(Load Balancing)하며, 스케일링(Scaling)하는 등의 수많은 작업을 담당해야 합니다. +또한 특정 클러스터나 특정 컨테이너에 작업이 몰리지 않도록 스케줄링(Scheduling)하고 로드 밸런싱(Load Balancing)하며, 스케일링(Scaling)하는 등의 수많은 작업을 담당해야 합니다. 이렇게 수많은 컨테이너들의 상태를 지속적으로 관리하고 운영하는 과정을 조금이나마 쉽게, 자동으로 할 수 있는 기능을 제공해주는 소프트웨어가 바로 컨테이너 오케스트레이션 시스템입니다. 머신러닝에서는 어떻게 쓰일 수 있을까요? -예를 들어서 GPU를 필요로 하는 딥러닝 학습 코드가 패키징된 컨테이너는 사용 가능한 GPU가 있는 서버에서 수행하고, 많은 메모리를 필요로 하는 데이터 전처리 코드가 패키징된 컨테이너는 메모리의 여유가 많은 서버에서 수행하고, 학습 중에 서버에 문제가 생기면 자동으로 동일한 컨테이너를 다른 서버로 이동시키고 다시 학습을 진행하는 등의 작업을 사람이 일일히 수행하지 않고, 자동으로 관리하는 시스템을 개발한 뒤 맡기는 것입니다. +예를 들어서 GPU를 필요로 하는 딥러닝 학습 코드가 패키징된 컨테이너는 사용 가능한 GPU가 있는 클러스터에서 수행하고, 많은 메모리를 필요로 하는 데이터 전처리 코드가 패키징된 컨테이너는 메모리의 여유가 많은 클러스터에서 수행하고, 학습 중에 클러스터에 문제가 생기면 자동으로 동일한 컨테이너를 다른 클러스터로 이동시키고 다시 학습을 진행하는 등의 작업을 사람이 일일히 수행하지 않고, 자동으로 관리하는 시스템을 개발한 뒤 맡기는 것입니다. 집필을 하는 2022년을 기준으로 쿠버네티스는 컨테이너 오케스트레이션 시스템의 사실상의 표준(De facto standard)입니다. diff --git a/content/en/docs/setup/_index.md b/content/en/docs/setup/_index.md index b4e19c89..119f43aa 100644 --- a/content/en/docs/setup/_index.md +++ b/content/en/docs/setup/_index.md @@ -2,8 +2,8 @@ title : "Setup" description: "Setup kubernetes." lead: "" -date: 2020-10-06T08:48:23+00:00 -lastmod: 2020-10-06T08:48:23+00:00 +date: 2021-12-13 +lastmod: 2021-12-13 draft: false weight: 200 images: [] diff --git a/content/en/docs/setup/example.md b/content/en/docs/setup/example.md deleted file mode 100644 index d7778afa..00000000 --- a/content/en/docs/setup/example.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title : "Setup example" -description: "Introduction to MLOps" -lead: "" -# date: 2020-10-06T08:48:23+00:00 -# lastmod: 2020-10-06T08:48:23+00:00 -draft: false -weight: 201 -contributors: ["Jaeyeon Kim"] -menu: - docs: - parent: "setup" -images: [] ---- - -## 예시 페이지 입니다. 헤딩은 2번 부터 시작해주세요. diff --git a/content/en/docs/setup/intro.md b/content/en/docs/setup/intro.md new file mode 100644 index 00000000..db5bc723 --- /dev/null +++ b/content/en/docs/setup/intro.md @@ -0,0 +1,77 @@ +--- +title : "1. Introduction" +description: "Setup Introduction" +lead: "" +date: 2021-12-13 +lastmod: 2021-12-13 +draft: false +weight: 201 +contributors: ["Jaeyeon Kim"] +menu: + docs: + parent: "setup" +images: [] +--- + +## MLOps 시스템 구축해보기 + +MLOps 를 공부하는 데 있어서 가장 큰 장벽은 MLOps 시스템을 구성해보고 사용해보기가 어렵다는 점입니다. AWS, GCP 등의 퍼블릭 클라우드 혹은 Weight & Bias, neptune.ai 등의 상용 툴을 사용해보기에는 과금에 대한 부담이 존재하고, 처음부터 모든 환경을 혼자서 구성하기에는 어디서부터 시작해야 할 지 막막하게 느껴질 수밖에 없습니다. + +이런 이유들로 MLOps 를 선뜻 시작해보지 못하시는 분들을 위해, *모두의 MLOps*에서는 우분투가 설치되는 데스크탑 하나만 준비되어 있다면 MLOps 시스템을 밑바닥부터 구축하고 사용해 볼 수 있는 방법을 다룰 예정입니다. + +하지만 [MLOps의 구성요소]({{< relref "docs/introduction/component.md" >}})에서 설명하는 요소들을 모두 사용해볼 수는 없기에, *모두의 MLOps*에서는 대표적인 오픈소스만을 설치한 뒤, 서로 연동하여 사용하는 부분을 주로 다룰 예정입니다. + +*모두의 MLOps*에서 설치하는 오픈소스가 표준을 의미하는 것은 아니며, 여러분의 상황에 맞게 적절한 툴을 취사 선택하시는 것을 권장합니다. + +## 구성 요소 + +이 글에서 만들어 볼 MLOps 시스템의 구성 요소들과 각 버전은 아래와 같은 환경에서 검증되었습니다. + +원활한 환경에서 테스트하기 위해 **클러스터 (혹은 클러스터)** 와 **클라이언트**를 분리하여 설명드릴 예정입니다. +**클러스터** 는 우분투가 설치 되어 있는 데스크탑을 의미합니다. +**클라이언트** 는 노트북 혹은 클러스터가 설치 되어 있는 데스크탑 외의 클라이언트로 사용할 수 있는 다른 데스크탑을 사용하는 것을 권장합니다. +하지만 두 대의 머신을 준비할 수 없다면 데스크탑 하나를 동시에 클러스터와 클라이언트 용도로 사용하셔도 괜찮습니다. + +### 클러스터 + +#### 1. Software + +아래는 클러스터에 설치해야할 소프트웨어 목록입니다. + +| Software | Version | +| --------------- | ----------- | +| Ubuntu | 20.04.3 LTS | +| Docker (Server) | 20.10.11 | +| Nvidia-Driver | 470.86 | +| Kubernetes | v1.21.7 | +| Kubeflow | v1.4.0 | +| MLFlow | v1.21.0 | + +#### 2. Helm Chart + +아래는 Helm을 이용해 설치되어야 할 써드파티 소프트웨어 목록입니다. + +| Helm Chart Repo Name | Version | +| ----------------------------------------------- | ----------- | +| datawire/ambassador | v6.9.3 | +| prometheus-community/kube-prometheus-stack | v21.0.0 | + +### 클라이언트 + +클라이언트는 MacOS (Intel CPU), Ubuntu 20.04 에서 검증되었습니다. + +| Software | Version | +| --------------- | ----------- | +| kubectl | v1.21.7 | +| helm | v3.7.1 | +| kustomize | v3.10.0 | + +### Minimum System Requirements + +모두의 MLOps 를 설치할 클러스터는 다음과 같은 사양을 만족시키는 것을 권장합니다. +이는 Kubernetes 및 Kubeflow 의 권장 사양에 의존합니다. + +- CPU : 6 core +- RAM : 12 GB +- DISK : 50 GB +- GPU : NVIDIA GPU (Optional) diff --git a/content/en/docs/setup/kubernetes-with-k3s.md b/content/en/docs/setup/kubernetes-with-k3s.md new file mode 100644 index 00000000..94cfcc23 --- /dev/null +++ b/content/en/docs/setup/kubernetes-with-k3s.md @@ -0,0 +1,75 @@ +--- +title: "4.3. Setup Kubernetes - K3s" +description: "" +date: 2021-12-13 +lastmod: 2021-12-13 +draft: false +weight: 223 +contributors: ["Jongseob Jeon"] +menu: + docs: + parent: "setup" +images: [] +--- + +**해당 과정은 클러스터로 사용하는 데스크탑에서 진행됩니다.** +로컬과 클러스터가 분리된 경우 꼭 클러스터에서 설치되도록 확인해 주세요. + +## 1. Prerequisite + +k3s 에서는 기본값으로 containerd를 백엔드로 이용해 설치합니다. +하지만 저희는 GPU를 사용하기 위해서 docker를 백엔드로 사용해야 하기 때문에 `--docker` 옵션을 통해 백엔드를 docker로 설치하겠습니다. + +```text +curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.21.7+k3s1 sh -s - server --disable traefik --disable servicelb --disable local-storage --docker +``` + +k3s를 설치후 k3s config를 확인합니다 + +```text +cat /etc/rancher/k3s/k3s.yaml +``` + +## 2. 쿠버네티스 클러스터 셋업 + +k3s config를 클러스터의 kubeconfig로 사용하기 위해서 복사합니다. + +```text +mkdir .kube +sudo cp /etc/rancher/k3s/k3s.yaml .kube/config +sudo chown mrx:mrx .kube/config +``` + +## 3. 쿠버네티스 클라이언트 셋업 + +이제 클러스터에서 설정한 kubeconfig를 로컬로 이동합니다. +로컬에서는 경로를 `~/.kube/config`로 설정합니다. +정상적으로 작동하는지 확인합니다. + +## 4. 쿠버네티스 기본 모듈 설치 + +[Setup Kubernetes Modules]({{< relref "docs/setup/setup-kubernetes-module.md" >}})을 참고하여 다음 컴포넌트들을 설치해 주시기 바랍니다. + +- helm +- kustomize +- CSI plugin +- [Optional] nvidia-docker, nvidia-device-plugin + +## 5. 정상 설치 확인 + +최종적으로 node 가 Ready 인지, OS, Docker, Kubernetes 버전을 확인합니다. + +```text +kubectl get nodes -o wide +``` + +다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다. + +```text +NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME +ubuntu Ready control-plane,master 2d23h v1.21.7 192.168.0.75 Ubuntu 20.04.3 LTS 5.4.0-91-generic docker://20.10.11 +``` + +## 6. References + +- [https://rancher.com/docs/k3s/latest/en/installation/install-options/](https://rancher.com/docs/k3s/latest/en/installation/install-options/) diff --git a/content/en/docs/setup/kubernetes-with-kubeadm.md b/content/en/docs/setup/kubernetes-with-kubeadm.md new file mode 100644 index 00000000..85ab399c --- /dev/null +++ b/content/en/docs/setup/kubernetes-with-kubeadm.md @@ -0,0 +1,159 @@ +--- +title: "4.1. Setup Kubernetes - Kubeadm" +description: "" +date: 2021-12-13 +lastmod: 2021-12-13 +draft: false +weight: 221 +contributors: ["Youngcheol Jang"] +menu: + docs: + parent: "setup" +images: [] +--- + +## 1. Prerequisite + +쿠버네티스 클러스터를 구축하기에 앞서, 필요한 구성요소들을 **클러스터에** 설치합니다. + +[Setup Prerequisite]({{< relref "docs/setup/setup-pre-requisite.md" >}})을 참고하여 Kubernetes를 설치하기 전에 필요한 요소들을 **클러스터에** 설치해 주시기 바랍니다. + +쿠버네티스를 위한 네트워크의 설정을 변경합니다. + +```text +sudo modprobe br_netfilter + +cat <}})을 참고하여 다음 컴포넌트들을 설치해 주시기 바랍니다. + +- helm +- kustomize +- CSI plugin +- [Optional] nvidia-docker, nvidia-device-plugin + +## 5. 정상 설치 확인 + +다음 명령어를 통해 노드의 STATUS가 Ready 상태가 되었는지 확인합니다. + +```text +kubectl get nodes +NAME STATUS ROLES AGE VERSION +ubuntu Ready control-plane,master 2m55s v1.21.7 +``` + +## 6. References + +- [kubeadm](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm) diff --git a/content/en/docs/setup/kubernetes-with-minikube.md b/content/en/docs/setup/kubernetes-with-minikube.md new file mode 100644 index 00000000..5b4cacab --- /dev/null +++ b/content/en/docs/setup/kubernetes-with-minikube.md @@ -0,0 +1,204 @@ +--- +title: "4.2. Setup Kubernetes - Minikube" +description: "" +date: 2021-12-13 +lastmod: 2021-12-13 +draft: false +weight: 222 +contributors: ["Jaeyeon Kim"] +menu: + docs: + parent: "setup" +images: [] +--- + +## 1. Prerequisite + +쿠버네티스 클러스터를 구축하기에 앞서, 필요한 구성요소들을 **클러스터에** 설치합니다. + +[Setup Prerequisite]({{< relref "docs/setup/setup-pre-requisite.md" >}})을 참고하여 Kubernetes를 설치하기 전에 필요한 요소들을 **클러스터에** 설치해 주시기 바랍니다. + +### Minikube binary + +Minikube 를 사용하기 위해, v1.24.0 버전의 Minikube 바이너리를 설치합니다. + +```text +wget https://github.com/kubernetes/minikube/releases/download/v1.24.0/minikube-linux-amd64 +sudo install minikube-linux-amd64 /usr/local/bin/minikube +``` + +정상적으로 설치되었는지 확인합니다. + +```text +minikube version +``` + +다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다. + +```text +mlops@ubuntu:~$ minikube version +minikube version: v1.24.0 +commit: 76b94fb3c4e8ac5062daf70d60cf03ddcc0a741b +``` + +## 2. 쿠버네티스 클러스터 셋업 + +이제 Minikube 를 활용해 쿠버네티스 클러스터를 **클러스터에** 구축합니다. +GPU 의 원활한 사용과, 클러스터-클라이언트 간 통신을 간편하게 수행하기 위해, Minikube 는 `driver=none` 옵션을 활용하여 실행합니다. `driver=none` 옵션은 root user 로 실행해야함에 주의바랍니다. + +root user 로 전환합니다. + +```text +sudo su +``` + +`minikube start` 를 수행하여 쿠버네티스 클러스터 구축을 진행합니다. Kubeflow 의 원활한 사용을 위해, 쿠버네티스 버전은 v1.21.7 로 지정하여 구축하며 `--extra-config` 를 추가합니다. + +```text +minikube start --driver=none \ + --kubernetes-version=v1.21.7 \ + --extra-config=apiserver.service-account-signing-key-file=/var/lib/minikube/certs/sa.key \ + --extra-config=apiserver.service-account-issuer=kubernetes.default.svc +``` + +### Disable default addons + +Minikube 를 설치하면 Default 로 설치되는 addon 이 존재합니다. 이 중 저희가 사용하지 않을 addon 을 비활성화합니다. + +```text +minikube addons disable storage-provisioner +minikube addons disable default-storageclass +``` + +모든 addon 이 비활성화된 것을 확인합니다. + +```text +minikube addons list +``` + +다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다. + +```text +root@ubuntu:/home/mlops# minikube addons list +|-----------------------------|----------|--------------|-----------------------| +| ADDON NAME | PROFILE | STATUS | MAINTAINER | +|-----------------------------|----------|--------------|-----------------------| +| ambassador | minikube | disabled | unknown (third-party) | +| auto-pause | minikube | disabled | google | +| csi-hostpath-driver | minikube | disabled | kubernetes | +| dashboard | minikube | disabled | kubernetes | +| default-storageclass | minikube | disabled | kubernetes | +| efk | minikube | disabled | unknown (third-party) | +| freshpod | minikube | disabled | google | +| gcp-auth | minikube | disabled | google | +| gvisor | minikube | disabled | google | +| helm-tiller | minikube | disabled | unknown (third-party) | +| ingress | minikube | disabled | unknown (third-party) | +| ingress-dns | minikube | disabled | unknown (third-party) | +| istio | minikube | disabled | unknown (third-party) | +| istio-provisioner | minikube | disabled | unknown (third-party) | +| kubevirt | minikube | disabled | unknown (third-party) | +| logviewer | minikube | disabled | google | +| metallb | minikube | disabled | unknown (third-party) | +| metrics-server | minikube | disabled | kubernetes | +| nvidia-driver-installer | minikube | disabled | google | +| nvidia-gpu-device-plugin | minikube | disabled | unknown (third-party) | +| olm | minikube | disabled | unknown (third-party) | +| pod-security-policy | minikube | disabled | unknown (third-party) | +| portainer | minikube | disabled | portainer.io | +| registry | minikube | disabled | google | +| registry-aliases | minikube | disabled | unknown (third-party) | +| registry-creds | minikube | disabled | unknown (third-party) | +| storage-provisioner | minikube | disabled | kubernetes | +| storage-provisioner-gluster | minikube | disabled | unknown (third-party) | +| volumesnapshots | minikube | disabled | kubernetes | +|-----------------------------|----------|--------------|-----------------------| +``` + +## 3. 쿠버네티스 클라이언트 셋업 + +이번에는 **클라이언트**에 쿠버네티스의 원활한 사용을 위한 도구를 설치합니다. +**클라이언트**와 **클러스터** 노드가 분리되지 않은 경우에는 root user 로 모든 작업을 진행해야 함에 주의바랍니다. + +**클라이언트**와 **클러스터** 노드가 분리된 경우, 우선 kubernetes 의 관리자 인증 정보를 **클라이언트**로 가져옵니다. + +1. **클러스터**에서 config를 확인합니다. + + ```text + # 클러스터 노드 + minikube kubectl -- config view --flatten + ``` + +2. 다음과 같은 정보가 출력됩니다. + + ```text + apiVersion: v1 + clusters: + - cluster: + certificate-authority-data: LS0tLS1CRUd.... + extensions: + - extension: + last-update: Mon, 06 Dec 2021 06:55:46 UTC + provider: minikube.sigs.k8s.io + version: v1.24.0 + name: cluster_info + server: https://192.168.0.62:8443 + name: minikube + contexts: + - context: + cluster: minikube + extensions: + - extension: + last-update: Mon, 06 Dec 2021 06:55:46 UTC + provider: minikube.sigs.k8s.io + version: v1.24.0 + name: context_info + namespace: default + user: minikube + name: minikube + current-context: minikube + kind: Config + preferences: {} + users: + - name: minikube + user: + client-certificate-data: LS0tLS1CRUdJTi.... + client-key-data: LS0tLS1CRUdJTiBSU0.... + ``` + +3. **클라이언트** 노드에서 `.kube` 폴더를 생성합니다. + + ```text + # 클라이언트 노드 + mkdir -p /home/$USER/.kube + ``` + +4. 해당 파일에 2. 에서 출력된 정보를 붙여넣은 뒤 저장합니다. + + ```text + vi /home/$USER/.kube/config + ``` + +## 4. 쿠버네티스 기본 모듈 설치 + +[Setup Kubernetes Modules]({{< relref "docs/setup/setup-kubernetes-module.md" >}})을 참고하여 다음 컴포넌트들을 설치해 주시기 바랍니다. + +- helm +- kustomize +- CSI plugin +- [Optional] nvidia-docker, nvidia-device-plugin + +## 5. 정상 설치 확인 + +최종적으로 node 가 Ready 인지, OS, Docker, Kubernetes 버전을 확인합니다. + +```text +kubectl get nodes -o wide +``` + +다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다. + +```text +NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME +ubuntu Ready control-plane,master 2d23h v1.21.7 192.168.0.75 Ubuntu 20.04.3 LTS 5.4.0-91-generic docker://20.10.11 +``` diff --git a/content/en/docs/setup/kubernetes.md b/content/en/docs/setup/kubernetes.md new file mode 100644 index 00000000..3bca0e8b --- /dev/null +++ b/content/en/docs/setup/kubernetes.md @@ -0,0 +1,39 @@ +--- +title : "2. Setup Kubernetes" +description: "Setup Kubernetes" +date: 2021-12-13 +lastmod: 2021-12-13 +draft: false +weight: 202 +contributors: ["Jaeyeon Kim"] +menu: + docs: + parent: "setup" +images: [] +--- + +## Setup Kubernetes Cluster + +쿠버네티스를 처음 배우시는 분들에게 첫 진입 장벽은 쿠버네티스 실습 환경을 구축하는 것입니다. + +프로덕션 레벨의 쿠버네티스 클러스터를 구축할 수 있게 공식적으로 지원하는 도구는 kubeadm 이지만, 사용자들이 조금 더 쉽게 구축할 수 있도록 도와주는 kubespray, kops 등의 도구도 존재하며, 학습 목적을 위해서 컴팩트한 쿠버네티스 클러스터를 정말 쉽게 구축할 수 있도록 도와주는 k3s, minikube, microk8s, kind 등의 도구도 존재합니다. + +각각의 도구는 장단점이 다르기에 사용자마다 선호하는 도구가 다른 점을 고려하여, 본 글에서는 kubeadm, k3s, minikube 의 3 가지 도구를 활용하여 쿠버네티스 클러스터를 구축하는 방법을 다룹니다. +각 도구에 대한 자세한 비교는 다음 쿠버네티스 [공식 문서]((https://kubernetes.io/ko/docs/tasks/tools/))를 확인해주시기 바랍니다. + +본 *모두의 MLOps*에서는 구축하게 될 MLOps 구성 요소들을 원활히 사용하기 위해, 각각의 도구를 활용해 쿠버네티스 클러스터를 구축할 때, 추가적으로 설정해주어야 하는 부분이 추가되어 있습니다. + +Ubuntu OS 까지는 설치되어 있는 데스크탑을 k8s cluster 로 구축한 뒤, 외부 클라이언트 노드에서 쿠버네티스 클러스터에 접근하는 것을 확인하는 것까지가 본 **Setup Kubernetes**단원의 범위입니다. + +자세한 구축 방법은 3 가지 도구마다 다르기에 다음과 같은 흐름으로 구성되어 있습니다. + +```text +3. Setup Prerequisite +4. Setup Kubernetes + 4.1. with kubeadm + 4.2. with minikube + 4.3. with k3s +5. Setup Kubernetes Modules +``` + +그럼 이제 각각의 도구를 활용해 쿠버네티스 클러스터를 구축해보겠습니다. 반드시 모든 도구를 사용해 볼 필요는 없으며, 이 중 여러분이 익숙하신 도구를 활용해주시면 충분합니다. diff --git a/content/en/docs/setup/setup-kubernetes-module.md b/content/en/docs/setup/setup-kubernetes-module.md new file mode 100644 index 00000000..4992d9e5 --- /dev/null +++ b/content/en/docs/setup/setup-kubernetes-module.md @@ -0,0 +1,153 @@ +--- +title: "5. Setup Kubernetes Modules" +description: "Install Helm, Kustomize" +date: 2021-12-13 +lastmod: 2021-12-13 +draft: false +weight: 230 +contributors: ["Jaeyeon Kim"] +menu: + docs: + parent: "setup" +images: [] +--- + +## Helm + +Helm 은 쿠버네티스 패키지와 관련된 리소스를 한 번에 배포하고 관리할 수 있게 도와주는 패키지 매니징 도구 중 하나입니다. + +1. 현재 폴더에 Helm v3.7.1 버전을 다운받습니다. + + ```text + wget https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz + ``` + +2. helm 을 사용할 수 있도록 압축을 풀고, 파일의 위치를 변경합니다. + + ```text + tar -zxvf helm-v3.5.4-linux-amd64.tar.gz + sudo mv linux-amd64/helm /usr/local/bin/helm + ``` + +3. 정상적으로 설치되었는지 확인합니다. + + ```text + helm help + ``` + + 다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다. + + ```text + The Kubernetes package manager + + Common actions for Helm: + + - helm search: search for charts + - helm pull: download a chart to your local directory to view + - helm install: upload the chart to Kubernetes + - helm list: list releases of charts + + Environment variables: + + | Name | Description | + |--------------------------|---------------------------------------------------------------------| + | $HELM_CACHE_HOME | set an alternative location for storing cached files. | + | $HELM_CONFIG_HOME | set an alternative location for storing Helm configuration. | + | $HELM_DATA_HOME | set an alternative location for storing Helm data. | + + ... + ``` + +## Kustomize + +kustomize 또한 여러 쿠버네티스 리소스를 한 번에 배포하고 관리할 수 있게 도와주는 패키지 매니징 도구 중 하나입니다. + +1. 현재 폴더에 kustomize v3.10.0 버전을 다운받습니다. + + ```text + wget https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv3.10.0/kustomize_v3.10.0_linux_amd64.tar.gz + ``` + +2. kustomize 를 사용할 수 있도록 압축을 풀고, 파일의 위치를 변경합니다. + + ```text + tar -zxvf kustomize_v3.10.0_linux_amd64.tar.gz + sudo mv kustomize_3.2.0_linux_amd64 /usr/local/bin/kustomize + ``` + +3. 정상적으로 설치되었는지 확인합니다. + + ```text + kustomize help + ``` + + 다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다. + + ```text + Manages declarative configuration of Kubernetes. + See https://sigs.k8s.io/kustomize + + Usage: + kustomize [command] + + Available Commands: + build Print configuration per contents of kustomization.yaml + cfg Commands for reading and writing configuration. + completion Generate shell completion script + create Create a new kustomization in the current directory + edit Edits a kustomization file + fn Commands for running functions against configuration. + ... + ``` + +## CSI Plugin : Local Path Provisioner + +1. CSI Plugin 은 kubernetes 내의 스토리지를 담당하는 모듈입니다. 단일 노드 클러스터에서 쉽게 사용할 수 있는 CSI Plugin 인 Local Path Provisioner 를 설치합니다. + + ```text + kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.20/deploy/local-path-storage.yaml + ``` + + 다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다. + + ```text + namespace/local-path-storage created + serviceaccount/local-path-provisioner-service-account created + clusterrole.rbac.authorization.k8s.io/local-path-provisioner-role created + clusterrolebinding.rbac.authorization.k8s.io/local-path-provisioner-bind created + deployment.apps/local-path-provisioner created + storageclass.storage.k8s.io/local-path created + configmap/local-path-config created + ``` + +2. 또한, 다음과 같이 local-path-storage namespace 에 provisioner pod 가 Running 인지 확인합니다. + + ```text + kubectl -n local-path-storage get pod + ``` + + 정상적으로 수행할 경우 아래와 같이 출력됩니다. + + ```text + NAME READY STATUS RESTARTS AGE + local-path-provisioner-d744ccf98-xfcbk 1/1 Running 0 7m + ``` + +4. 다음을 수행하여 default storage class 로 변경합니다. + + ```text + kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' + ``` + +5. default storage class 로 설정되었는지 확인합니다. + + ```text + kubectl get sc + ``` + + 다음과 같이 NAME 에 `local-path (default)` 인 storage class 가 존재하는 것을 확인합니다. + + ```text + NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE + local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 2h + ``` diff --git a/content/en/docs/setup/setup-nvidia-gpu.md b/content/en/docs/setup/setup-nvidia-gpu.md new file mode 100644 index 00000000..b945e55e --- /dev/null +++ b/content/en/docs/setup/setup-nvidia-gpu.md @@ -0,0 +1,184 @@ +--- +title: "6. (Optional) Setup GPU" +description: "Install nvidia docker, nvidia device plugin" +date: 2021-12-13 +lastmod: 2021-12-13 +draft: false +weight: 231 +contributors: ["Jaeyeon Kim"] +menu: + docs: + parent: "setup" +images: [] +--- + +쿠버네티스 및 Kubeflow 등에서 GPU 를 사용하기 위해서는 다음 작업이 필요합니다. + +## 1. Install NVIDIA Driver + +`nvidia-smi` 수행 시 다음과 같은 화면이 출력된다면 이 단계는 스킵해 주시기 바랍니다. + + ```text + mlops@ubuntu:~$ nvidia-smi + +-----------------------------------------------------------------------------+ + | NVIDIA-SMI 470.86 Driver Version: 470.86 CUDA Version: 11.4 | + |-------------------------------+----------------------+----------------------+ + | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | + | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | + | | | MIG M. | + |===============================+======================+======================| + | 0 NVIDIA GeForce ... Off | 00000000:01:00.0 Off | N/A | + | 25% 32C P8 4W / 120W | 211MiB / 6078MiB | 0% Default | + | | | N/A | + +-------------------------------+----------------------+----------------------+ + | 1 NVIDIA GeForce ... Off | 00000000:02:00.0 Off | N/A | + | 0% 34C P8 7W / 175W | 5MiB / 7982MiB | 0% Default | + | | | N/A | + +-------------------------------+----------------------+----------------------+ + + +-----------------------------------------------------------------------------+ + | Processes: | + | GPU GI CI PID Type Process name GPU Memory | + | ID ID Usage | + |=============================================================================| + | 0 N/A N/A 1644 G /usr/lib/xorg/Xorg 198MiB | + | 0 N/A N/A 1893 G /usr/bin/gnome-shell 10MiB | + | 1 N/A N/A 1644 G /usr/lib/xorg/Xorg 4MiB | + +-----------------------------------------------------------------------------+ + ``` + +`nvidia-smi`의 출력 결과가 위와 같지 않다면 장착되어 있는 GPU에 맞는 nvidia driver를 설치해 주시기 바랍니다. + +만약 nvidia driver의 설치에 익숙하지 않다면 아래 명령어를 통해 설치하시기 바랍니다. + + ```text + sudo add-apt-repository ppa:graphics-drivers/ppa + sudo apt update && sudo apt install -y ubuntu-drivers-common + sudo ubuntu-drivers autoinstall + sudo reboot + ``` + +## 2. NVIDIA-Docker 설치 + +NVIDIA-Docker 를 설치합니다. + +```text +distribution=$(. /etc/os-release;echo $ID$VERSION_ID) +curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list +sudo apt-get update +sudo apt-get install -y nvidia-docker2 +sudo systemctl restart docker +``` + +정상적으로 설치되었는지 확인하기 위해, GPU 를 사용하는 도커 컨테이너를 실행해봅니다. + +```text +sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi +``` + +다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다. + + ```text + mlops@ubuntu:~$ sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi + +-----------------------------------------------------------------------------+ + | NVIDIA-SMI 470.86 Driver Version: 470.86 CUDA Version: 11.4 | + |-------------------------------+----------------------+----------------------+ + | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | + | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | + | | | MIG M. | + |===============================+======================+======================| + | 0 NVIDIA GeForce ... Off | 00000000:01:00.0 Off | N/A | + | 25% 32C P8 4W / 120W | 211MiB / 6078MiB | 0% Default | + | | | N/A | + +-------------------------------+----------------------+----------------------+ + | 1 NVIDIA GeForce ... Off | 00000000:02:00.0 Off | N/A | + | 0% 34C P8 6W / 175W | 5MiB / 7982MiB | 0% Default | + | | | N/A | + +-------------------------------+----------------------+----------------------+ + + +-----------------------------------------------------------------------------+ + | Processes: | + | GPU GI CI PID Type Process name GPU Memory | + | ID ID Usage | + |=============================================================================| + +-----------------------------------------------------------------------------+ + ``` + +## 3. NVIDIA-Docker 를 Default Container Runtime 으로 설정 + +쿠버네티스는 기본적으로 Docker-CE 를 Default Container Runtime 으로 사용합니다. +따라서, Docker Container 내에서 NVIDIA GPU 를 사용하기 위해서는 NVIDIA-Docker 를 Container Runtime 으로 사용하여 pod 를 생성할 수 있도록 Default Runtime 을 수정해주어야 합니다. + +1. `/etc/docker/daemon.json` 파일을 열어 다음과 같이 수정합니다. + + ```text + sudo vi /etc/docker/daemon.json + + { + "default-runtime": "nvidia", + "runtimes": { + "nvidia": { + "path": "nvidia-container-runtime", + "runtimeArgs": [] + } + } + } + ``` + +2. 파일이 변경된 것을 확인한 후, Docker 를 재시작합니다. + + ```text + sudo systemctl daemon-reload + sudo service docker restart + ``` + +3. 변경 사항이 반영되었는지 확인합니다. + + ```text + sudo docker info | grep nvidia + ``` + + 다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다. + + ```text + mlops@ubuntu:~$ docker info | grep nvidia + Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux nvidia runc + Default Runtime: nvidia + ``` + +## 4. Nvidia-Device-Plugin + +1. nvidia-device-plugin daemonset을 생성합니다. + + ```text + kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.10.0/nvidia-device-plugin.yml + ``` + +2. nvidia-device-plugin pod이 RUNNING 상태로 생성되었는지 확인합니다. + + ```text + kubectl get pod -n kube-system | grep nvidia + ``` + + 다음과 같은 결과가 출력되어야 합니다. + + ```text + kube-system nvidia-device-plugin-daemonset-nlqh2 1/1 Running 0 1h + ``` + +3. node 정보에 gpu 가 사용가능하도록 설정되었는지 확인합니다. + + ```text + kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu" + ``` + + 다음과 같은 메시지가 보이면 정상적으로 설정된 것을 의미합니다. + (*모두의 MLOps* 에서 실습을 진행한 클러스터는 2개의 GPU가 있기 때문에 2가 출력이 됩니다. + 본인의 클러스터의 GPU 개수와 맞는 숫자가 출력된다면 됩니다.) + + ```text + NAME GPU + ubuntu 2 + ``` + +설정되지 않은 경우, GPU 의 value 가 `` 으로 표시됩니다. diff --git a/content/en/docs/setup/setup-pre-requisite.md b/content/en/docs/setup/setup-pre-requisite.md new file mode 100644 index 00000000..0751947d --- /dev/null +++ b/content/en/docs/setup/setup-pre-requisite.md @@ -0,0 +1,188 @@ +--- +title: "3. Setup Prerequisite" +description: "Install docker" +date: 2021-12-13 +lastmod: 2021-12-13 +draft: false +weight: 210 +contributors: ["Jaeyeon Kim"] +menu: + docs: + parent: "setup" +images: [] +--- + + +이 페이지에서는 쿠버네티스를 설치하기에 앞서, **클러스터**와 **클라이언트**에 설치 혹은 설정해두어야 하는 컴포넌트들에 대한 매뉴얼을 설명합니다. + +## Install apt packages + +추후 클라이언트와 클러스터의 원활한 통신을 위해서는 Port-Forwarding 을 수행해야 할 일이 있습니다. +Port-forwarding 을 위해서는 **클러스터**에 다음 패키지를 설치해주어야 합니다. + +```text +sudo apt-get update +sudo apt-get install -y socat +``` + +## Install Docker + +1. 도커 설치에 필요한 APT 패키지들을 설치합니다. + + ```text + sudo apt-get update && sudo apt-get install ca-certificates curl gnupg lsb-release + ``` + +2. 도커의 공식 GPG key 를 추가합니다. + + ```text + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + ``` + +3. apt 패키지 매니저로 도커를 설치할 때, stable Repository 에서 받아오도록 설정합니다. + + ```text + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + ``` + +4. 현재 설치 가능한 도커 버전을 확인합니다. + + ```text + apt-cache madison docker-ce + ``` + +5. `5:20.10.11~3-0~ubuntu-focal` 버전이 있는지 확인하고, 해당 버전의 도커를 설치합니다. + + ```text + sudo apt-get install containerd.io docker-ce=5:20.10.11~3-0~ubuntu-focal docker-ce-cli=5:20.10.11~3-0~ubuntu-focal + ``` + +6. 도커가 정상적으로 설치된 것을 확인합니다. + + ```text + sudo docker run hello-world + ``` + + 명령어 실행 후 다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다. + + ```text + mlops@ubuntu:~$ sudo docker run hello-world + + Hello from Docker! + This message shows that your installation appears to be working correctly. + + To generate this message, Docker took the following steps: + 1. The Docker client contacted the Docker daemon. + 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. + (amd64) + 3. The Docker daemon created a new container from that image which runs the + executable that produces the output you are currently reading. + 4. The Docker daemon streamed that output to the Docker client, which sent it + to your terminal. + + To try something more ambitious, you can run an Ubuntu container with: + $ docker run -it ubuntu bash + + Share images, automate workflows, and more with a free Docker ID: + https://hub.docker.com/ + + For more examples and ideas, visit: + https://docs.docker.com/get-started/ + ``` + +6. docker 관련 command를 sudo 키워드 없이 사용할 수 있도록 하기 위해 다음 명령어를 통해 권한을 추가합니다. + + ```text + sudo groupadd docker + sudo usermod -aG docker $USER + newgrp docker + ``` + +7. sudo 키워드 없이 docker command를 사용할 수 있게 된 것을 확인하기 위해, 다시 한 번 docker run을 실행합니다. + + ```text + mlops@ubuntu:~$ docker run hello-world + + Hello from Docker! + This message shows that your installation appears to be working correctly. + + To generate this message, Docker took the following steps: + 1. The Docker client contacted the Docker daemon. + 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. + (amd64) + 3. The Docker daemon created a new container from that image which runs the + executable that produces the output you are currently reading. + 4. The Docker daemon streamed that output to the Docker client, which sent it + to your terminal. + + To try something more ambitious, you can run an Ubuntu container with: + $ docker run -it ubuntu bash + + Share images, automate workflows, and more with a free Docker ID: + https://hub.docker.com/ + + For more examples and ideas, visit: + https://docs.docker.com/get-started/ + ``` + +## Turn off Swap Memory + +kubelet 이 정상적으로 동작하게 하기 위해서는 **클러스터** 노에 swap이라고 불리는 가상메모리를 꺼 두어야 합니다. 다음 명령어를 통해 swap을 꺼 둡니다. +**(클러스터와 클라이언트를 동일한 데스크탑에서 사용할 때 swap 메모리를 종료할 경우 속도의 저하가 있을 수 있습니다.)** + +```text +sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab +sudo swapoff -a +``` + +## Install Kubectl + +kubectl 은 쿠버네티스 클러스터에게 API 를 요청할 때 사용하는 클라이언트 툴 입니다. **클라이언트** 노드에 설치해두어야 합니다. + +1. 현재 폴더에 kubectl v1.21.7 버전을 다운받습니다. + + ```text + curl -LO https://dl.k8s.io/release/v1.21.7/bin/linux/amd64/kubectl + ``` + +2. kubectl 을 사용할 수 있도록 파일의 권한과 위치를 변경합니다. + + ```text + sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl + ``` + +3. 정상적으로 설치되었는지 확인합니다. + + ```text + kubectl --help + ``` + + 다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다. + + ```text + kubectl controls the Kubernetes cluster manager. + + Find more information at: + https://kubernetes.io/docs/reference/kubectl/overview/ + + Basic Commands (Beginner): + create Create a resource from a file or from stdin + expose Take a replication controller, service, deployment or pod and + expose it as a new Kubernetes service + run Run a particular image on the cluster + set Set specific features on objects + ... + ``` + +4. 여러 개의 쿠버네티스 클러스터를 사용하는 경우, 여러 개의 kubeconfig 파일을 관리해야 하는 경우가 있습니다. +여러 개의 kubeconfig 파일 혹은 여러 개의 kube-context 를 효율적으로 관리하는 방법은 다음과 같은 문서를 참고하시기 바랍니다. + + - [https://dev.to/aabiseverywhere/configuring-multiple-kubeconfig-on-your-machine-59eo](https://dev.to/aabiseverywhere/configuring-multiple-kubeconfig-on-your-machine-59eo) + - [https://github.com/ahmetb/kubectx](https://github.com/ahmetb/kubectx)) + +## References + +- [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/) +- [리눅스에 kubectl 설치 및 설정](https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/) diff --git a/static/images/docs/setup/central-dashboard.png b/static/images/docs/setup/central-dashboard.png new file mode 100644 index 00000000..c7cfb6ab Binary files /dev/null and b/static/images/docs/setup/central-dashboard.png differ diff --git a/static/images/docs/setup/katib-ui.png b/static/images/docs/setup/katib-ui.png new file mode 100644 index 00000000..f7e5e659 Binary files /dev/null and b/static/images/docs/setup/katib-ui.png differ diff --git a/static/images/docs/setup/login-after-install.png b/static/images/docs/setup/login-after-install.png new file mode 100644 index 00000000..c3d63400 Binary files /dev/null and b/static/images/docs/setup/login-after-install.png differ diff --git a/static/images/docs/setup/pipeline-ui.png b/static/images/docs/setup/pipeline-ui.png new file mode 100644 index 00000000..787fd9be Binary files /dev/null and b/static/images/docs/setup/pipeline-ui.png differ