쿠버네티스 리소스 요청 및 제한 설정

서론


쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 강력한 플랫폼입니다. 쿠버네티스 클러스터에서 리소스를 효율적으로 관리하기 위해 리소스 요청(Resource Requests)과 리소스 제한(Resource Limits)을 설정하는 것은 매우 중요합니다. 이를 통해 각 애플리케이션이 적절한 양의 리소스를 사용하도록 하고, 클러스터 전체의 안정성을 유지할 수 있습니다. 이번 포스팅에서는 리소스 요청과 제한을 설정하는 방법을 초보자도 이해할 수 있도록 자세히 설명합니다.


본론


리소스 요청과 제한의 개념


리소스 요청 (Resource Requests)


리소스 요청은 컨테이너가 실행될 때 필요한 최소한의 리소스 양을 지정합니다. 노드는 이 요청을 기반으로 파드를 스케줄링합니다. 예를 들어, CPU와 메모리에 대한 리소스 요청을 설정할 수 있습니다.


  • CPU 요청: 컨테이너가 실행되기 위해 필요한 최소한의 CPU 리소스입니다. CPU 요청은 millicores 단위로 설정됩니다. 1 CPU는 1000m(밀리코어)로 표현됩니다.
  • 메모리 요청: 컨테이너가 실행되기 위해 필요한 최소한의 메모리 리소스입니다. 메모리 요청은 Mi(메비바이트) 또는 Gi(기비바이트) 단위로 설정됩니다.

리소스 제한 (Resource Limits)


리소스 제한은 컨테이너가 사용할 수 있는 최대 리소스 양을 지정합니다. 이를 통해 한 컨테이너가 너무 많은 리소스를 사용하여 다른 컨테이너의 성능에 영향을 미치는 것을 방지할 수 있습니다.


  • CPU 제한: 컨테이너가 사용할 수 있는 최대 CPU 리소스입니다.
  • 메모리 제한: 컨테이너가 사용할 수 있는 최대 메모리 리소스입니다.

리소스 요청과 제한 설정 방법


리소스 요청과 제한은 파드의 YAML 파일 내에서 설정할 수 있습니다. 여기서는 Nginx 컨테이너를 예로 들어 리소스 요청과 제한을 설정하는 방법을 설명합니다.


리소스 요청과 제한을 설정한 파드 YAML 예시


apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

위 YAML 파일에서 resources 섹션은 컨테이너의 리소스 요청과 제한을 정의합니다. requests 섹션은 최소한의 리소스 요구사항을, limits 섹션은 최대한의 리소스 제한을 설정합니다.


리소스 요청과 제한의 중요성


리소스 요청과 제한을 적절히 설정하면 다음과 같은 이점이 있습니다.


  1. 효율적인 리소스 사용: 각 컨테이너가 필요한 만큼의 리소스를 사용하도록 하여 클러스터의 리소스를 효율적으로 활용할 수 있습니다.
  2. 안정성 향상: 리소스 제한을 통해 한 컨테이너가 과도한 리소스를 사용하여 다른 컨테이너의 성능에 영향을 미치는 것을 방지할 수 있습니다.
  3. 예측 가능한 성능: 리소스 요청을 통해 각 컨테이너가 최소한의 성능을 보장받을 수 있어 애플리케이션의 성능을 예측 가능하게 합니다.

리소스 요청과 제한 설정 실습


이번 섹션에서는 리소스 요청과 제한을 설정하는 실습을 진행합니다. Nginx 컨테이너를 포함하는 파드를 생성하고, 리소스 요청과 제한을 설정하는 과정을 단계별로 설명합니다.


1. 파드 YAML 파일 작성


다음은 Nginx 컨테이너를 포함하는 파드 YAML 파일입니다. 이 파일에서는 CPU와 메모리에 대한 리소스 요청과 제한을 설정합니다.


apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

2. 파드 생성


작성한 YAML 파일을 사용하여 파드를 생성합니다.


kubectl apply -f nginx-pod.yaml

이 명령어를 실행하면 쿠버네티스 클러스터에 Nginx 파드가 생성됩니다.


3. 파드 상태 확인


파드가 정상적으로 생성되었는지 확인합니다.


kubectl get pods

이 명령어는 현재 네임스페이스의 모든 파드를 조회합니다. Nginx 파드가 실행 중임을 확인할 수 있습니다.


4. 파드 상세 정보 조회


생성된 파드의 상세 정보를 조회하여 리소스 요청과 제한이 설정되었는지 확인합니다.


kubectl describe pod nginx-pod

이 명령어는 Nginx 파드의 상세 정보를 출력합니다. 출력된 정보에서 Resources 섹션을 확인하면 설정된 리소스 요청과 제한을 볼 수 있습니다.


