Amazon EKS에 Kubeflow 구축하기

AWS EKS는 Fully managed K8S 서비스 입니다. 이번 글에서는 EKS 환경에 Kubeflow를 구축하는 방법에 대해 정리해보겠습니다.

기본 환경 설치

Kubeflow를 설치하기 이전에 AWS CLI, Docker가 설치되어 있어야 합니다. EKS에서는 최근에 GPU 인스턴스인 P2, P3에 대한 지원을 제공하고 있습니다. 이를 사용하기 위해 AWS Marketplace에서 EKS-optimized AMI with GPU Support를 구독해주어야 합니다.

EKS는 Web UI 또는 eksctl이라는 cli 도구를 사용해서 클러스터를 구성할 수 있습니다. eksctl은 kubectl이나 kops와 유사한 명령어를 제공합니다. 자세한 내용은 https://aws.amazon.com/ko/blogs/opensource/eksctl-eks-cluster-one-command/ 에서 참고하시면 됩니다.

EKS 클러스터 생성

# install eksctl
$ brew tap weaveworks/tap
$ brew install weaveworks/tap/eksctl

# create cluster
$ eksctl create cluster eks-cpu \
--node-type=c4.xlarge \
--timeout=40m \
--nodes=2 \
--region=ap-northeast-2

# NVIDIA driver plugin
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.11/nvidia-device-plugin.yml
kubectl get nodes "-o=custom-columns=NAME:.metadata.name,MEMORY:.status.allocatable.memory,CPU:.status.allocatable.cpu,GPU:.status.allocatable.nvidia\.com/gpu"
  • 먼저 Homebrew로 eksctl을 설치합니다. 이후 아래의 명령어를 통해 c4 인스턴스 기반의 EKS 클러스터를 생성하고 Memory, CPU, GPU 정보를 확인해줍니다.
  • GPU 인스턴스로 클러스터를 생성하고 싶다면 생성하기 이전에 EC2 Limit 페이지에서 p2 또는 p3 인스턴스의 limit을 확인해야 합니다. 0으로 되어있다면 Request limit Increase가 필요합니다.
  • GPU-enabled worker를 가지는 EKS 클러스터를 생성한다면 NVIDIA driver plugin을 활성화시키는 과정이 필요합니다.
  • Create cluster에서 AccessDenied 오류가 발생하는 경우, 사용할 IAM 유저를 생성하고 EKS 관련 permission과 AWSCloudFormationReadOnlyAccess를 추가해주어야 합니다. EKS는 현재 기준 1.11 버전을 default로 사용하고 있습니다.

eks

EKS 메뉴에 가보시면 EC2 인스턴스, 네트워크 설정이 완료된 것을 확인하실 수 있습니다. AWS CloudFormation에서 cluster와 node-group에 대한 stack이 생성됩니다.

K8S 대시보드는 AWS EKS 공식 문서를 참고하여 띄울 수 있습니다.

ksonnet을 이용한 KubeFlow 설치

# install ksonnet
$ brew install ksonnet/tap/ks
$ ks version
ksonnet version: 0.13.1
jsonnet version: v0.11.2
client-go version: kubernetes-1.10.4

# install kubeflow
$ export KUBEFLOW_TAG=v0.4.1
$ export KUBEFLOW_SRC=/tmp/kubeflow_src
$ export KFAPP=eks-kubeflow

$ mkdir ${KUBEFLOW_SRC} && cd ${KUBEFLOW_SRC}
$ curl https://raw.githubusercontent.com/kubeflow/kubeflow/${KUBEFLOW_TAG}/scripts/download.sh | bash

$ sh ${KUBEFLOW_SRC}/scripts/kfctl.sh init ${KFAPP} --platform none
$ cd ${KFAPP}
$ sh ${KUBEFLOW_SRC}/scripts/kfctl.sh generate k8s
$ sh ${KUBEFLOW_SRC}/scripts/kfctl.sh apply k8s

ksonnet으로 KubeFlow를 설치하기 이전에 먼저 Homebrew로 ksonnet을 설치합니다.

KubeFlow

kubeflow-pods kubeflow-pvc

KubeFlow를 설치하고 나면 Pods, Deployment, Service, ConfigMap 등 모든 컴포넌트들이 자동으로 배포됩니다. default로 PVC는 EBS gp2 볼륨이 설정된 것을 확인하실 수 있습니다.

EKS에서는 IAM 기반의 RBAC 인증을 사용합니다. 아래의 명령어를 통해 EKS의 JupyterHub를 로컬의 8080 포트로 포워딩해서 접속하실 수 있습니다.

$ kubectl port-forward svc/jupyter-lb -n kubeflow 8080:80

kubeflow-jupyterhub

위와 같이 설치하고 난 이후에 KubeFlow 문서의 git summerization 튜토리얼을 그대로 따라하실 수 있습니다. 모든 컴포넌트가 자동으로 배포되다 보니 생략하고 넘어가는 경우가 많은데 production 환경에서 사용하려면 각 설정 YAML 파일을 내 환경에 맞도록 수정할 필요가 있습니다. 삭제는 아래의 명령어를 통해 실행시키면 됩니다.

$ cd ${KUBEFLOW_SRC}/${KFAPP}
$ sh ${KUBEFLOW_SRC}/scripts/kfctl.sh delete k8s

Reference