Pod 리소스 요구사항과 스케줄링
쿠버네티스의 각 노드는 제한된 CPU와 메모리 리소스를 가집니다. Pod를 생성할 때, 이 Pod가 필요로 하는 리소스 양을 지정할 수 있으며, 쿠버네티스 스케줄러는 이 정보를 활용해 Pod를 적절한 노드에 배치합니다.
리소스 요구사항 정의
Pod 정의 파일에서 resources
섹션을 통해 CPU와 메모리 요구사항을 지정할 수 있습니다.
리소스 요청 (Requests
)
리소스 요청은 Pod가 시작할 때 최소한으로 필요한 리소스 양을 나타냅니다.
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
labels:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
resources:
requests:
memory: "1Gi"
cpu: "1"
리소스 제한 (Limits
)
리소스 제한은 Pod가 사용할 수 있는 최대 리소스 양을 지정합니다.
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
labels:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
resources:
requests:
memory: "1Gi"
cpu: "1"
limits:
memory: "2Gi"
cpu: "2"
limit가 넘어가면
리소스의 시나리오
리소스 요청과 제한이 없는 경우
Pod 정의에 리소스 요청(requests)과 리소스 제한(limits)이 명시적으로 설정되지 않은 경우, 해당 Pod는 무제한 리소스를 사용할 수 있게 됩니다. 이는 Pod가 필요로 하는 만큼의 CPU와 메모리를 사용할 수 있다는 것을 의미하지만, 이는 다른 Pod의 성능에 영향을 줄 수 있으므로 권장되지 않습니다.
리미트 레인지 (LimitRange)
리미트 레인지는 네임스페이스에서 Pod 또는 컨테이너가 생성될 때 적용될 기본 리소스 요청과 제한을 정의할 수 있게 해줍니다.
리미트 레인지 예시
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-resource-constraint
spec:
limits:
- default:
cpu: 500m
memory: 256Mi
defaultRequest:
cpu: 500m
memory: 256Mi
max:
cpu: "1"
min:
cpu: 100m
type: Container
이 정의는 컨테이너가 지정하지 않은 경우 CPU 500m 및 메모리 256Mi를 기본 요청과 제한으로 설정합니다.
리소스 쿼터 (Resource Quota)
리소스 쿼터를 사용하면 네임스페이스 수준에서 리소스 사용량에 대한 상한선을 설정할 수 있습니다. 이를 통해 네임스페이스 내의 모든 Pod가 소비할 수 있는 총 리소스 양을 제한할 수 있습니다.
리소스 쿼터 예시
apiVersion: v1
kind: ResourceQuota
metadata:
name: cpu-and-memory-quota
spec:
hard:
requests.cpu: 4
requests.memory: 4Gi
limits.cpu: 10
limits.memory: 10Gi
이 리소스 쿼터는 네임스페이스 내에서 요청된 총 CPU를 4개로, 요청된 총 메모리를 4Gi로 제한합니다. 또한, 컨테이너의 CPU 및 메모리 사용량 상한선을 각각 10개와 10Gi로 설정합니다.
스케줄러의 역할
쿠버네티스 스케줄러는 Pod의 리소스 요구량과 노드의 사용 가능 리소스를 비교하여 최적의 노드를 선택합니다. 모든 노드가 요구사항을 충족하지 못하면, Pod는 대기 상태에 머무릅니다.
리소스 제한의 중요성
적절한 리소스 요청과 제한 설정은 클러스터의 건강한 운영을 위해 중요합니다. 리소스 제한 없이 Pod가 과도한 리소스를 소비하면 다른 Pod의 성능에 영향을 줄 수 있습니다.
리미트 레인지와 리소스 쿼터
- LimitRange: 네임스페이스별로 Pod의 리소스 요청과 제한에 대한 기본값 및 최소/최대값을 설정합니다.
- ResourceQuota: 네임스페이스에서 사용할 수 있는 리소스의 총량에 대한 상한선을 정의합니다.
K8s Reference Docs:
https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/