( reference : 쿠브플로우, 쿠버네티스에서 머신러닝이 처음이라면! )
[ 1. Kubeflow ]
Contents
- 1.1 ML Workflow
- 1.2 kubeflow
- 1.3 쿠버네티스 복습
- 1.4 Kubeflow 설치
1.3 쿠버네티스 복습
1.3.3 쿠버네티스 구조
Cluster 형태로 구성
-
Cluster = Node의 집합
( 최소 1개의 worker node + 1개의 master node )
-
Node = 여러 개의 Container를 실행
( 최소 1개의 Container )
Node
- Master node :
- worker node & cluster내의 component들을 관리
- kube-api-server, etcd, kube-scheduler, kube-controller-manager 등을 가짐
- Worker node :
- 실제로 일 하는 노드 ( pod를 호스트함 )
- kube-proxy를 가짐
1.3.4 리소스와 컨트롤러
리소스 ex)
- 파드, 볼륨, 서비스, 네임스페이스
컨트롤러 ex)
- 데몬셋, 스테이트풀 셋, 잡 ..
Pod : 쿠버네티스의 “기본 실행/배포 단위”
- node에서 실행되는 “프로세스”
- 각 node마다 실행되고 있는 kubelet에 의해 관리
- “최소 하나 이상의 container”로 구성
- pod 내의 container들은 pod의 리소스를 공유
- pod 내의 컨테이너는, 컨테이너 각자의 포트를 통해 통신
Volume : 스토리지
-
각 컨테이너들의 “외장 디스크”
-
컨테이너는 stateless, 따라서 종료하면 이전 데이터 모두 사라짐
\(\rightarrow\) 보존해야 할 때, Volume을 생성하여 pod에 마운트!
( pod가 사라져도 보존됨 )
-
2개로 나누어짐
-
PV (Persistent Volume) : 볼륨 그 자체
-
provisioning = PV를 만드는 것
( 정적 provisioning & 동적 provisioning )
-
-
PVC (Persistent Volume Claim) : 사용자가 요청하는 볼륨
-
Controller : 파드 관리
- 운영에 필요한 스케일링/롤아웃/롤백/롤링 업데이트
- ex) ReplicaSet, Deployment, DaemonSet, StatefulSet, Job
- (1) ReplicaSet
- 지정된 수의 pod가 항상 실행되도록
- (2) Deployment
- 가장 기본적인 controller
- Stateless 애플리케이션 배포할 때 사용
- ReplicaSet의 상위 개념
- ReplicaSet : Replica 수 만큼의 파드가 생성
- Deployment : 이러한 ReplicaSet을 생성
- (3) Daemon Set
- 데몬 프로세스로 띄워놔야 할 앱이 있을 경우
- ex) 로그 수집기, 모니터링 관련 프로세스
- (4) Stateful Set
- 상태를 가지고 있는 pod를 관리
- 삭제는 역순으로
- 이름 뒤에는 순서를 나타내는 n(0~n)이 붙음
- (5) Job
- 1개 이상의 pod가 요청된 작업을 실행한 후, 잘 종료되었는지 고나리
- “한번 만” 실행하는 작업에 대한 컨트롤러
- (6) CronJob
- 잡을 주기적으로 실행할 수 있는 컨트롤러
- (7) Service
- 생성한 파드를 외부에서 접근할 수 있게 해주는 리소스
- pod의 엔드포인트 제공
- 4종류 ( ClusterIP, NodePort, LoadBalancer, ExternalName )
Namespace : 논리적으로 분리된 작업 그룹
- 작업 그룹은 쿠버네티스 리소스를 가짐 ( = 리소스 그룹 )
- 권한 설정을 통해 공유 & 격리 가능
- 쿠버네티스 설치 시, 생성되는 네임스페이스
- default : 기본 네임스페이스
- kube-system : 쿠버네티스 관리용 파드, 설정이 있는 네임스페이스
- kube-public : 클러스터 내의 “모든” 사용자가 접근 가능한 네임스페이스
- kube-node-lease : 1.13이후 추가된 네임스페이스
1.3.5 오브젝트 템플릿
사용자가 오브젝트(리소스)를 다루는 2가지 방법
- 1) kube-api-server에 API 리퀘스트 ( with JSON 형태 )
- 2) kubectl이라는 CLI ( with yaml 형태 )
YAML 형식은 4개의 필드로 구성
- 1) apiversion
- 2) kind
- 3) metadata
- 4) spec
( 각각의 리소스 별, 사용하는 하위 field는 다름. 이를 알고프면 kubectl explain [리소스명]
)
YAML 대신, kubectl 명령 뒤에 인수로 넣어 작업도 가능하나, YAML 형식 추천!
1.3.6 label, selector, annotation
label & annotation
- 모두 key=value 형식으로 표현
- 차이점
- label = 특정 리소스를 “선택하기 위해”
- annotation = 특정 리소스의 “주석.설명”
selector
- label 기준으로 리소스 선택
NodeSelector
- 특정 label을 가진 node를 선택
1.3.7 Ingress
-
클러스터 외부에서 들어오는 요청을 처리하는 규칙
-
서비스 vs Ingress
- 서비스 : L4 레이어 ( 호스트명 라우팅, URL path 라우팅 불가 )
- Ingress : L7 레이어
-
Ingress = 규칙 명세가 모인 오브젝트. 그 자체로 실행 불가
\(\rightarrow\) Ingress Controller 필요
( ex. nginx ingress controller )
1.3.8 ConfigMap
- 환경설정을 저장하는 리소스
- 컨테이너 내의 애플리케이션에서 사용하는 환경변수를 분리하여 별도로 관리해야!
1.3.9 Secret
-
환경변수에는 DB 비번, 사용자 비번, OAuth Token 같은 정보가 있을 수도
\(\rightarrow\) ConfigMap이 아닌, Secret이라는 별도의 리소스를 통해 관리(보호)
-
Secret의 구분
- 1) 내장 시크릿
- 쿠버네티스 API에 접근 시, Service Account가 사용하는 시크릿
- 2) 사용자 정의 시크릿
- 애플리케이션이 사용
- 1) 내장 시크릿
1.4 Kubeflow 설치
1.4.1 설치 조건
2가지가 준비되어 있어야!
- 1) Kubernetes
- Public cloud의 것을 사용해도 OK …. GCP의 GKE, AWS의 EKS )
- 2) Kustomize
- 쿠버네티스 오브젝트의 배포를 도와주는 툴
1.4.2 kubernetes 설치
- 생략
1.4.3 Private Docker Registry
- 예저 실행 위해, 도커 이미지 저장할 Private docker registry 설치해야!
1.4.4 k9s
-
쿠버네티스 사용을 위해서는
kubectl
을 사용했었음( but, CLI 특성 상, 모니터링 등의 작업에서 편의성 떨어짐 )
-
이를 위해
k9s
라는 툴을 사용
1.4.5 kfctl
-
kubeflow 컴포넌트를 배포/관리하기 위한 CLI 툴
(
kubectl
과 비슷한 역할 )
1.4.6 배포 플랫폼
kubeflow는 배포 플랫폼에 따라 배포 설정 파일 제공
크게 2가지 경우
- 1) 이미 존재하는 kubernetes cluser 환경
- 2) public cloud 서비스 환경
( + 어떠한 인증방식 택하느냐에 따라서도 다름 )
1) 이미 존재하는 kubernetes cluser 환경
- (a) standard kubeflow 버전
- (b) Dex for authentication 버전
2) public cloud 서비스 환경
- (a) AWS의 EKS
- (b) Azure의 AKS
- (c) GCP의 GKE
1.4.7 standard kubeflow 설치
( standard kubeflow 버전이든, Dex for authentication 버전이든, 동일한 순서 )
- 설치에 필요한 환경 변수 설정
$ export KF_NAME=handson-kubeflow
$ export BASE_DIR=/home/$${USER}
$ export KF_DIR=$${BASE_DIR}/$${KF_NAME}
$ export CONFIG_URI="https://raw.githubusercontent.com/kubeflow/manifests/v1.0-branch/kfdef/kfctl_k8s_istio.v1.0.0.yaml"
- kustomize 패키지 build하기
- 설치 폴더에 kustomize라는 폴더가 생성될 것
- 로컬 버전의 배포 템플릿도 생성
$ mkdir -p ${KF_DIR}
$ cd ${KF_DIR}
$ kfctl build -V -f ${CONFIG_URI}
kfctl
을 사용하여, 위의 패키지 실행- Applied the configuration Sucessfully!
- 3개의 namespace가 생성될 것
- kubeflow
- knative-serving
- istio-system
$ export CONFIG_FILE=${KF_DIR}/kfctl_k8s_istio.v1.0.0.yaml
$ kfctl apply -V -f ${CONFIG_FILE}
-
k9s
를 이용하여 pod들의 status 확인하기-
모든 pod들이 정상적으로 running되면, kubeflow 배포는 완료!
-
이제 kubeflow 대쉬보드에 접속 가능
( istio-system의 istio-ingressgateway 서비스 통해서! )
(
http://{서버주소}:31380
)
-
- 대쉬보드 접속
- 사용할 namespace 설정 (
seunghan96
) - 그러면, 해당 namespace 기반의 대쉬보드로 이동될 것!
- 사용할 namespace 설정 (
설치 완료!!
1.4.8 Dex 버전 설치
- 1.4.7과 동일하나, “배포 패키지 파일만 다를 뿐”
- 최초 로그인 정보 :
- id) admin@kubeflow.org
- pw) 12341234
1.4.9 프로파일
- v0.6 버전 이전 : 다중 사용자에 대한 지원 X
- v0.6 버전 이후 : 다중 사용자에 대한 지원 O
- 프로파일(Profile)이라는 kubeflow object를 제공함으로써!
프로파일(Profile)
- 프로파일명과 같은 “namespace의 리소스”와 “kubernetes 리소스”의 모음
- 프로파일 내에 속한 사용자는, 이 리소스 가능!
- 프로파일의 소유자는 다른 사용자에게 자신의 프로파일 조회/수정권한 부여 가능!
- 안전하진 않기 때문에, 리소스에 대한 별도의 보안관리는 필요
프로파일 탬플릿
- 프로파일 탬플릿을 관리할 수 있는 사용자는, cluster admin rule을 가지고 있어야
apiVersion : kubeflow.org/v1beta1
kind : Profile
metadata :
...
spec :
...
EOF
v0.62 버전 이후로 처음 로그인 시, 프로파일 자동 생성기능 제공
생성되고 나면, 아래의 리소스가 생성될 것
- 1) 프로파일 이름과 같은 namespace
- 2)
namespaceAdmin
- 프로파일 소유자 = namespace의 admin
- 3)
ns-access-istio 서비스롤
- namespace 내의 서비스가 istio 라우팅할 수 있는 권한
- 4)
owner-biding-istio 서비스롤 바인딩
- ns-access-istio를 프로파일 소유자에 바인딩
- 5)
default-editor, default-viewer 서비스어카운트
- 사용자가 생성한 리소스에 대한 조회/접근 권한
1.4.10 삭제
최초에 설치했던 config 파일로 진행
$ cd ${DF_DIR}
$ kfctl delete -f ${CONFIG_FILE}