목차
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
- 컨테이너를 적절한 노드에 스케줄링(배치) 하는 역할(전용 바이너리)
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로 설정해보자
아래 이미지처럼 설정해준다.
설정 후 명령어를 통해 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
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Managing State With Deployments, Scheduling(2) (0) | 2021.11.17 |
---|---|
[Kubernetes] APIs and Access(3)[RBAC(Role Based Access Control)] (0) | 2021.10.27 |
[Kubernetes] APIs and Access(2) (0) | 2021.10.26 |
[Kubernetes] APIs and Access(1) (0) | 2021.10.25 |
[Kubernetes] Kubernetes Architecture(4)[쿠버네티스 리소스 : 컨트롤러 오브젝트, 로드밸런서 오브젝트, 스토리지 오브젝트] (0) | 2021.10.23 |