k8s를 사용하는 구조에서는 많은 Container pod가 배포되고 이에 따라 적절하게 Resouces를 관리해야 한다.
그리고 pod를 schedule 할 때, pod 내의 application이 동작할 수 있을만큼의 자원(CPU, Memory)가 확보되어야 한다.
물론, 별도 Limit 없이 무제한으로 할당할 수 있지만 이는 특정 pod가 문제가 되면 다른 pod도 모두 영향을 받으므로 제한하는것이 좋은 방법이다.
- k8s 1.9 버전에서는 CPU, Memory 자원에 대해서만 제한이 가능하다.
k8s Resouces 단위
k8s에서 Resouces를 정의하는 기본 단위는 ms(밀리 세컨드)이다. 대략 1000ms = 1vCPU이다.
CPU, Limit Resources 자원 할당 방법
k8s를 만들 때, Request & Limit 옵션으로 pod 별로 Resouces를 제한할 수 있다.
Request는 pod가 생성될 때 기본적으로 요청하는 양이며, Limit은 Resouces가 더 필요한 경우의 상한선이다.
그렇기때문에 pod의 Resouces가 Limit을 넘으면 문제가 발생한다.
Container별 Resources 제한
CPU, Memory 제한은 아래와 같이 yaml 파일을 만들 때 간단하게 정할 수 있으며, pod, Namespace별로 지정할 수 있다.
...생략...
spec:
containers:
-name: test
image: nginx
resources:
requests:
memory:"64Mi"
cpu: "250m"
limis:
memoty: "128Mi"
cpu: "500m"
...생략...
Resource Quota = Namespace별 Resources 제한
Resource Quota는 Namespace별로 전체 CPU, Memory를 제한할 수 있다. 아래 예는 CPU 500m ~ 700m, Memoty 100Mi ~ 500Mi로 제한하는 양식이다. 팀 또는 서비스 기준으로 Namespace를 구분한다면 이 방법도 좋다.
apiVersion: v1
kind: ResourceQuota
metadata:
name: test
spec:
hard:
requests.cpu: 500m
requests.memoty: 100Mib
limits.cpu: 700m
limis.memoty: 500Mib
Limit Range = Container별 Resources 제한
개별 Container별로 Resouces를 제한하는 방법도 있고, 위 Resouce Quota에 비해 많은 파라미터가 있다.
- default : limit을 따로 지정하지 않을 때 사용하는 default limit이다.
- defaultRequest : request를 따로 지정하지 않을 때의 default request이다.
- max : limit을 지정할 때, 설정 가능한 최대치이다.
- min : limit을 지정할 때, 설정 가능한 최소치이다.
apiVersion: v1
kind: LimitRange
metadata:
name: test
spec:
limis:
- default:
cpu: 600m
memoty: 100Mib
defaultRequest:
cpu: 100m
memory: 50Mib
max:
cpu: 1000m
memory: 200Mib
min:
cpu: 10m
memory: 10Mib
Container가 Requests 량을 초과하게된다면?
Container가 request 이상의 자원을 요청하더라도 문제는 없다. 다만, 이 경우 해당 Pod는 퇴거(Eviction)상태가 되고 다른 node로 재배치 된다. 근데 또!! 만약 모든 node의 자원이 부족하다면 pod는 Pending 상태가 된다.
Container가 Limit 량을 초과하게된다면?
Limit 이상의 자원을 요청하게되면 문제가 발생한다. Limit 양 이상의 자원을 요청하는 경우를 overcommitted 상태라고 한다.
이 경우 CPU의 경우 request로 정의된 양만큼 낮추고 상태를 지켜본다. 반면 Memory는 즉시 Eviction 대상이 된다. 최악의 경우는 OOM 상태로 빠져서 Container가 구동되지 않는다.
그렇다면, CPU & Memory를 제한하지 않는다면?
기본적으로 1vCPU, 512Mi이 할당되며 Limit은 존재하지 않는다. 즉, 필요한만큼 계속해서 늘어난다.
위 기술내용을 보면 CPU & Memory를 작게 제한할 수도 없고, 그렇다고 제한하지 않는것은 잠재적인 문제를 유발할 수 있다.
그렇기 때문에 각 Container 또는 Namespace별로 적절하게 제한하는것이 중요하다. 또한 자원 현황이 계속해서 고점유하고 있다면 Pod Scaling을 설정하여 자동으로 스케일링을 하도록 하는것도 방법이다!!
'기술 이모저모 > [K8s] Kubernetes' 카테고리의 다른 글
[k8s] Kubernetes Configmap(컨피그맵) 소소한 개념정리 (0) | 2022.10.21 |
---|---|
[k8s] KodeKloud Practice test - Static pod (0) | 2022.10.20 |
[k8s] KodeKloud Practice test - Resouce Limis (0) | 2022.10.10 |
[k8s] Kubernetes NodeAffinity의 개념정리 (0) | 2022.10.10 |
[k8s] Kubernetes Node Taint & Tolerations의 개념정리 (0) | 2022.10.09 |