[Kubernetes] 네임스페이스의 메모리 및 CPU 할당량 구성
네임스페이스에 일정 용량을 적용하여 그 안의 Pod 가 제한된 용량 안에서만 자원을 나누어 사용할 수 있도록 합니다.
본 매뉴얼은 아래 공식 문서를 참고하여 작성하였습니다.
https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/
1. 네임스페이스 생성
테스트를 위한 네임스페이스를 생성합니다.
# kubectl create namespace sysdocu-ns
2. 할당량 생성 및 적용
네임스페이스에 적용할 할당량을 설정합니다.
# vi rq.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: mem-cpu-limits spec: hard: requests.cpu: "1" requests.memory: 1Gi limits.cpu: "2" limits.memory: 2Gi |
작성한 할당량을 먼저 생성한 네임스페이스에 적용합니다.
# kubectl apply -f rq.yaml -n sysdocu-ns
resourcequota/mem-cpu-limits created
설정한 리소스 할당량과 사용량에 대한 정보를 볼 수 있습니다.
# kubectl get resourcequota mem-cpu-limits -n sysdocu-ns --output=yaml
apiVersion: v1
kind: ResourceQuota
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ResourceQuota","metadata":{"annotations":{},"name":"mem-cpu-limits","namespace":"sysdocu-ns"},"spec":{"hard":{"limits.cpu":"2","limits.memory":"2Gi","requests.cpu":"1","requests.memory":"1Gi"}}}
creationTimestamp: "2024-01-11T00:29:34Z"
name: mem-cpu-limits
namespace: sysdocu-ns
resourceVersion: "12801859"
uid: 98127c56-33bc-4ccc-a55c-1152b7f04128
spec:
hard:
limits.cpu: "2"
limits.memory: 2Gi
requests.cpu: "1"
requests.memory: 1Gi
status:
hard:
limits.cpu: "2"
limits.memory: 2Gi
requests.cpu: "1"
requests.memory: 1Gi
used:
limits.cpu: "0"
limits.memory: "0"
requests.cpu: "0"
requests.memory: "0"
위 예시의 리소스 할당량 (ResourceQuota : mem-cpu-limits) 이 설정된 네임스페이스에 다음과 같은 제약 사항이 있습니다.
- 네임스페이스의 모든 Pod 에 대해 각 컨테이너에는 메모리 요청, 메모리 제한, CPU 요청 및 CPU 제한이 있어야 합니다.
- 해당 네임스페이스에 있는 모든 Pod 에 대한 메모리 요청 합계는 1 GiB 를 초과해서는 안 됩니다.
- 해당 네임스페이스에 있는 모든 Pod 의 메모리 제한 합계는 2 GiB 를 초과해서는 안 됩니다.
- 해당 네임스페이스에 있는 모든 포드에 대한 CPU 요청 합계는 1 CPU 를 초과해서는 안 됩니다.
- 해당 네임스페이스에 있는 모든 포드의 CPU 제한 합계는 2 CPU 를 초과해서는 안 됩니다.
3. 첫번째 Pod 생성
테스트를 위해 간단한 Pod 를 생성합니다.
# vi pod1.yaml
apiVersion: v1 kind: Pod metadata: name: demo-pod1 spec: containers: - name: demo-pod1 image: nginx resources: limits: memory: "800Mi" cpu: "800m" requests: memory: "600Mi" cpu: "400m" |
# kubectl apply -f pod1.yaml -n sysdocu-ns
pod/demo-pod1 created
Pod 가 정상 실행되고 있는지 확인합니다.
# kubectl get pod demo-pod1 -n sysdocu-ns
NAME READY STATUS RESTARTS AGE
demo-pod1 1/1 Running 0 80s
설정한 리소스 할당량과 사용량에 대한 정보를 다시 확인합니다.
아래와 같이 사용량이 변경된 것을 확인할 수 있습니다.
# kubectl get resourcequota mem-cpu-limits -n sysdocu-ns --output=yaml
apiVersion: v1
kind: ResourceQuota
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ResourceQuota","metadata":{"annotations":{},"name":"mem-cpu-limits","namespace":"sysdocu-ns"},"spec":{"hard":{"limits.cpu":"2","limits.memory":"2Gi","requests.cpu":"1","requests.memory":"1Gi"}}}
creationTimestamp: "2024-01-11T00:29:34Z"
name: mem-cpu-limits
namespace: sysdocu-ns
resourceVersion: "12805135"
uid: 98127c56-33bc-4ccc-a55c-1152b7f04128
spec:
hard:
limits.cpu: "2"
limits.memory: 2Gi
requests.cpu: "1"
requests.memory: 1Gi
status:
hard:
limits.cpu: "2"
limits.memory: 2Gi
requests.cpu: "1"
requests.memory: 1Gi
used:
limits.cpu: 800m
limits.memory: 800Mi
requests.cpu: 400m
requests.memory: 600Mi
jq 명령어 사용이 가능한 시스템에서는 아래와 같이 필요한 항목만 출력시킬 수 있습니다.
# kubectl get resourcequota mem-cpu-limits -n sysdocu-ns -o jsonpath='{ .status.used }' | jq .
{
"limits.cpu": "800m",
"limits.memory": "800Mi",
"requests.cpu": "400m",
"requests.memory": "600Mi"
}
4. 두번째 Pod 생성
테스트를 위해 두번째 Pod 를 생성합니다.
# vi pod2.yaml
apiVersion: v1 kind: Pod metadata: name: demo-pod2 spec: containers: - name: demo-pod2 image: redis resources: limits: memory: "1Gi" cpu: "800m" requests: memory: "700Mi" cpu: "400m" |
# kubectl apply -f pod2.yaml -n sysdocu-ns
Error from server (Forbidden): error when creating "pod2.yaml": pods "demo-pod2" is forbidden: exceeded quota: mem-cpu-limits, requested: requests.memory=700Mi, used: requests.memory=600Mi, limited: requests.memory=1Gi
네임스페이스 내에서 사용 가능한 요청 메모리가 1Gi 인데, Pod1 의 메모리 600MiB 에 Pod2 의 메모리 700MiB 를 추가하려니까 에러가 발생했습니다.
600MiB + 700MiB > 1 GiB.
이렇게 ResourceQuota 을 이용해 네임스페이스에 리소스 할당량을 사용하여 제한하는 방법을 알아보았습니다.
'리눅스 > Containers & Kubernetes' 카테고리의 다른 글
Ubuntu 22.04 단일 서버에서 K0S 설치하기 (0) | 2024.02.22 |
---|---|
[Kubernetes] metrics-server 설치하기 (error: Metrics API not available 조치) (0) | 2024.01.11 |
Kubernetes Pod 의 CPU 요청 및 제한값 변경하기 (Vertical Pod Autoscaler) (0) | 2023.12.29 |
[Kubernetes] 지워지지않는 Terminating 네임스페이스 삭제하기 (0) | 2023.10.31 |
개인 도커 레지스트리 (Docker Registry) 구축하기 (0) | 2023.09.05 |