IT/Kubernetes

[Kubernetes] Kubernetes Study: "기본 오브젝트 - Namespace & ResourceQuota & LimitRange"

wookiist 2021. 6. 30. 00:10

Prologue

본 포스트는 인프런 쿠버네티스 스터디 그룹에서 진행하는 스터디 자료의 일환으로 작성하였습니다. 기본적으론 [대세는 쿠버네티스] 강의를 보고 내용을 정리합니다. 그리고 제 경험이나 이해를 곁들여 포스트를 작성했습니다. 그동안 공식 문서나 블로그 포스트, CKA 강의 등 다양한 경로로 쿠버네티스를 익혀왔지만, 한국어로 잘 정리된 강좌를 한번 듣고 깔끔하게 다듬어보는 시간을 가지면 좋겠다는 생각이 들었습니다.

강의와는 조금 다를 수 있지만, 쿠버네티스 공식 문서를 보고 내용을 정리해보겠습니다.

이번 포스트에선 마지막으로 "기본 오브젝트 - Namespace & ResourceQuota & LimitRange"를 다뤄봅니다.

Namespace & ResourceQuota & LimitRange

쿠버네티스는 동일한 물리 클러스터를 기반으로 하는 여러 가상 클러스터를 지원합니다. 여기서 가상 클러스터를 쿠버네티스 네임스페이스라고 합니다. 네임스페이스는 이름의 범위를 제공합니다. 어떤 파드나 디플로이먼트 등의 이름은 네임스페이스 내에서는 유일해야 합니다. 즉, 같은 클러스터 내에서 운용되는 애플리케이션이지만, 완전히 서로 독립적인 클러스터에서 운용되는 것처럼 보이게 만들어 줍니다.

또한 네임스페이스마다 파드 등의 오브젝트가 사용할 수 있는 자원의 제한을 걸어둘 수 있습니다. 이를 리소스 쿼터(ResourceQuota)라고 합니다. 여러 사용자나 팀이 제한된 수의 노드로 클러스터를 공유하게 되었을 때, 어떤 한 팀이 공정하게 분배된 리소스보다 많은 리소스를 사용하게 되는 경우가 있을 수 있습니다. 리소스 쿼터를 활용하면 이를 해결할 수 있습니다. 네임스페이스마다 총 리소스의 사용을 제한하는 제약 조건을 거는 것입니다.

만약 어떤 네임스페이스에 해당 네임스페이스의 리소스 쿼터에 맞먹는 자원을 사용하는 오브젝트가 스케줄되면 어떻게 될까요? 해당 네임스페이스에 있는 기존 파드들이 자원을 사용할 수 없게 됩니다. 이러한 문제를 방지하기 위해 리밋 레인지(Limit Range)를 설정합니다. 이렇게 리밋 레인지를 할당하게 되면, 네임스페이스에 들어오는 파드의 크기를 제한할 수 있습니다.

강의 내용

Namespace

네임스페이스를 생성하는 방법은 굉장히 단순합니다. 강의에서는 매니페스트 파일을 사용했지만 여기선 kubectl 명령으로 생성하는 방법을 알아보겠습니다.

# namespace-1 이라는 이름의 네임스페이스를 생성합니다.
$ kubectl create namespace namespace-1

이 네임스페이스 안에 파드를 생성하려면 다음처럼 매니페스트 파일을 작성합니다.

apiVersion: v1
kind: Pod
metadata:
    name: pod-1
    **namespace: namespace-1**
spec:
    containers:
    - name: container-1
        image: busybox

ResourceQuota

리소스 쿼터를 생성하는 매니페스트는 다음과 같습니다.

apiVersion: v1
kind: ResourceQuota
metadata:
    name: rq-1
    namespace: namespace-1
spec:
    hard:
        requests.memory: 3Gi
        limits.memory: 6Gi

이외에도 스토리지 크기, 파드 개수, 서비스 개수, 컨피그맵 개수 등을 제한할 수 있습니다.

LimitRange

리밋 레인지의 매니페스트는 이렇습니다.

apiVersion: v1
kind: LimitRange
metadata:
    name: lr-1
    namespace: namespace-1
spec:
    limits:
    - type: Container
        min:
            memory: 1Gi
        max:
            memory: 4Gi
        defaultRequest:
            memory: 1Gi
        default:
            memory: 2Gi
        maxLimitRequestRatio:
            memory: 3

위와 같이 리밋 레인지를 설정하게 되면 해당 네임스페이스에 컨테이너가 생성될 때마다 다음의 단계를 수행합니다.

  • 컨테이너가 자체 메모리 요청량(request)와 상한값(limit)을 설정하지 않았다면, 컨테이너에 요청량과 상한값을 각각 요청량 기본값(defaultRequest)과 상한값 기본값(deafult)으로 지정합니다.
  • 컨테이너가 1Gi 이상의 메모리 요청량을 지정했는지 확인합니다.
  • 컨테이너가 4Gi 이하의 메모리 상한값을 지정했는지 확인합니다.

마무리

이렇게 해서 인프런 강의의 "기본 오브젝트"를 모두 다뤄봤습니다. 내용이 많이 부실하고, 설명이 어렵게 되어 있는 등의 문제가 있을 것으로 보입니다. 추후 수정을 통해 다듬어보겠습니다.

여기까지 따라오시느라 고생이 많으셨습니다. 만약 이 글이 도움이 되셨다면 글 좌측 하단의 하트❤를 눌러주시면 감사하겠습니다.

혹시라도 글에 이상이 있거나, 이해가 가지 않으시는 부분, 또는 추가적으로 궁금하신 내용이 있다면 주저 마시고 댓글💬을 남겨주세요! 빠른 시간 안에 답변을 드리겠습니다 😊

반응형