쿠버플로우(1)
사용버전
쿠버네티스 >>> 1.15v
쿠버네티스 기본 사양 : 4CPU 이상, 50GB 스토리지 이상, 12GB 메모리 이상
쿠베플로우 >>> 1.0v
쿠베플로우 기본 사양 : cpu 8개 , 용량은 20기가 메모리, 100기가 스토리지, k80 gpu2개
쿠베플로우 설치시 필요2가지
1. 쿠버네티스
2. kustomize : 쿠버네티스 애플리케이션 배포/관리
- 쿠버네티스 애플리케이션 배포/관리(복잡한 설절이나 다양한 환경서 배포 운영을 위해)
사용 os
- 우분투 20.04(미니멀)
- 가상환경 2개(마스터 노드, 워커 노드)
구글 클라우드
1. 프로젝트 선택
프로젝트 이름 : kb-sy0218
compute engine api >>> 사용
vm인스턴스 만들기




위와 같이 인스턴스-2도 만들어 주자

ssh연결 ㄱㄱㄱ
도커 설치 >>> 18.09
1. sudo apt-get update : 저장소 업데이터
2. sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common : 도커 ce를 설치하기 위한 사전 패키지 설치
(1) apt_transport-https : https 프로토콜을 통해 보안된 연결로 원격 저장소에서 패키지를 다운로드 할 수 있도록 해주는 패키지(보안성, 무결성)
(2) ca-certificates : 시스템에서 사용하는 인증서들의 모음을 제공해주는 패키지
(3) curl : 데이터를 전송하거나 받는 도구
(4) gnupg-agent : 암호화 및 디지털 서명을 지원하는 오픈소스 암호화 도구(5) software-properties-common : 저장소 관리와 관련된 유틸리티와 라이브러리 제공
3. 도커의 GPG 공개키 다운로드 및 시스템 추가
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4. 도커 관리를 위한 APT 저장소에 추가
- sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
5. 저장소 변경 사항을 적용을 위한 패키지 목록 업데이트
- sudo apt-get update
6. 도커 ce 및 관련 패키지 설치
- sudo apt-get install -y docker-ce docker-ce-cli containerd.io vim
관리자 권한으로 전환 : sudo su
7. 도커 데몬 구성 옵션을 설정하는 JSON 파일 생성
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
- cgroup 드라이버를 systemd로 설정
- 로그 드라이버를 json-file로 설정
- 로그 최대 크기를 100MB로 설정
- 저장 드라이버를 overlay2로 설정
8. 도커 서비스 설정 디렉토리 생성
- mkdir -p /etc/systemd/system/docker.service.d
9. 시스템 데몬을 다시 로드 / 도커 서비스 재시작
- systemctl daemon-reload
- systemctl restart docker
- sudo systemctl enable docker
해당 내용 워커 노드에도 똑같이 작성해준다
쿠버플로우
- 기계 학습, 딥러닝 워크로드를 쿠버네티스 환경에서 관리하고 실행하기 위한 오픈소스 플랫폼
1. NVIDIA Doacker 설치 진행 필요
- NVDIA GPU와 관련된 컨테이너화된 워크로드 지원하기 위한 도구
- GPU 가속 컨테이너를 효율적으로 실행할 수 있도록 도와주는 도구
Ubuntu 버전을 가져와서 “ubuntu”와 함께 사용되는 변수 release를 설정
release="ubuntu"$(lsb_release -sr | sed -e "s/\.//g")
- ubuntu 20.04 -> ubuntu2004 변수 설정됨
sudo와 gnupg 패키지 설치
sudo apt install sudo gnupg
NVIDIA CUDA의 APT 저장소에서 공개 키를 가져오기
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A4B469963BF863CC
- 병렬컴퓨팅 위한 gpgpu 컴퓨팅 플랫폼과 프로그래밍 모델
CUDA설치를 위한 저장소 설정 및 ML용 저장소 설정
sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/'$release'/x86_64 /" > /etc/apt/sources.list.d/nvidia-cuda.list'
sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/machine-learning/repos/'$release'/x86_64 /" > /etc/apt/sources.list.d/nvidia-machine-learning.list'
sudo apt update : 저장소 업데이트
nvidia와 관련된 패키지 검색
sudo apt-cache search nvidia
nvidia 패키지 설치(384)
sudo apt-get install -y nvidia-384
country ..... : 91
keyboard layout : 1
method for .... : 12
dkms와 nvidia-modprobe 패키지 설치
sudo apt-get install -y dkms nvidia-modprobe
- dkms : 그래픽 드라이버나 다른 하드웨어 드라이버를 커널 모듈로 설치하고 관리
- nvidia-modprobe : 엔비디아 그래픽 드라이버를 간편하게 로드하거나 해체할 수 있도록 해주고, gpu기능을 활용하기 위해 필요한 설정 수행
커널에서 모듈을 import 시켜주는것이기 떄문에 시스템 재부팅 ㄱㄱㄱ
sudo reboot
nvidia 설치가 완료되면 드라이버와 관련된 정보 확인 가능
sudo cat /proc/driver/nvidia/version | nvidia-smi
- nvidia-smi : 엔비디아 그래픽 카드와 관련된 정보와 상태를 확인하는 명령
nvidia-docker 설치를 위한 키 가져오기
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
Linux 시스템의 배포판과 버전 정보를 읽어와서 변수에 할당하기
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
NVDIA Docker 설치와 설정 단계
sudo apt-get install nvidia-docker2
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
- "default-runtime": "nvidia" : 도커 데몬에서 기본 컨테이너 런타임으로 NVIDIA GPU를 사용하도록 설정하는 부분
- "runtimes": 도커 데몬에서 사용할 GPU 위치를 지정
- "runtimeArgs" : 런타임에 대한 추가 런타임 인수를 지정할 수 있는 부분
도커 재시작
sudo systemctl restart docker
nvidia-docker와 gpu연동이 잘 되었는지 확인
sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
- --rm : 컨테이너 실행이 마치면 컨테이너를 자동으로 삭제하도록 지정
- nvidia/cuda : 이미지 생성
- nvidia-smi : CUDA 이미지 내에서 nvidia-smi 명령을 실행시킴
쿠버네티스 1.15 설치
마스터 워커 공통 영역
1. Kubernetes 패키지 저장소의 GPG 공개 키를 다운로드하고 시스템의 APT 패키지 관리자에 추가
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
2. Kubernetes 패키지 저장소를 APT 저장소에 추가함
이 저장소에서 Kubernetes와 관련된 패키지를 설치할 수 있도록 설정함
$ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
3. Kubernetes 클러스터의 핵심 컴포넌트인 kubelet, kubeadm, kubectl을 설치
버전 1.15.5-00을 설치하도록 지정
$ sudo apt-get install -y kubelet=1.15.5-00 kubeadm=1.15.5-00 kubectl=1.15.5-00
4. 설치된 Kubernetes 패키지의 버전을 고정시킴
이렇게 함으로써 패키지가 자동으로 업그레이드되는 것을 방지
$ sudo apt-mark hold kubelet kubeadm kubectl
5. Kubernetes 클러스터가 네트워크 패키지를 처리할 수 있도록 iptables를 설정함
이 명령어는 네트워크 브리지에서 iptables 호출을 허용하는 설정을 변경함
$ sudo sysctl net.bridge.bridge-nf-call-iptables=1
마스터
1. 마스터 노드를 초기화하는 명령어
$ sudo kubeadm init
* 192.168.0.0/16이 현재 사용하는 네트워크과 겹친다면 172.16.0.0/16으로 사용
$ sudo kubeadm init --pod-network-cidr=192.168.0.0/16
코드 복사해놓고 6번 작업이 완료되면 워커 노드에서 실행
kubeadm join 10.140.0.4:6443 --token lt25tx.uzknzuqqs64ii7hs \
--discovery-token-ca-cert-hash sha256:f48f64118c7cbf5e6caec657fef7649e4cb1ba3e91400f97dcd7155552a9ee82
2. 현재 사용자의 홈 디렉토리에 .kube 디렉토리를 생성함
Kubernetes 설정 파일을 저장하기 위한 디렉토리
$ mkdir -p $HOME/.kube
3. 마스터 노드의 Kubernetes 설정 파일인 admin.conf 파일을 사용자의 .kube 디렉토리로 복사합니다. 이 파일은 클러스터에 접근하기 위한 구성 정보를 담고 있음
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
4. 파일의 소유권을 현재 사용자로 변경
사용자가 kubectl 명령을 실행할 때 해당 구성 파일 사용 가능
$ sudo chown $(id -u):$(id –g) $HOME/.kube/config
혹은
$ sudo chown cloudcccr3:cloudcccr3 $HOME/.kube/config
5. 마스터 노드에 있는 node-role.kubernetes.io/master- 태인트를 모두 제거
마스터 노드에 파드도 스케줄링 되게 하는 작업
$ kubectl taint nodes --all node-role.kubernetes.io/master-
6. Calico 네트워크 플러그인을 클러스터에 배포
Calico는 파드 간의 통신 및 네트워크 관리를 위한 네트워크 솔루션
$ kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml
워커노드
위 과정을 마치면 마스터 노드에 조인할 수 있는 토큰값을 포함한 kubeadm 명령어가 노출됨
해당 명령어를 워커 노드에 그대로 복사하여 실행시키면 워커 노드가 정상적으로 마스터 노드에 조인됨
마스터 노드에서 쿠버네티스 설치가 완료되면 정상적으로 쿠버네티스 클러스터가 설치가 되었는지 확인해봐야함
$ kubectl get node
쿠버네티스 스토리지를 위한 스토리지클래스(StorageClass)를 설치해야 함
쿠베플로우는 동적 프로비저닝을 지원하는 스토리지 클래스가 필요
대부분의 스토리지 클래스가 동적 프로비저닝을 지원해주며, 로컬 스토리지를 지원하는 local-path-storage와 NFS 스토리지를 지원하는 nfs-client-provisioner를 설치함
물론 nfs-client-provisioner를 설치하기 위해서는 NFS 서버 정보도 필요
먼저 NFS 버전 4이상이어야 하며(nfsstat -s) /etc/exports 내 폴더 설정에서 no_root_squash 옵션이 포함되어 있어야 함
- no_root_squash는 NFS(Network File System) 공유를 사용할 때 사용되는 옵션 중 하나
- NFS 서버에서 클라이언트가 공유된 파일 시스템에 액세스할 때 루트 사용자의 권한을 어떻게 처리할지를 제어하는데 사용
- no_root_squash 옵션은 루트 사용자의 액세스 권한을 제한하지 않습니다. NFS 클라이언트의 루트 사용자가 NFS 서버의 파일 시스템을 마치 자신의 로컬 파일 시스템처럼 다룰 수 있게 됨
- 이는 파일 시스템을 공유하는데 있어서 루트 사용자가 특정 작업을 수행해야 하는 경우에 유용할 수 있음
마스터 노드와 워커 노드에 nfs-server 설치
$ sudo apt update
$ sudo apt-get -y install nfs-common nfs-kernel-server rpcbind portmap
마스터 노드에서 nfs 세팅
$ sudo mkdir /mnt/sharedfolder/
마스터 노드에서 공유 디렉토리 권한 변경
$ sudo chmod 777 /mnt/sharedfolder
마스터 노드에서 /etc/exports 세팅
…
/mnt/sharedfolder 마스터노드IP(rw,insecure,sync,no_root_squash,no_subtree_check)
/mnt/sharedfolder 워커노드IP(rw,insecure,sync,no_root_squash,no_subtree_check)
마스터 노드에서 확인
$ nfsstat -s
$ cat /etc/exports
마스터 노드에서 재시작
$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server
워커 노드에서 nfs 설치
$ sudo apt-get -y install nfs-common nfs-kernel-server rpcbind portmap
확인이 되었다면 Helm. 이라는 쿠버네티스 배포툴을 이용하여 nfs-client-provisioner 패키지를 설치해야 함
- Helm은 Kubernetes 애플리케이션 패키지를 관리하고 배포하기 위한 도구
- Helm은 서버 컴포넌트인 Tiller를 통해 클러스터와 통신하여 차트(애플리케이션의 배포 단위)를 설치하고 관리함
마스터 수행
1. 로컬 스토리지 프로비저너를 설치하기 위한 명령어
해당 URL에 있는 YAML 파일을 사용하여 로컬 스토리지 프로비저너를 클러스터에 배포함
$ kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
2. Helm을 설치하기 위한 스크립트를 다운로드
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
3. 다운로드한 스크립트에 실행 권한을 부여
$ chmod 700 get_helm.sh
4. 앞서 다운로드한 Helm 설치 스크립트를 실행하여 Helm을 설치합니다.
$ ./get_helm.sh
5. tiller라는 이름의 서비스 어카운트를 kube-system 네임스페이스에 생성함
Helm의 서버 컴포넌트인 Tiller를 위한 서비스 어카운트
$ kubectl -n kube-system create sa tiller
6. tiller 서비스 어카운트에 대한 ClusterRoleBinding을 생성하여 Tiller에 클러스터 관리자 권한을 부여
- Tiller가 클러스터의 다양한 리소스와 상호작용하는 권한을 가지고 있기 때문에 보안 상의 고려가 필요함
- Helm을 보안적으로 안전하게 사용하기 위해 Tiller에게 필요한 권한을 제한적으로 부여하고 분리된 서비스 어카운트를 생성하는 과정
$ kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
7. Tiller를 설치하기 위해 Helm 초기화를 수행하고, 앞서 생성한 tiller 서비스 어카운트를 사용함
$ helm init --service-account tiller
8. Helm의 차트 저장소를 업데이트함
$ helm repo update
—
Helm 차트(Chart)는 Kubernetes 애플리케이션을 정의하고 패키징하는 데 사용되는 패키지 형식
Helm은 Kubernetes 애플리케이션의 배포, 업그레이드, 롤백 등을 관리하기 위한 도구로서, 애플리케이션을 관리하기 위한 배포 지원 파일들을 하나의 차트로 묶어 관리할 수 있도록 함
Helm 차트는 일종의 템플릿으로서, 애플리케이션을 구성하는 리소스(파드, 서비스, 구성 등)를 정의하고 설정하는 값들을 포함하고 있음
차트에는 다음과 같은 핵심 요소들이 포함됨
- Chart.yaml: 차트의 메타데이터를 정의하는 파일로, 버전, 이름, 설명 등의 정보를 포함함
- templates: 애플리케이션 리소스를 템플릿으로 정의하는 디렉토리
이 디렉토리에는 파드, 서비스, 볼륨 등 Kubernetes 리소스의 템플릿이 YAML 형식으로 저장됨
- values.yaml: 차트의 설정 값을 정의하는 파일로, 애플리케이션 배포 시에 설정되어야 하는 변수들을 관리함
- charts: 다른 Helm 차트를 포함할 수 있는 디렉토리
이를 통해 하나의 차트가 다른 차트를 종속성으로 포함할 수 있음
Helm 차트를 사용하면 다음과 같은 이점을 얻을 수 있음
- 재사용성: Helm 차트를 사용하여 애플리케이션의 템플릿을 정의하고 구성할 수 있으므로, 애플리케이션을 여러 환경에서 쉽게 배포하고 재사용할 수 있음
- 버전 및 롤백 관리: 차트 버전을 관리하여 애플리케이션의 배포 버전을 추적하고 업그레이드 또는 롤백하는 작업을 쉽게 수행할 수 있음
- 값의 분리: values.yaml 파일을 사용하여 설정 값을 분리하여 관리함으로써, 다양한 환경에 맞춰 값들을 조정하거나 사용할 수 있음
Helm 차트를 사용하면 Kubernetes 애플리케이션의 배포와 관리를 효율적이고 일관되게 수행할 수 있음
—
9. NFS 클라이언트 프로비저너를 설치하기 위한 Helm 차트를 사용하여 프로비저너를 배포함
nfs.server와 nfs.path 값을 지정하여 NFS 서버의 주소와 경로를 설정함
- 마스터의 ip 주소 사용
$ helm install --name my-release --set nfs.server=x.x.x.x --set nfs.path=/mnt/sharedfolder stable/nfs-client-provisioner
기존 설정 제거 시
$ helm del --purge my-release
10. nfs-client 스토리지 클래스에 대한 컴파일러에게 필요한 정보를 추가하여 이 스토리지 클래스를 기본 스토리지 클래스로 설정함
$ kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
정상적으로 설치가 된다면 kubectl get storageclass라는 명령으로 설치된 스토리지 클래스를 확인 가능
$ kubectl get storageclass
- 2개의 스토리지 클래스가 조회되고 nfs-client가 default로 설정되어 있다면 성공적으로 설치된 것
GPU 리소스를 위한 nvidia-gpu-plugin을 설치
- 물론 각 노드들마다 nvidia-docker가 설치되어 있어야 정상 작동하며 도커 데몬 설정 파일에 nvidia가 기본 런타임으로 잡혀 있어야 함
$ kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml
파드 내용 확인
$ kubectl get pods -A
- 정상적으로 설치가 되었다면 GPU가 설치된 노드 개수만큼 nvidia-device-plugin 파드가 생성됨
도커 이미지를 저장할 프라이빗 도커 레지스트리를 설치해야 함
- 쿠버네티스가 설치되어 있기 때문에 쿠버네티스 서비스로서 도커 레지스트리 서비스를 올림
—
kubeflow-registry-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
generation: 1
labels:
run: kubeflow-registry
name: kubeflow-registry
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
run: kubeflow-registry
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
run: kubeflow-registry
spec:
containers:
- image: registry:2
imagePullPolicy: IfNotPresent
name: kubeflow-registry
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
—
—
kubeflow-registry-svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
run: kubeflow-registry
name: kubeflow-registry
namespace: default
spec:
ports:
- name: registry
port: 30000
protocol: TCP
targetPort: 5000
nodePort: 30000
selector:
run: kubeflow-registry
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
—
$ kubectl apply -f kubeflow-registry-deploy.yaml
$ kubectl apply -f kubeflow-registry-svc.yaml
마스터, 워커 공통
kubeflow-registry.default.svc.cluster.local 해당 주소는 쿠버네티스만 아는 주소이기 때문에 호스트에서는 인식할 수 있게 /etc/hosts에 입력을 해주어야 함
$ vim /etc/hosts
…
마스터노드IP kubeflow-registry.default.svc.cluster.local