수직형 Pod 자동 확장 구성

이 페이지에서는 Google Kubernetes Engine에서 수직형 Pod 자동 확장을 구성하는 방법을 설명합니다. 수직형 Pod 자동 확장을 위해서는 Pod의 CPU 및 메모리 요청을 조정해야 합니다.

개요

VerticalPodAutoscaler 커스텀 리소스를 사용하여 컨테이너의 CPU 요청메모리 요청을 조정할 수 있습니다. CPU 및 메모리 요청을 추천하거나 자동으로 변경하도록 VerticalPodAutoscaler를 구성할 수 있습니다.

시작하기 전에

이 작업을 준비하려면 다음 단계를 완료하세요.

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project [PROJECT_ID]
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 리전 클러스터를 사용하는 경우 기본 컴퓨팅 리전을 설정합니다.
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

API 버전에 관한 참고사항

이 가이드에서는 Google Kubernetes Engine 클러스터에 v1beta2 버전의 Vertical Pod Autoscaler API가 설치되어 있다고 가정합니다. Google Kubernetes Engine 버전 1.11(버전 1.11.8부터)과 버전 1.12.6 이상의 모든 클러스터에서 이 API를 사용할 수 있습니다.

이 API를 사용하는 것이 가장 좋습니다. API 이전 버전에서 마이그레이션하는 방법은 마이그레이션 가이드를 참조하세요.

클러스터에 수직형 Pod 자동 확장 사용 설정

수직형 포드 자동 확장을 사용하도록 설정된 새 클러스터를 만들려면 다음 명령어를 입력하세요.

gcloud beta container clusters create [CLUSTER_NAME] --enable-vertical-pod-autoscaling --cluster-version=1.11.8

여기서 [CLUSTER_NAME]은 클러스터에 대해 개발자가 선택한 이름입니다.

기존 클러스터가 수직형 포드 자동 확장을 사용하도록 설정하려면 다음 명령어를 입력하세요.

cloud beta container clusters update [CLUSTER-NAME] --enable-vertical-pod-autoscaling

여기서 [CLUSTER_NAME]은 클러스터의 이름입니다.

리소스 추천 받기

이 연습에서는 updateMode가 'Off'인 VerticalPodAutoscaler를 만듭니다. 그런 다음에 두 개의 포드가 있는 배포를 만듭니다. 각 포드에는 컨테이너가 하나씩 포함되어 있습니다. 포드가 만들어지면 VerticalPodAutoscaler가 컨테이너의 CPU 및 메모리 요구를 분석하고 status 필드에 추천값을 기록합니다. VerticalPodAutoscaler는 실행 중인 컨테이너의 리소스 요청을 업데이트하기 위한 어떠한 조치도 취하지 않습니다.

다음은 VerticalPodAutoscaler의 매니페스트입니다.

apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:
  name: my-rec-vpa
spec:
  targetRef:
    apiVersion: "extensions/v1beta1"
    kind:       Deployment
    name:       my-rec-deployment
  updatePolicy:
    updateMode: "Off"

이름이 my-rec-vpa.yaml인 파일에 매니페스트를 저장하고 VerticalPodAutoscaler를 만듭니다.

kubectl create -f my-rec-vpa.yaml

배포 매니페스트는 다음과 같습니다.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-rec-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: my-rec-deployment
    spec:
      containers:
      - name: my-rec-container
        image: nginx

매니페스트에서 CPU 또는 메모리 요청이 없는 것을 확인할 수 있습니다. 배포의 Pod가 VerticalPodAutoscaler에 속해 있는 것도 확인할 수 있습니다. kind: Deploymentname: my-rec-deployment의 대상을 가리키고 있기 때문입니다.

my-rec-deployment.yaml이라 하는 파일에 매니페스트를 복사하고 배포를 만듭니다.

kubectl create -f my-rec-deployment.yaml

몇 분 기다린 후에 VerticalPodAutoscaler를 봅니다.

kubectl get vpa my-rec-vpa --output yaml

CPU 및 메모리 요청의 추천값이 출력에 표시됩니다.

...
  recommendation:
    containerRecommendations:
    - containerName: my-rec-container
      lowerBound:
        cpu: 25m
        memory: 262144k
      target:
        cpu: 25m
        memory: 262144k
      upperBound:
        cpu: 7931m
        memory: 8291500k
...

이제 CPU 및 메모리 요청 추천값이 있으므로 배포를 삭제하고, CPU 및 메모리 요청을 배포 매니페스트에 추가하고, 배포를 다시 시작하는 방법을 선택할 수도 있습니다.

