안녕하세요, 오늘은 베스핀글로벌 DevOps실 구연수 님이 작성해 주신 ‘Pod의 사양 설정하기_Resource Requirement And Limit’에 대해 알아보겠습니다.
Resource Requirement And Limit
kube-scheduler는 pod를 어느 노드에 위치 시킬지 결정한다.
고려 사항은 Pod에 의해 요구되는 리소스 양과 그 양을 감당할 수 있는 Node 이며, Pod를 위치 시키기 위해 가장 적합한 Node를 식별하는 역할을 한다.
apiVersion: v1
kind: Pod
metadata:
name:
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 8080
resources:
requests: # 요구되는 리소스 양
memory: "4Gi"
cpu: 2
- 기본적으로 Node 내부에서 컨테이너는 소비 가능한 리소스 양에 제한이 없다.
- Pod 내 컨테이너는 CPU와 함께 실행 시작하며 요구하면 할수록 더 많은 리소스를 소비할 수 있다.
Resource Limit
- Pod 내 리소스 사용량을 제한할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name:
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 8080
resources:
requests:
memory: "1Gi"
cpu: 1
limit: # 리소스 사용 제한
memory: "2Gi"
cpu: 2
Exceed Limits
- 다수 컨테이너가 Pod에 있다면 request와 limit은 각각 컨테이너에 개별적으로 할당된다.
- 리소스 사용량을 초과한다면?
- CPU 사용량 : CPU 같은 경우, 리소스 제한보다 초과로 사용할 수 없다!
- memory 사용량 : memory는 제한보다 더 많이 사용할 수 있다. 계속해서 초과를 한다면 해당 pod는 중지되고, OOM(Out Of Memory) 에러 발생
- 리소스 사용량을 초과한다면?
Limit Range
- Kubernetes는 기본적으로 파드마다 리소스 양을 요구하거나 제한하지 않는다.
- Kubernetes 내부에 기본 설정이 필요하다면? -> limit range 사용
- Limit Range
- pod 내부 컨테이너들이 기본 제한값을 가질 수 있도록 돕는다.
- Limit Range
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-resource-constraint
spec:
limits:
- default: # limit
cpu: 500m
defaultRequest: # request
cpu: 500m
max: # limit
cpu: "1"
min: # request
cpu: 100m
type: Container
- pod 설정 파일에 개별적으로 정의할 필요가 없으며, namespace 레벨에서 적용된다.
- 제한 정보는 기존에 존재하던 pod들에는 적용되지 않으며, 앞으로 새로 생성되는 pod에만 적용된다.
Resource Quotas
- Kubernetes 내에 배포된 모든 애플리케이션들이 소모할 수 있는 전체 리소스양 제한
- namespace 레벨에서 적용
apiVersion: v1
kind: ResourceQuota
metadata:
name: my-resource-quota
spec:
hard:
requests.cpu: 4
requests.memory: 4Gi
limits.cpu: 10
limits.memory: 10Gi
감사합니다 🙂
Written by 구 연수 / Yeonsoo koo
Software Engineer