배경

Pod의 자원으로 설정되어 있지만, 실제로는 컨테이너 단위로 자원이 할당된다. Pod에서의 자원은 모든 컨테이너에게 할당된 자원의 총합을 말한다.

  • 쿠버네티스 클러스터에는 한정된 자원이 있다.
  • 클러스터 안에는 여러 네임스페이스들이 있고, 그 안에는 여러 파드들이 존재한다.
  • 각 파드는 필요한 자원을 클러스터 자원을 끌어다 사용하는데, 만약 한 네임스페이스에서 많은 자원을 사용하게 되면 다른 네임스페이스에서는 더이상 쓸 자원이 없어서 자원이 필요할 때 문제가 발생한다.
  • 이러한 문제를 해결하기 위해서 아래와 같은 게 등장했다.
    • 네임스페이스 뿐만 아니라 클러스터에도 제한을 걸 수 있다.
      • ResourceQuota: 네임스페이스마다 최대 자원의 사용량을 설정할 수 있다.
      • LimitRange: 네임스페이스에 들어오는 파드의 자원 사용량을 제한하는 역할을 한다.

Namespace

  • 한 네임스페이스 안에는 같은 타입((Pod, Service, ...)의 오브젝트들은 이름이 중복될 수 없다는 특징이 있다.
  • 오브젝트들마다 별도의 UUID가 존재한다.
  • 대표적인 특징으로 타 네임스페이스에 있는 자원과 분리가 되고, 관리가 된다.
    • A 네임스페이스에서 Service가 B 네임스페이스의 파드를 연결할 수 없다.
    • Namespace-2의 Pod1에서 Namespace-1의 Pod1의 IP 주소를 통한 연결은 가능하다. <- NetworkPolicy라는 오브젝트를 통해서 제한할 수 있다.
  • 네임스페이스를 지우면 그 안에 있는 모든 게 다 지워지기 때문에 유의해야 한다.

ResourceQuota

  • ResourceQuota는 네임스페이스의 자원 한계를 설정하는 오브젝트이다.
  • ResourceQuota가 지정되어 있는 네임스페이스에 파드를 만들 때 파드는 무조건 ResourceQuota에 표시된 부분에 대해 Spec을 명시해줘야 한다.
    • ResourceQuota를 넘는 Spec이거나 Spec을 설정하지 않으면 파드가 만들어지지 않는다.
  • ResourceQuota를 만들기 전에 Spec을 명시하지 않은 파드를 만들고, 이후에 ResourceQuota를 만들면 오류가 발생하지 않는다. 하지만 결국 기존의 파드 때문에 ResourceQuota보다 더 많은 자원을 사용하게 되므로 ResourceQuota를 만들기 전에 파드가 존재하지 않도록 해야한다.

제한시킬 수 있는 부분에 대한 이미지

  • 대쉬보드에서 ResourceQuota에 대해 확인이 안 되므로 명령어를 입력해야 한다.
    • "kubectl describe resourcequotas --namespace=nm-1" : nm-1 네임스페이스에 달린 ResouceQuota를 보여준다.

LimitRange

  • LimitRange의 기능은 각각의 파드마다 네임스페이스에 들어올 수 있는지 자원을 체크한다.
    • min: 최소 limits의 값 설정
    • max: 최대 limits의 값 설정
    • maxLimitRequestRatio: requests와 limits 값의 비율의 최댓값 설정
  • Spec에 명시하지 않았을 때 기본값을 주도록 하는 설정도 존재한다. 파드 단위가 아닌, 컨테이너 단위로 할당한다.
    • defaultRequest: requests 값을 설정하지 않은 컨테이너가 들어올 때, 컨테이너의 requests값을 동일한 값으로 설정해준다.
    • default: requests 값을 설정하지 않은 컨테이너가 들어올 때, 컨테이너의 limits값을 동일한 값으로 설정해준다.
  • 대쉬보드에서 LimitRange에 대해 확인이 안 되므로 명령어를 입력해야 한다.
    • "kubectl describe limitranges --namespace=nm-1" : nm-1 네임스페이스에 달린 LimitRange를 보여준다.
  • 한 네임스페이스에 LimitRange에 대해 동일한 설정을 줄 시에, 설정마다 참고하는 LimitRange가 달라지므로, 겹치지 않게 LimitRange의 설정값을 주도록 주의해야 한다.
    • 예를 들어 A LimitRange에서 max를 2, defulat의 값을 3이라고 하고, B LimitRange에서 max를 1, default를 4라고 했을 때, max는 B의 것을, defulat는 A의 것을 참고하는 상황이 발생할 수 있다.

 

+ Recent posts