[Kubernetes] Managing State With Deployments, Scheduling(1)
DevOps/Kubernetes

[Kubernetes] Managing State With Deployments, Scheduling(1)

목차

Kubernetes Managing State With Deployments, Scheduling(1)

- Scheduler

- Scheduling 프로세스

- Policy 정책

- Node Selector

- Node Selector 실습

- Node Affinity

- Node Affinity 실습

- Taint & Toleration

 


Managing State With Deployments, Scheduling

Scheculer

- 컨테이너를 적절한 노드에 스케줄링(배치) 하는 역할(전용 바이너리)

그림 출처 : https://banzaicloud.com/blog/k8s-custom-scheduler/

 

Scheduling 프로세스

스케줄러가 파드를 배치하는 주요 기준

1) 사전 조건 - 파드가 특정 노드에 적합한지 확인.

- ex) 파드에서 요청한 메모리 양을 노드가 감당할 수 있을지, 유저가 node selector로 지정한 경우 등

 

2) 우선순위 - 파드가 노드에서 실행할 수 있다고 가정 후, 상대적 가치를 판단 -

- ex) 이미지가 이미 존재하는 노드에 가중치를 부여 : 빠른 시작 가능, 동일한 Service 내 있는 파드라면 spreading 시켜놓음

 

※ 스케줄링은 한순간에만 최적이므로, 이후 충돌 등 여러 이유로 실행 중인 파드를 이동할 수 도 있음. 이 경우 해당 pod를 삭제하고 재 생성

 

 

Policy 정책

쿠버 네티스 스케줄링과 다르게 운용자가 직접 스케줄 하고 싶다면 주로 아래 3가지 방안을 활용

1) Node Selector

2) Node Affinity

3) Taint/Toleration

 

 

Node Selector

Node Selector

- 노드에도 파드에도 레이블을 부여하여 동일한 조건에 맞게 스케줄 되도록 설정 https://kubernetes.io/ko/docs/concepts/scheduling-eviction/assign-pod-node/

(1) 노드에 레이블 붙이기. (예) #kubectl label nodes kubernetes-foo-node-1.c.a-robinson.internal disktype=ssd

(2) 파드에 node selector 추가하기

  spec:

    containers:

    nodeSelector:

      disktype: ssd

 

Node Selector 실습

현재 노드 가져오기

kubectl get nodes

레이블 붙이는 명령어

(여기서는 disktype=ssd 레이블을 붙임)

kubectl label nodes limhs-worker-01.kr-central-1.c.internal disktype=ssd

 

레이블 확인

(여기서 disktype이 확인 가능하다)

kubectl describe node limhs-worker-01

 

다른 레이블도 가능하다

(kubectl label nodes limhs-worker-01.kr-central-1.c.internal disk_type=ssd)

 

그리고 확인

kubectl describe node limhs-worker-01

 

이제 위에서 설정해준 레이블을 잡고 노드를 선택하고 실행해보자

 

첫째로 nginx 기반 이미지로 dry run 하여 yml형태로 만들어 줍니다

kubectl run diskssd --image=nginx --dry-run=client -o yaml > diskssd.yaml(아래 사진은 오타이다)

 

여기서 cat으로 확인해보면 nodeSelector가 아직 설정되어있지 않은 것을 확인할 수 있다.

nodeSelector를 vi로 설정해보자

diskssd.yml -> diskssd.yaml

 

아래 이미지처럼 설정해준다.

 

 

설정 후 명령어를 통해 apply후 pod를 생성한다

 

 

Node Affinity

- Node Selector는 선택에 대한 요구사항을 이야기하는 사전 조건
- 복잡한 선택에는 Affinity가 유연. (ex) 레이블 foo이면 A 또는 B 노드를 선택해주세요.

 

 

- (ex) A, B 둘 다 가능하지만, A로 라벨링 된 노드를 더 선호합니다.

 

 

Node Affinity 실습

affinity 실습을 위해 위에서 작성한 yaml을 복사해서 새로 만듭니다

cp diskssd.yaml diskssd-affinity.yaml 

vi diskssd-affinity.yaml

 

아래와 같이 작성합니다

 

pod 생성

kubectl apply -f diskssd-affiinity.yaml

 

kubectl get pod

kubectl get pod -o wide 

 

pod 이름만 변경하고 다시 적용하면 새로운 파드가 생성된다

 

 

Taint & Toleration

Taint : 스케쥴러가 pod를 배치할 때 Taint (오염)되어 있는 node들은 배치하지 않도록 함

Toleration : Taint가 묻어 있어도 배치할 수 있도록 함

 


Reference

https://classlion.net/class/detail/21

 

도커/쿠버네티스 온라인 부트캠프 with 카카오엔터프라이즈

도커/쿠버네티스 온라인 부트캠프 with 카카오엔터프라이즈

www.classlion.net