
마스터 노드의 리소스 구성은
CPU - 4.0 Core/RAM - 8GB/Storage - 256GB입니다. 여기서 실제 마스터 노드 운영에 필요한 리소스를 제외하면 놀고 있는 리소스가 상당할 것으로 예상이 됩니다. 그래서 더 많은 리소스를 멀티 테넌트에 사용하고자 합니다.
CPU: 1.0 CoreMemory: 2.0Gi ~ 2.5GiEphemeral Storage: 5Gi 이상일반적으로 마스터 노드는 최소 사양 2코어 이상을 권장하지만,, 리소스 제약(홈랩)을 고려하여 1.0 Core 를 물리적으로 예약(Reserved) 하는 방식을 채택했습니다!
Taint가 붙어 있기 때문에 일반 파드가 배포되지 않는다.# 마스터 노드의 NoSchedule 설정 제거 (명령어 끝의 '-'가 제거를 의미합니다)
kubectl taint nodes master node-role.kubernetes.io/control-plane:NoSchedule-

⚠️ 주의사항:
NoSchedule-을 사용하여 마스터 노드를 개방했습니다. 나중에 테넌트 파드가 배포될 때, 테넌트 파드가 CPU 스케줄링을 두고 경쟁을 하게 되고 이때 마스터 노드의 작업에 영향을 끼칠 수도 있습니다.
이에 대한 명시적 조치로PriorityClass와NodeAffinity라는 설정이 있습니다.
📌 PriorityClass & NodeAffinity
PriorityClass== “누구를 먼저 내보낼 것인가?”쿠버네티스 노드에 자원이 부족해지면 커널은 어떤 파드를 죽여서 노드를 살릴 것인지 결정을 합니다. 이때
PriorityClass는 파드에게 붙여주는 계급장 역할을 합니다.
- 파드마다 숫자(value)를 부여하고, 숫자가 높은 파드일수록 제거 후순위가 됩니다.
- 마스터 노드에서의 활용
- 시스템 파드 (apiserver, etcd 등): 매우 높은 점수 (기본값으로 이미 높음)
- 테넌트 파드: 낮은 점수
- 기대 효과
- 마스터 노드의 메모리가 꽉 차면, 쿠버네티스는 점수가 낮은 테넌트 파드를 먼저 kill 시켜서 마스터 노드의 생존을 최우선으로 보장한다
NodeAffinity== “어디에 위치하게 할 것인가?”
- 파드가 배포될 때 라벨에 따라 선호/비선호를 지정하는 기능
- 마스터 노드에서의 활용
- 테넌트 파드들에게 약한 거부감(Preferred Scheduling)을 부여
- 워커 노드에 공간이 있다면 워커 노드로 먼저 가고, 워커 노드가 꽉 찼을 때만 마스터 노드의 남는 자리를 쓰도록 유도
kubectl get priorityclasses
or
kubectl get pc

priorityclass 만 값이 20억점대로 지정이 되어 있음을 확인할 수 있습니다.priorityclass 를 따로 지정하지 않았기 때문에 0점(Default)으로 작동 중입니다.kubectl get pods -A -o custom-columns="NAMESPACE:.metadata.namespace,NAME:.metadata.name,PRIORITY-CLASS:.spec.priorityClassName,VALUE:.spec.priority"

Kubelet 설정 파일을 수정하여 관리자 전용 자원을 강제로 묶음sudo nano /var/lib/kubelet/config.yaml
kubeReserved (쿠버네티스 관리용) / systemReserved (OS 구동용)kubelet/config.yaml 하단에 설정 추가# 마스터 노드 보호를 위한 리소스 예약 설정
systemReserved:
cpu: "300m"
memory: "500Mi"
kubeReserved:
cpu: "700m" # 시스템과 합쳐서 총 1.0 Core 예약
memory: "2000Mi" # 시스템과 합쳐서 총 2.5Gi 예약
enforceNodeAllocatable: ["pods"]
evictionHard:
memory.available: "500Mi" # 여유 메모리 500Mi 미만 시 테넌트 파드 자동 퇴거
nodefs.available: "10%" # 디스크 여유 10% 미만 시 경고 및 제한
systemReservedkubeReservedenforceNodeAllocatable[”pods”] 로 설정하며, 스케줄러는 이 계산된 값을 보고 파드를 배치함evictionHardsudo systemctl restart kubelet
kubectl describe node master | grep -A 5 "Allocatable:"

설정이 완료된 후
Allocatable수치를 확인해 보면, 마스터 노드 예약 자원을 제외한“실제 가용 범위"를 확인할 수 있습니다.
cpu: 3
- 4코어 중 시스템용으로 1코어를 예약했기 때문에
cpu - 3가 출력ephemeral-storage: 22536xxxxx
- 256GB 스토리지 중 시스템 영역을 제외하고 파드들이 사용 가능한 저장 공간
memory: 581xxxxxKi
- 전체 RAM 8GB 중, systemReserved + kubeReserved 로 설정한 2.5Gi 와 evictionHard 로 설정한 500Mi 등으로 제외한 수치
pods: 110
- 해당 노드에 최대로 올릴 수 있는 파드의 개수 (쿠버네티스 기본값 == 110)
→ 마스터 노드 예약 리소스 설정 완료!😋