이 글은 김태민님의 대세는 쿠버네티스 강의를 참고하여 정리하였습니다!
Namespace 구성
ResourceQuota 구성
LimitRange 구성
도커 이미지는 김태민님께서 만들어두신 이미지를 사용합니다.
Namespace의 Pod들이 사용하는 공유 자원에 대한 자원 한계를 달아 놓는 것입니다.
사용 방법은 Pod를 만들 때, Memory의 requests와 limits를 정해 놓으면 됩니다.
이제 실습한번 해봅시다!
ns3.yaml
apiVersion: v1
kind: Namespace
metadata:
name: ns-3
rq.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: rq-1
namespace: ns-3
spec:
hard:
requests.memory: 1Gi
limits.memory: 1Gi
ResourceQuota가 잘 만들어 졌는지 확인해봅시다!
kubectl describe resourcequotas --namespace=ns-3
이제 Pod를 생성해보도록 합시다!
pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-3
namespace: ns-3
spec:
containers:
- name: container
image: kubetm/app
오류가 뜨게 됩니다.
이렇게 오류가 뜨는 이유는 namespace상에 resourcequota가 정의 되어 있는데 limits와 requests가 명시되어 있지 않기 때문입니다.
pod3의 내용을 수정하도록 합시다
apiVersion: v1
kind: Pod
metadata:
name: pod-3
namespace: ns-3
spec:
containers:
- name: container
image: kubetm/app
resources:
requests:
memory: 0.5Gi
limits:
memory: 0.5Gi
Pod가 잘 생성된 것을 확인 하였으며, 메모리 사용량 또한 올라간 것을 확인할 수 있습니다!
그럼, 이제 memory의 사용량이 현재 ResourceQuota를 넘는 Pod를 만들어 봅시다!
pod4.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-4
namespace: ns-3
spec:
containers:
- name: container
image: kubetm/app
resources:
requests:
memory: 0.8Gi
limits:
memory: 0.8Gi
한계 사용량을 뛰어넘어 pod가 생성되지 않는 것을 확인하였습니다!
👍 ResourceQuota는 Pod의 수도 제한 할 수 있습니다
rq2.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: rq-2
namespace: ns-3
spec:
hard:
pods: 1
이제 pod를 하나 더 만들어 보도록 합시다!
pod5.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-5
namespace: ns-3
spec:
containers:
- name: container
image: kubetm/app
resources:
requests:
memory: 0.1Gi
limits:
memory: 0.1Gi
잘 만들어지지 않는 것을 확인할 수 있습니다!
각각의 Pod마다 Namespace에 들어올 수 있는지 자원을 체크하여, Pod마다 세세한 조건을 둘 수 있습니다.
이제 실습을 해보도록 합시다!
ns4.yaml
apiVersion: v1
kind: Namespace
metadata:
name: ns-4
lr.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: lr-1
namespace: ns-4
spec:
limits:
- type: Container
min:
memory: 0.1Gi
max:
memory: 0.4Gi
maxLimitRequestRatio:
memory: 3
defaultRequest:
memory: 0.1Gi
default:
memory: 0.2Gi
kubectl describe limitranges --namespace=ns-4
잘 만들어 졌습니다
이제 옵션들에 대해서 설명해 봅시다.
1. min : Pod에서 설정되는 Memory의 Limit 값이 이 min을 넘어야 한다는 것을 뜻합니다.
2. max : Pod에서 설정되는 Memory의 Limit 값이 이 max를 넘어서는 안됩니다.
3. maxLimitRequestRatio : request값과 limit값의 비율의 최대 값을 뜻합니다.
4. defaultRequest : Pod에 아무런 값을 설정 하지 않았을 때 자동으로 설정되는 request값 입니다.
5. default : Pod에 아무런 값을 설정 하지 않았을 때 자동으로 설정 되는 Limit 값 입니다.
이제, 2개의 Pod를 만들어 실습해 보도록 하겠습니다.
1. request와 limit을 설정하지 않은 Pod
2. maxLimitRequestRatio의 비율을 넘어선 Pod
pod6.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-6
namespace: ns-4
spec:
containers:
- name: container
image: kubetm/app
만들어진 pod의 yaml에 들어가 봅시다!
kubectl edit pod pod-6 -o yaml
자동으로 request, limit이 설정된 것을 확인 하였습니다.
pod7.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-7
namespace: ns-4
spec:
containers:
- name: container
image: kubetm/app
resources:
requests:
memory: 0.1Gi
limits:
memory: 0.4Gi
request와 limit의 비율이 4배인 pod를 생성해보도록 합시다.
Pod가 생성되지 못한 모습을 볼 수 있습니다!
실습을 마치도록 하겠습니다.