여러 사용자나 팀이 정해진 수의 노드로 클러스터를 공유할 때 한 팀이 공정하게 분배된 리소스보다 많은 리소스를 사용할 수 있다는 우려가 있다. 이러한 문제를 해결하기 위한 도구로 리소스 쿼터가 있다.
ResourceQuota 오브젝트로 정의된 리소스쿼터는 네임스페이스별 총 리소스 사용을 제한하는 제약 조건을 제공한다. 유형별로 네임스페이스에서 만들 수 있는 오브젝트 수와 해당 네임스페이스의 리소스가 사용할 수 있는 총 컴퓨트 리소스의 양을 제한할 수 있다.
limits.cpu 터미널이 아닌 상태의 모든 파드에서 CPU 제한의 합은 이 값을 초과할 수 없음.
limits.memory 터미널이 아닌 상태의 모든 파드에서 메모리 제한의 합은 이 값을 초과할 수 없음.
requests.cpu 터미널이 아닌 상태의 모든 파드에서 CPU 요청의 합은 이 값을 초과할 수 없음.
requests.memory 터미널이 아닌 상태의 모든 파드에서 메모리 요청의 합은 이 값을 초과할 수 없음.
hugepages-<size> 터미널 상태가 아닌 모든 파드에 걸쳐서, 지정된 사이즈의 휴즈 페이지 요청은 이 값을 초과하지 못함.
cpu requests.cpu 와 같음.
memory requests.memory 와 같음.
apiVersion: v1
kind: ResourceQuota
metadata:
name: rq
spec:
hard:
pods: 10 # 해당 네임스페이스에서 최대 파드 10개로 제한
services: 5 # 서비스 최대 5개로 제한
services.loadbalancers: 1 # 로드밸런서 최대 1개로 제한
services.nodeports: 2 # 노드 포트 최대 2개로 제한
configmaps: 5 # 컨피그맵 최대 5개로 제한
secrets: 5 # 시크릿 최대 5개로 제한
이를 테스트하기 위해서 간단한 rs를 만들어 scale up을 시켜보자
$ cat rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs1
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
resources:
limits:
cpu: 100m
$ kubectl create -f quota.yaml -f rs.yaml
# 파드 제한 최대 10개
$ kubectl scale rs rs1 --replicas=15
보는 것처럼 파드를 15개로 증가시키는 명령어를 입력하였으나 파드의 개수가 10개인 것을 볼 수 있다.
이런 식으로 Resource Quota를 간단하게 쓰는 법을 알아보았다.