개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 수동 스케줄링

nineDeveloper 2021. 1. 19.
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

댓글

💲 추천 글