목표
k8s에서 Container의 Resource를 제어 하는 방법을 알아 보겠습니다.
Resource 제어 대상은 Pod가 아니라 container 입니다
Resource
용도
각 container 사용할 수 있는 CPU와 메모리 양을 정의하는 것입니다.
기본적으로 Resource 제한을 주지 않으면 Pod는 노드의 가용 Resource를 최대한 사용할 수 있지만, 이는 시스템의 안정성에 부정적인 영향을 미칠 수 있으므로 가능한 Resource 요청(Request)과 제한(Limits)을 명확히 설정하는 것이 권장됩니다.
제어 항목
CPU
Memory
제어 방법
resources -> requests
container가 실행될 때 필요한 최소한의 resources를 지정 합니다.
requests를 충족하는 node가 없으면 Pod가 배포 되지 않습니다.
resources -> limits
container가 사용할 수 있는 CPU와 Memory의 최대 한도를 지정합니다.
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
초과 사용시
CPU초과 시
system이 cpu 사용을 제한 합니다.
Memory 초과시
Container 에서 OOM 발생
- Memory Limit을 초과: 파드 내의 특정 Container가 설정된 Memory Limit를 초과하게 되면, 해당 Container만 종료됩니다. Kubernetes는 이를 "OOMKilled" 상태로 표시하며, container는 재시작 정책에 따라 재시작될 수 있습니다.
- kubectl describe pod test 로 확인시 Last State에서 확인 가능
- Pod 내 Container만 영향을 받음: 이 경우에는 Pod 전체가 종료되지 않고, Memory Limit를 초과한 특정 Container만 영향을 받습니다.
Node 전체 OOM 발생
- Node의 가용 Memory가 부족: Node 전체의 가용 memory가 부족하여 Node 수준에서 OOM이 발생하면, Linux 커널의 OOM Killer가 실행됩니다. 이때, Kubernetes는 개입하지 않으며, 커널은 종료할 프로세스를 선택합니다.
- QoS 클래스에 따라 결정: Kubernetes는 파드의 QoS 클래스(Quality of Service)에 따라 어떤 Pod가 종료될지를 결정하는 데 도움을 줍니다.
- BestEffort: 리소스 요청 및 제한이 지정되지 않은 파드가 우선적으로 종료됩니다.
- Burstable: 요청된 리소스보다 더 많은 리소스를 사용하는 파드가 그다음 우선순위입니다.
- Guaranteed: 리소스 요청과 제한이 동일하게 설정된 파드는 가장 마지막에 종료됩니다.
LimitRange
용도
LimitRange는 특정 namespace대상으로 개별 Pod나 Container Resource 대상으로 사용량을 제한하고 설정합니다.
이를 통해 특정 namespace 내의 파드(Pod), 컨테이너(Container), 및 기타 Resource가 사용할 수 있는 CPU, Memory, storage 등의 Resource를 제한합니다.
사용법
LimitRange 를 사용하려면, YAML 파일을 통해 정의한 후 이를 해당 namespace에 적용하면 됩니다.
YAML 형식
apiVersion: v1
kind: LimitRange
metadata:
name: limits
namespace: my-namespace # 적용대상 namespace
spec:
limits:
- max:
cpu: "2" # 컨테이너가 사용할 수 있는 최대 CPU 리소스
memory: "1Gi" # 컨테이너가 사용할 수 있는 최대 메모리 리소스
min:
cpu: "100m" # 컨테이너가 사용할 수 있는 최소 CPU 리소스
memory: "128Mi" # 컨테이너가 사용할 수 있는 최소 메모리 리소스
default:
cpu: "500m" # 명시적으로 설정되지 않은 경우 적용되는 기본 CPU 리소스
memory: "256Mi" # 명시적으로 설정되지 않은 경우 적용되는 기본 메모리 리소스
defaultRequest:
cpu: "200m" # 명시적으로 설정되지 않은 경우 기본적으로 요청하는 CPU 리소스
memory: "200Mi" # 명시적으로 설정되지 않은 경우 기본적으로 요청하는 메모리 리소스
type: Container # 이 LimitRange가 적용되는 대상 (Container)
상세
https://doitnow-man.tistory.com/entry/CKA-9-Namespace-resource-%EC%A0%9C%EC%96%B4-%EB%B0%A9%EB%B2%95
ResourceQuotas
용도
Resource Quotas는 Kubernetes에서 특정 namespace대상으로 전체 Resource 사용량을 제한합니다.
이를 통해 특정 namespace 내에서 사용할 수 있는 CPU, Memory, 스토리지, 파드(Pod) 수, 서비스(Service) 수, 영구 볼륨(Persistent Volume) 등 다양한 리소스의 총량을 제한합니다.
사용법
Resource Quotas 를 사용하려면, YAML 파일을 통해 정의한 후 이를 해당 namespace에 적용하면 됩니다.
YAML 형식
apiVersion: v1
kind: ResourceQuota
metadata:
name: my-quota
namespace: my-namespace # 적용 대상 namespace
spec:
hard: # hard: 네임스페이스에서 허용되는 리소스의 최대 사용량을 정의합니다.
pods: "10" # 최대 10개의 파드만 생성 가능
requests.cpu: "4" # 전체 CPU 요청의 총량이 4코어를 넘지 않음
requests.memory: "8Gi" # 전체 메모리 요청의 총량이 8Gi를 넘지 않음
limits.cpu: "8" # 전체 CPU 제한의 총량이 8코어를 넘지 않음
limits.memory: "16Gi" # 전체 메모리 제한의 총량이 16Gi를 넘지 않음
persistentvolumeclaims: "5" # 최대 5개의 PVC만 생성 가능
services: "10" # 최대 10개의 서비스를 생성 가능
configmaps: "20" # 최대 20개의 ConfigMap 생성 가능
secrets: "20" # 최대 20개의 Secret 생성 가능
replicationcontrollers: "5" # 최대 5개의 ReplicationController 생성 가능
resourcequotas: "1" # 최대 1개의 ResourceQuota 생성 가능
LimitRange와 Resource Quotas 비교
LimitRange는 개별 Pod나 Container의 Resource 요청과 제한을 관리하고
Resource Quotas는 namespace 전체의 Resource 사용량을 관리합니다.
그래서 Resource Quotas를 사용할 때는 LimitRange와 함께 사용하는 것이 좋습니다.
정리
Pod나 container의 Resource 사용량을 제한 하기 위해서 3가지의 방법이 존재합니다.
1. Resource
각 contaienr 사용할 수 있는 CPU와 메모리 양을 정의하는 것입니다.
2. LimitRange
특정 namespace대상으로 개별 Pod나 Container Resource 대상으로 사용량을 제한하고 설정합니다.
3. ResourceQuotas
특정 namespace대상으로 전체 Resource 사용량을 제한합니다.
'Cloud > k8s-CKAD' 카테고리의 다른 글
[CKAD] Multi-Container Pod and InitContainer (1) | 2024.08.25 |
---|---|
[CKAD] 시험 미흡 사항 (0) | 2024.08.21 |
[CKAD] Service Account (0) | 2024.07.16 |
[CKAD] Security Context (0) | 2024.04.23 |
[CKAD] 환경 변수 Configmap 과 Secret 사용하기 (0) | 2024.01.30 |