본문 바로가기
IT/Kubernetes

K8S 리소스 제한 컨트롤러

by rapker 2023. 4. 12.
반응형

참고

요약

  • Pod 매니패스트의 리소스 제한은 매우 중요하다.
  • 리소스 제한에 도움을 주는 컨트롤러로 LimitRange, ResourceQuota가 있다.
    • LimitRange : 리소스 제한이 정의되지 않은 pod에 대해 기본 리소스제한 값을 설정 (namespace 단위로 적용)
    • ResourceQuota : namespace에 배포된 모든 pod 들의 총 리소스 사용량 제한 (namespace 단위로 적용)

k8s로 pod를 실행하는 방법을 알게되면서 자연스럽게 접하게 되는 내용으로

pod의 매니패스트에 cpu, memory에 대한 요청량, 상한선을 지정하는 방법을 알게 됩니다.

 

pod가 배포될 때 requests에서 정의된 cpu, memory만큼의 node에 공간이 있어야 pod 배포가 가능하고, 해당 pod는 최대 limits에 정의된 만큼 사용량이 늘어날 수 있다는 의미 입니다.

pod가 동작하기 위한 최소, 최대 리소스 사용량을 정의하는 것이죠

 

사용량 제한이 별거 아닌 것 같아 보이지만 엄청 중요한 부분입니다.

 

이로인해 어느샌가 알 수 없는 이유로 pod들이 죽어나가는 현상을 목격하게 될 수 도 있습니다.

limits이 정의되지 않은 pod는 리소스 제한이 없기 때문에
pod가 추가 cpu, memory를 요청하는 만큼  node의 자원을 사용하게 됩니다.

k8s는 node의 자원이 부족해지면 (예:Out of memory) Request를 초과한 pod부터 종료시키기 때문에
멀쩡히 동작하던 다른 pod가 해당 node에서 제외되어 다른 node에 재 배치 됩니다.
그리고 limits을 정하지 않았던 pod는 계속 덩치가 커져서 node의 전체 리소스를 사용하게 될 수 있습니다.

limit이 정의되지 않은 pod가
    - 일차적으로 멀쩡히 동작하던 다른 pod들에 피해를 주었고
    - 이차적으로 limit없는 pod가 그마저 비정상인 상태라면
	- 해당 node는 이도저도 못하는 상태에 도달할 수도 있습니다.

(뭐 물론 pod 정의 때 liveness probe 설정으로 문제의 pod가 유지되지 않도록 조치를 했을 수도 있겠지만...)

여튼 request, limits은 반드시(무조건) 정의되어 있어야 한다고 생각하는 것이 좋습니다.

만에하나 누군가 실수로 pod에 리소스 제한을 정의하지 않았고,

이를 아무도 눈치채고 있지 못하고 있었다면

위 에 이야기 했던 이슈가 발생할 가능성은 여전히 존재하게 됩니다.

이를 방지하기 위한 방법으로 아래 두 가지 컨트롤러를 사용할 수 있습니다.

  • LimitRange
  • ResourceQuota

위 두 컨트롤러 모두 namespace단위로 pod들의 리소스 제한을 걸어준다는 점은 동일 하며 아래와 같은 차이가 있습니다.

LimitRange가 적용된 namespace에 배포되는 pod 대상으로, request, limit이 정의되지 않은 pod에 LimitRange에 정의된 값으로 적용해주는 방식이고

 

ResourceQuota가 적용된 namespace에 배포되는 pod들의 전체 resource 사용량을 제한해 주는 방식입니다.

 

음...

728x90

 

두 컨트롤러 모두 매니패스트가 엄청 짧고 단순해서 테스트를 별도로 해보고 싶지 않네요....

정의된 매니패스트를 적용할 namespace에 배포만 하면 끝이기도 하고...

 

매니패스트만 남겨놓고 끝내렵니다.

 

LimitRange

apiVersion: v1 
kind: LimitRange 
metadata: 
  name: mem-limit-range 
spec: 
  limits: 
  - default:
      cpu: 1
      memory: 512Mi 
    defaultRequest:
      cpu: 0.5
      memory: 256Mi 
    type: Container

request, limit이 정의되지 않은 pod가 배포되면, 아래와 같이 pod 리소스 제한이 부여 됩니다.

containers: 
- image: nginx 
  imagePullPolicy: Always 
  name: default-mem-demo-ctr 
  resources: 
    limits:
      cpu: 1
      memory: 512Mi 
    requests:
      cpu: 0.5
      memory: 256Mi

ResourceQuota

apiVersion: v1 
kind: ResourceQuota 
metadata: 
  name: mem-cpu-demo 
spec: 
  hard: 
    requests.cpu: "1" 
    requests.memory: 1Gi 
    limits.cpu: "2" 
    limits.memory: 2Gi

k8s cluster에 악의적인 사용자 접근 공격으로 리소스를 매우 사용하는 pod를 생성하려는 것을 방지하는 차원에서

LimitRange, ResourceQuota 를 고려하는 것도 중요해 보입니다.

 

반응형
LIST