자동으로 리소스 요청 업데이트

이 연습에서는 두 개의 포드가 있는 배포를 만듭니다. 각 포드에는 100 milliCPU와 50메비바이트의 메모리를 요청하는 컨테이너가 하나 있습니다. 이 상태에서 CPU 및 메모리 요청을 자동으로 조정하는 VerticalPodAutoscaler를 만듭니다.

배포 매니페스트는 다음과 같습니다.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-auto-deployment
spec:
  replicas: 2
  template:
    metadata:
      app: my-auto-deployment
    spec:
      containers:
      - name: my-container
        image: k8s.gcr.io/ubuntu-slim:0.1
        resources:
          requests:
            cpu: 100m
            memory: 50Mi
        command: ["/bin/sh"]
        args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]

이름이 my-deployment.yaml인 파일에 매니페스트를 복사하고 배포를 만듭니다.

kubectl create -f my-deployment.yaml

실행 중인 포드를 나열합니다.

kubectl get pods

my-deployment에 있는 포드의 이름이 출력에서 표시됩니다.

NAME                            READY     STATUS             RESTARTS   AGE
my-deployment-cbcdd49fb-d6bf9   1/1       Running            0          8s
my-deployment-cbcdd49fb-th288   1/1       Running            0          8s

나중을 위해 포드 이름을 메모합니다.

배포의 CPU 및 메모리 요청은 매우 작습니다. 따라서 배포는 리소스가 늘어날 경우 혜택을 받을 가능성이 높습니다.

VerticalPodAutoscaler의 매니페스트는 다음과 같습니다.

apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa
spec:
  targetRef:
    apiVersion: "extensions/v1beta1"
    kind:       Deployment
    name:       my-deployment
  updatePolicy:
    updateMode: "Auto"

매니페스트에서 targetRef 필드는 my-deployment라는 배포에서 제어되는 모든 Pod가 이 VerticalPodAutoscaler에 속해 있다는 것을 나타냅니다.

updateMode 필드 값은 Auto입니다. 이는 VerticalPodAutoscaler가 Pod 수명 동안 CPU 및 메모리 요청을 업데이트할 수 있다는 의미입니다. 즉, VerticalPodAutoscaler는 포드를 삭제하고 CPU 및 메모리 요청을 조정한 후에 새 포드를 시작할 수 있습니다.

이름이 my-vpa.yaml인 파일에 매니페스트를 복사하고 VerticalPodAutoscaler를 만듭니다.

kubectl create -f my-vpa.yaml

몇 분 기다린 후에 실행 중인 포드를 다시 봅니다.

kubectl get pods

포드 이름이 변경된 것을 볼 수 있습니다. 포드 이름이 아직 변경되지 않은 경우에는 더 오래 기다렸다가 실행 중인 포드를 다시 나열하세요.

실행 중인 포드 중 하나에 대한 자세한 정보를 가져옵니다.

kubectl get pod [POD_NAME] --output yaml

여기서 [POD_NAME]은 포드의 이름입니다.

출력에서 VerticalPodAutoscaler가 메모리 및 CPU 요청을 늘릴 것을 볼 수 있습니다. 업데이트 이유를 설명하는 주석도 볼 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  annotations:
    vpaUpdates: 'Pod resources updated by my-vpa: container 0: cpu capped to node
      capacity, memory capped to node capacity, cpu request, memory request'
...
spec:
  containers:
  ...
    resources:
      requests:
        cpu: 510m
        memory: 262144k
    ...

VerticalPodAutoscaler에 대한 자세한 정보를 가져옵니다.

kubectl get vpa my-vpa --output yaml

하한, 목표, 상한의 세 가지 CPU 및 메모리 요청 추천값이 출력에 표시됩니다.

...
  recommendation:
    containerRecommendations:
    - containerName: my-container
      lowerBound:
        cpu: 536m
        memory: 262144k
      target:
        cpu: 587m
        memory: 262144k
      upperBound:
        cpu: 27854m
        memory: "545693548"

target 추천값은 컨테이너가 587milliCPU 및 262,144킬로바이트의 메모리를 요청할 경우 최적의 상태로 실행된다는 것을 의미합니다.

VerticalPodAutoscaler는 lowerBoundupperBound 추천값을 사용하여 포드를 삭제하고 새로운 포드로 대체할 것인지 여부를 결정합니다. Pod의 요청 수가 하한보다 낮거나 상한보다 높으면 VerticalPodAutoscaler는 Pod를 삭제하고 목표 추천값이 있는 Pod로 바꿉니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine 문서