728x90
수동 스케줄링: 원하는 포드를 원하는 노드에
포드 메뉴얼 스케줄링
- 특수한 환경의 경우 특정 노드에서 실행되도록 선호하도록 포드를 제한
- 일반적으로 스케줄러는 자동으로 합리적인 배치를 수행하므로 이러한 제한은 필요하지 않음
- 더 많은 제어가 필요할 수 있는 몇 가지 케이스
- SSD가 있는 노드에서 포드가 실행하기 위한 경우
- 블록체인이나 딥러닝 시스템을 위해 GPU 서비스가 필요한 경우
- 서비스의 성능을 극대화하기 위해 하나의 노드에 필요한 포드를 모두 배치
nodeName 필드를 사용한 매뉴얼 스케쥴링
- 포드를 강제로 원하는 node를 스케줄링 할 수 있음
- spec 아래에 nodeName: work1과 같이 노드 이름 설정
apiVersion: v1
kind: Pod
metadata:
name: http-go
spec:
containers:
- name: http-go
image: gasbugs/http-go
nodeName: work1
노드 셀렉터를 활용한 스케줄링
특정 하드웨어를 가진 노드에서 포드를 실행하고자 하는 경우에 사용
GPU, SSD 등의 이슈를 가진 사항을 적용
다음 명령어로 gpu=true를 적용
$ kubectl label node <node_name> gpu=true
$ kubectl get nodes -L gpu
NAME STATUS ROLES AGE VERSION GPU
master Ready control-plane,master 20d v1.20.1
work1 Ready <none> 20d v1.20.1
work2 Ready <none> 20d v1.20.1 true
레이블링을 활용한 스케줄링
- 다음 http-go-gpu.yaml을 작성하고 포드 생성
apiVersion: v1
kind: Pod
metadata:
name: http-go
spec:
containers:
- name: http-go
image: gasbugs/http-go
nodeSelector:
gpu: "true"
실습
node 명 확인
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 20d v1.20.1
work1 Ready <none> 20d v1.20.1
work2 Ready <none> 20d v1.20.1
http-go-scheduler.yaml 생성
apiVersion: v1
kind: Pod
metadata:
name: http-go
spec:
containers:
- name: http-go
image: gasbugs/http-go
nodeName: work1
kubectl 생성 및 확인
$ kubectl create -f http-go-scheduler.yaml
pod/http-go created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
http-go 1/1 Running 0 23s
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
http-go 1/1 Running 0 31s 10.32.0.4 work1 <none> <none>
http-go-gpu.yaml 생성
apiVersion: v1
kind: Pod
metadata:
name: http-go-gpu
spec:
containers:
- name: http-go
image: gasbugs/http-go
nodeSelector:
gpu: "true"
kubectl 생성
$ kubectl create -f http-go-gpu.yaml
pod/http-go-gpu created
label 이 없어서 Panding 상태인 것을 확인할 수 있음
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
http-go-gpu 0/1 Pending 0 25s
label 확인
$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master Ready control-plane,master 20d v1.20.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=
work1 Ready <none> 20d v1.20.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work1,kubernetes.io/os=linux
work2 Ready <none> 20d v1.20.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work2,kubernetes.io/os=linux
GPU label 확인
아직 할당되지 않은 것을 확인할 수 있음
$ kubectl get nodes -L gpu
NAME STATUS ROLES AGE VERSION GPU
master Ready control-plane,master 20d v1.20.1
work1 Ready <none> 20d v1.20.1
work2 Ready <none> 20d v1.20.1
work2 node 에 gpu label 을 할당하고 확인
$ kubectl label node work2 gpu=true
node/work2 labeled
$ kubectl get nodes -L gpu
NAME STATUS ROLES AGE VERSION GPU
master Ready control-plane,master 20d v1.20.1
work1 Ready <none> 20d v1.20.1
work2 Ready <none> 20d v1.20.1 true
pod 확인시 Panding 이였던 pod 가 Running 인 것을 확인할 수 있음
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
http-go-gpu 1/1 Running 0 8m13s
연습문제
- 노드 중 하나를 ssd용 레이블을 갖도록 설정하라
- ssd 레이블을 가진 노드에만 포드를 할당하는 디플로이먼트를 생성하라
- Image는 nginx를 사용한다
728x90
'개발강의정리 > DevOps' 카테고리의 다른 글
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 오토 스케일링 HPA (0) | 2021.01.19 |
---|---|
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 멀티플 스케줄러 (0) | 2021.01.19 |
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 스태틱 포드 (0) | 2021.01.19 |
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 데몬셋 (0) | 2021.01.19 |
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 시스템 리소스 요구사항과 제한 설정 (0) | 2021.01.19 |
댓글