카샤의 만개시기

쿠버네티스 리소스 관리하기 본문

DevOps/Docker & K8S

쿠버네티스 리소스 관리하기

SKaSha 2020. 1. 29. 08:39

특정 파드가 너무 많은 리소스를 점유하게 되면 같은 노드에 있는 다른 파드에 영향을 줄 수 있기 때문에 스케줄러는 각 파드가 최대/최소로 사용 가능한 리소스 요구 사항을 파악하고 이에 맞게 효율적으로 스케줄링해야 한다.

리소스 요청

파드를 실행하기 위한 최소 리소스 양을 지정한다.
파드를 실행하기 위한 최소한의 리소스를 가지고 있는 노드가 존재하지 않는다면 여유 용량이 확보될 때까지 대기 상태로 기다린다.

리소스 상한

파드가 사용할 수 있는 최대 리소스 양을 지정한다.
파드가 최대 상한을 초과하려 한다면 해당 파드는 요청이 제한되고 상한을 초과하였을 경우에는 파드가 종료되고 다시 스케줄링되어 동일 노드에서 재시작 된다.

spec:
    containers:
    - name: cafe
      image: kakao/cafe:kasha
      ports:
      - containerPort: 8080
      resources:
          requests:    # 리소스 요청
            memory: "20Mi"
            cpu: "250m"
          limits:     # 리소스 상한
            memory: "50Mi"
            cpu: "500m"

PodDisruptionBudgets

어플리케이션을 업그레이드 하거나 파드를 다른 노드로 옮겨야 할 경우, 활성 상태의 파드를 중지해야 할 수 있다.
그럴 경우 여러 파드가 동시에 중지되어 서비스의 다운 타임이 발생하지 않도록 PodDisruptionBudget를 사용하여 주어진 시간에 제거할 수 있는 파드의 양을 제한할 수 있다.

minAvailable

최소한 실행해야하는 파드의 갯수 지정.

maxUnavailable

최대로 퇴출할 수 있는 파드의 갯수나 비율을 지정.
이것은 파드가 자발적 퇴출(voluntary evictions)인 경우에만 해당되고, 하드웨어 장애 등의 이유로 비자발적으로 퇴출 될 경우에는 해당되지 않는다.

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
    name: kasha
spec:
    minAvailable: 3
    maxUnavailable: 10%
    selector:
        matchLabels:
            app: cafe

네임스페이스를 이용한 제한

개별 컨테이너에 CPU와 메모리를 제한하는것 외에도 namespace를 이용하여 리소스 사용을 제한할 수 있다.

ResourceQuota

특정 네임스페이스에서 한번에 실행 가능한 파드의 갯수를 제한한다.

apiVersion: policy/v1
kind: ResourceQuota
metadata:
    name: kasha
spec:
    hard: 
        pods: "50"    # 50개로 제한

특정 네임스페이스에서 ResourceQuota가 활성화 되어있는지 확인 하기 위해서는 kubectl get resourcequotas -n cafe 명령어를 실행하면 된다.

LimitRage

특정 네임스페이스 내에 모든 컨테이너의 기본 요청과 상한을 지정할수 있다.

apiVersion: policy/v1
kind: ResourceQuota
metadata:
    name: kasha
spec:
    limits:
    - defaultRequest:    # 리소스 요청
            memory: "50Mi"
            cpu: "500m"
          default:     # 리소스 상한
            memory: "20Mi"
            cpu: "250m"
        type: Container

대부분의 경우, 클러스터 관리 도구는 노드를 자동으로 비우지만 kubectl drain 명령어를 사용하여 직접 비울수 있다.
노드를 제거할때에는 바로 종료하지 말고 먼저 비우기 작업을 통하여 해당 노드에서 실행 중인 워크로드를 다른 노드로 이전해야한다.

Comments