728x90
반응형
출처
Cloud Native DevOps with Kubernetes / 쿠버네티스를 활용한 클라우드 네이티브 데브옵스
Certified Kubernetes Administrator (CKA) with Practice Tests(Udemy)
Manual Scheduling
What is k8s Scheduler?
클러스터 내에서 리소스를 최적화하고 Pod의 요구 사항을 충족시키는 적절한 노드를 선택한다.
How scheduling Works
- 스케쥴러는 모든 Pod를 살펴보고 nodeName Property가 없는 Pod를 식별한다.
- 스케쥴러는 적합한 노드를 선택한 뒤, 해당 Pod가 그 노드에 스케줄링되도록 설정해준다.
- Pod의 스케줄링 요구 사항과 제약 조건(리소스 요청, 노드 라벨, 노드 셀렉터)을 분석하여 스케줄링한다.
Manuel Scheduling의 장점
스케쥴러 무시 | nodeName 필드를 사용하면 k8s 스케쥴러는 해당 Pod의 스케쥴링을 건너뛰고, 사용자가 지정한 노드에서 실행한다. |
---|---|
제약조건 미적용 | k8s 스케쥴러가 실행되지 않으므로, 리소스 요구사항이나 제약조건을 확인하지 않는다. |
단순성 | 설정이 간단하며, 테스트 또는 디버깅 목적에 적합하다. |
Manuel Scheduling의 단점
운영환경에 부적합 | 클러스터의 리소스 사용률 최적화를 보장하지 못한다. 자동 복구 기능이 지원되지 않는다. |
---|---|
휴먼에러 | 사용자가 노드의 상태를 잘못 판단하여 리소스 부족 등의 문제를 초래할 수 있다. |
관리 오버헤드 | 모든 Pod에 대해 수동으로 노드를 지정해야 하므로 대규모 클러스터 관리에 부적합하다. |
How to use Manual Scheduling
- Pod를 생성할 때, Pod Yaml에서 nodeName 필드를 지정하여 Pod가 특정 노드에서 실행되도록 설정해준다.
Manual Scheduling은 Pod가 생성될 때만 동작한다. - Pod Binding으로 Pod가 선택된 노드에서 실제로 실행되도록 설정해준다.
이미 생성된 Pod를 스케쥴링하기 위해 Binding객체를 만들어 Pod와 노드를 매칭시킨다.
#k8s 스케쥴러가 작동하고 있는지 확인
#Manual Scheduling 테스트를 위해 kube-scheduler가 없는 것을 확인
[root@]$ kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-77d6fd4654-nhmzc 1/1 Running 0 6m17s
coredns-77d6fd4654-wx2kf 1/1 Running 0 6m17s
etcd-controlplane 1/1 Running 0 6m22s
kube-apiserver-controlplane 1/1 Running 0 6m22s
kube-controller-manager-controlplane 1/1 Running 0 6m22s
kube-proxy-gkp7m 1/1 Running 0 6m17s
kube-proxy-s6t65 1/1 Running 0 5m58s
#Pod를 실행시켰으나 Node가 없어 Pending 상태인 것을 확인
[root@]$ kubectl run nginx --image=nginx:alpine
pod/nginx created
[root@]$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx 0/1 Pending 0 14s
[root@]$ kubectl describe po nginx
Name: nginx
Namespace: default
Priority: 0
Service Account: default
Node: <none>
Labels: <none>
Annotations: <none>
Status: Pending
IP:
IPs: <none>
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-w68gs (ro)
Volumes:
kube-api-access-w68gs:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events: <none>
#Pod를 삭제 후 새로 생성해야함
[root@]$ kubectl delete po nginx
pod "nginx" deleted
#yaml파일에 nodeName을 직접 추가
[root@]$ vi nginx.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
name: nginx
nodeName: node01 #nodeName 추가
#Pod를 새로 생성
[root@]$ kubectl apply -f nginx.yaml
pod/nginx created
#Pod 상태 확인
[root@]$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 8s
#yaml파일 수정
[root@]$ vi nginx.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
name: nginx
nodeName: node01 #nodeName 추가
#Pod를 삭제하지 않고 replace를 사용해 수정된 내용을 반영
[root@]$ kubectl replace --force -f nginx.yaml
pod "nginx" deleted
pod/nginx replaced
#Pod상태 확인
[root@]$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 20s
728x90
반응형
'클라우드 > 쿠버네티스' 카테고리의 다른 글
[쿠버네티스] 자원 기반 접근법, 명령 기반 접근법 (0) | 2024.11.24 |
---|---|
[쿠버네티스] 네임스페이스 (0) | 2024.11.10 |
[쿠버네티스] 서비스 (0) | 2024.11.09 |
[쿠버네티스] ReplicaSet (0) | 2024.10.27 |
[쿠버네티스] ETCD (0) | 2024.09.21 |
댓글