시스템의 자원량의 사용을 제한하는 방법인 리소스 쿼터와 리밋 레인지에 대해서 알아보자.
리소스 쿼터는 네임스페이스 단위로 시스템의 총 자원량을 제한할 수 있는 방법이다.
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota-dev1
namespace: dev1
spec:
hard:
pods: 10
managed-nfs-storage.storageclass.storage.k8s.io/persistentvolumeclaims: "2"
managed-nfs-storage.storageclass.storage.k8s.io/requests.storage: "2Gi"
#persistentvolumeclaims: "2"
#requests.storage: "2Gi"
dev1 네임스페이스에 대해서 pods
는 10개, persistentvolumeclaims
는 2개, storage
는 2Gi로 제한하였다.
# dev1 네임스페이스의 리소스 쿼터 확인
k get resourcequotas -n dev1
dev1 네임스페이스에 3Gi 스토리지를 가지는 PV를 할당하려고 테스트 해보자.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: quota-3g-pvc-failure
namespace: dev1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 3Gi
storageClassName: managed-nfs-storage
2Gi 까지 스토리지가 제한되어 실패했다는 메세지가 출력되는 것을 확인할 수 있다.
dev1 네임스페이스에 1Gi 스토리지를 가지는 PV를 할당하도록 해보자.
이를 총 3번 반복하면 어떻게 될까?
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: quota-1g-pvc1 # 총 3번 배포
namespace: dev1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: managed-nfs-storage
최대 2Gi로 제한되어 있으므로 3번째(3Gi)를 할당할 때 실패하는 것을 확인할 수 있다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: quota-pod11-failure
namespace: dev1
spec:
replicas: 20
selector:
matchLabels:
app: quota-pod11-failure
template:
metadata:
labels:
app: quota-pod11-failure
spec:
containers:
- name: nginx
image: nginx
dev1 네임스페이스에 파드를 총 20개를 요청했지만 리소스 쿼터의 pod 정책에 의해서 최대 10개가 생성된 것을 확인할 수 있다.
# 컨트롤러 매니저의 로그를 통해서 확인
k logs -n kube-system kube-controller-manager-m-k8s | tail
# replicasets의 describe에서도 확인 가능
k describe -n dev1 replicasets.apps
이러한 파드를 생성하고 삭제를 담당하는 것은 kube-controller-manager에서 관리되는 replication controller 가 수행하므로 컨트롤러 매니저의 로그에서 실패 메세지를 확인할 수 있다.
리밋 레인지는 네임스페이스 내의 각 개별 파드나 컨테이너가 사용할 수 있는 최소 및 최대 자원의 범위를 설정할 수 있는 방법이다.
바로 실습을 통해 확인해 보자.
LimitRange 코드를 살펴보자.
PVC
의 최대 크기를 2Gi로 설정하고 최소 크기를 1Gi로, Container
의 default(최대 값)을 512Mi로 defaultRequest(기본 값)을 256Mi로 설정하였다.
apiVersion: v1
kind: LimitRange
metadata:
name: limits-dev2
namespace: dev2
spec:
limits:
- type: PersistentVolumeClaim
max:
storage: 2Gi
min:
storage: 1Gi
- type: Container
default:
memory: 512Mi
defaultRequest:
memory: 256Mi
6개의 파드를 dev2
네임스페이스를 가지고 모두 3번노드에 배포하면 어떻게 될까?
apiVersion: apps/v1
kind: Deployment
metadata:
name: limits-defaultrequest
namespace: dev2
spec:
replicas: 6 # will be out of memory
selector:
matchLabels:
app: limits-defaultrequest
template:
metadata:
labels:
app: limits-defaultrequest
spec:
containers:
- name: chk-log
image: sysnet4admin/chk-log
volumeMounts:
- name: pvc-vol
mountPath: /audit
volumes:
- name: pvc-vol
persistentVolumeClaim:
claimName: limits-1g-pvc
nodeName: w3-k8s # 모두 3번 노드에 배포
defaultRequest(기본 값)을 256Mi으로 설정하였고, 현재 워커노드(VM)에 할당된 메모리는 1.5Gi이므로 6개의 파드를 배포하게되면 메모리 초과가 발생할 것이다.
실제로 해당 파일을 통해서 6개의 파드를 배포해보면 메모리가 부족하여 파드의 생성이 중지되며, 오류가 지속적으로 발생하는 것을 확인할 수 있다.
wc -l
명령어는 출력의 행 수를 세어서 결과로 반환하는 명령어이다.결론적으로, 리소스 쿼터는 네임스페이스의 전체 자원 사용을 제한하는 반면, 리밋 레인지는 네임스페이스 내의 개별 파드, 컨테이너, PVC의 상세한 자원의 최소 및 최대 자원 사용 범위를 제한한다.
이 두 가지 기능을 함께 사용함으로써, 쿠버네티스 클러스터의 자원 사용을 효율적으로 관리하고 제어할 수 있다.