CPU/메모리 리소스 제한
- CPU는 클럭 수로 지정하지 않고 1vCPU(가상 CPU)를 1,000m(millicores) 단위로 지정한다.
- 메모리의 경우 : 1G = 1000M (1Gi = 1024Mi)
- 리소스 제한은 파드 정의 내부의 각 컨테이너 정의 부분에 포함되고
spec.containers[].resources
의 requests.cpu/requests.memory
또는 limits.cpu/limits.memory
로 지정한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-resource
spec:
replicas: 3
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: nginx-container
image: nginx:1.16
resources:
requests:
memory: "1024Mi"
cpu: "500m"
limits:
memory: "2048Mi"
cpu: "1000m"
- Requests : 사용하는 리소스 최솟값
- 지정한 양의 리소스가 존재하지 않으면 스케줄링되지 않는다.
- Limits : 사용할 리소스의 최댓값
- Requests와 달리 노드에 Limits로 지정한 리소스가 남아 있지 않아도 스케줄링된다.
- Requests와 Limits의 차이가 아주 큰 컨테이너에서 부하가 상승하면 실제로 사용하려는 리소스 양과 차이가 발생할 수 있다.
- Requests만 설정한 경우 : Limits는 자동으로 설정되지 않고 호스트 측의 부하가 최대로 상승할 때까지 리소스를 계속 소비한다.
- 파드가 많이 기동하는 노드에서 리소스 뺐기가 발생하고, 메모리의 경우 OOM(Out of Memory)으로 인해 프로세스 정지가 된다.
- Limits만 설정한 경우 : Limits와 같은 값이 Requests에 설정된다.
Ephemeral 스토리지 리소스 제어
- Ephemeral(임시) 스토리지란 파드가 재시작되었을 때 파드 내에서 저장된 데이터가 삭제되어도 상관없는 데이터를 저장할 때 사용하는 볼륨이다.
- 캐시서비스에서 캐시 메모리가 꽉 찰 경우 자주 사용하지 않는 데이터를 임시 볼륨에 저장하는 경우에 사용할 수 있다.
- 설정 등 여러 파드에서 사용하는 읽기 전용의 데이터를 불러와야 할 때 임시 볼륨을 사용한다.
- 쿠버네티스 노드에서 기동 중인 시스템 구성 요소의 kubelet이 디스크 사용 현황을 정기적으로 모니터링하고 초과한 경우 파드는 축출(Evict) 된다.
- Ephemeral 스토리지 용량은 세 가지로 구해진다.
- 컨테이너가 출력하는 로그
- emptyDir에 기록된 데이터(
medium: memory
가 아닌 것)
- 컨테이너의 쓰기 가능한 레이어에 기록된 데이터
- 컨테이너에서 쓰기로 소비되는 양은 emptyDir에 기록된 데이터와 컨테이너의 쓰기 가능한 레이어에 기록된 데이터의 합계이다.
- 쓰기 가능한 레이어의 데이터양은 간단히 말해
영구 볼륨
/hostPath
/nfs
등이 마운트된 영역을 제외한 모든 영역이라고 보면된다.
- ephemeral-storage 사용 제한을 하지 않으면 예상치 못한 데이터 쓰기로 인해 쿠버네티스 노드의 디스크 용량을 초과하여 그 노드의 모든 파드에 영향을 줄 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: sample-ephemeral-storage
spec:
containers:
- name: nginx-container
image: nginx:1.16
resources: # ephemeral-storage 설정
requests:
ephemeral-storage: "1024Mi"
limits:
ephemeral-storage: "2048Mi"
- emptyDir은 파드에서 공유하고 사용할 수 있기 때문에 여러 파드에 설정된 Limits의 합계를 초과한 경우 Evict 된다.