리소스 제한 및 요청의 실제 적용


리소스 요청과 제한을 설정하면 쿠버네티스 클러스터는 이를 기반으로 리소스를 할당하고 스케줄링합니다. 다음은 리소스 요청과 제한이 실제로 어떻게 적용되는지에 대한 설명입니다.


노드의 리소스 할당


쿠버네티스 스케줄러는 파드를 노드에 배치할 때 리소스 요청을 고려합니다. 노드의 가용 리소스가 파드의 요청을 충족할 수 있는 경우에만 해당 노드에 파드를 배치합니다. 이는 노드의 리소스 과다 사용을 방지하고, 각 파드가 안정적으로 실행될 수 있도록 합니다.


컨테이너의 리소스 제한


컨테이너 런타임은 설정된 리소스 제한을 기반으로 컨테이너의 리소스 사용을 제한합니다. 컨테이너가 설정된 제한을 초과하려고 하면, 컨테이너의 CPU 사용량을 줄이거나 메모리 사용량을 제한합니다. 이는 다른 컨테이너에 미치는 영향을 최소화하고, 전체 클러스터의 안정성을 유지하는 데 도움을 줍니다.


리소스 제한 및 요청의 모니터링


리소스 요청과 제한이 제대로 설정되었는지 모니터링하는 것은 매우 중요합니다. 쿠버네티스는 다양한 모니터링 도구를 통해 리소스 사용량을 추적할 수 있습니다.


Prometheus와 Grafana를 이용한 모니터링


Prometheus와 Grafana는 쿠버네티스 클러스터의 리소스 사용량을 모니터링하는 데 널리 사용되는 도구입니다. Prometheus는 메트릭 데이터를 수집하고, Grafana는 이를 시각화합니다.


Prometheus 설치


kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/master/bundle.yaml

Grafana 설치


kubectl apply -f https://raw.githubusercontent.com/grafana/grafana/master/deploy/kubernetes/grafana-service.yaml

리소스 사용량 대시보드 설정


Prometheus와 Grafana를 설치한 후, Grafana 대시보드에서 리소스 사용량을 시각화하여 모니터링할 수 있습니다.


리소스 할당 전략


리소스 요청과 제한을 설정할 때 고려해야 할 몇 가지 전략이 있습니다.


버스트 가능한 워크로드


버스트 가능한 워크로드는 평소에는 적은 리소스를 사용하지만, 간헐적으로 많은 리소스를 필요로 하는 워크로드입니다. 이러한 워크로드에는 낮은 리소스 요청과 높은 리소스 제한을 설정할 수 있습니다.


고정 리소스 워크로드


고정 리소스 워크로드는 일정한 리소스를 지속적으로 사용하는 워크로드입니다. 이러한 워크로드에는 리소스 요청과 제한을 동일하게 설정하여 예측 가능한 성능을 유지할 수 있습니다.


리소스 할당 최적화


리소스 요청과 제한을 적절히 설정하여 클러스터의 리소스를 최적화할 수 있습니다. 이를 통해 클러스터의 안정성을 높이고, 비용을 절감할 수 있습니다.


리소스 요청 및 제한 조정


리소스 사용 패턴을 모니터링하여 리소스 요청과 제한을 조정할 수 있습니다. 예를 들어, 사용하지 않는 리소스를 줄이고, 필요한 리소스를 늘려 효율성을 높일 수 있습니다.


오토스케일링


쿠버네티스는 오토스케일링 기능을 통해 파드와 노드의 수를 동적으로 조절할 수 있습니다. 이를 통해 리소스 사용량에 따라 자동으로 리소스를 할당할 수 있습니다.


Horizontal Pod Autoscaler


apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

Cluster Autoscaler


Cluster Autoscaler는 클러스터의 노드 수를 자동으로 조절하여 리소스 사용량에 맞게 클러스터의 크기를 조절합니다.


결론


쿠버네티스에서 리소스 요청과 제한을 설정하는 것은 클러스터의 안정성과 효율성을 유지하는 데 매우 중요합니다. 리소스 요청은 컨테이너가 실행되기 위해 필요한 최소한의 리소스를 지정하고, 리소스 제한은 컨테이너가 사용할 수 있는 최대 리소스를 제한합니다. 이번 포스팅에서는 리소스 요청과 제한의 개념, 설정 방법, 중요성, 모니터링 방법, 그리고 최적화 전략에 대해 자세히 설명했습니다. 이를 통해 쿠버네티스 클러스터의 리소스를 효과적으로 관리할 수 있기를 바랍니다.

다음 이전