수직형 Pod 자동 확장 구성

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

수직형 pod 자동 확장은 기본적으로 Autopilot 클러스터에서 사용 설정됩니다. 그러나 다음 섹션의 설명대로 VerticalPodAutoscaler 객체를 만들어 워크로드에 수직형 pod 자동 확장을 구성해야 합니다.

개요

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

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

다음 방법 중 하나를 사용하여 기본 gcloud 설정을 진행합니다.

  • gcloud init를 사용하여 기본값 설정 과정을 진행합니다.
  • gcloud config를 사용하여 프로젝트 ID, 영역, 리전을 개별적으로 설정합니다.

gcloud init 사용

One of [--zone, --region] must be supplied: Please specify location 오류가 표시되면 이 섹션을 완료합니다.

  1. gcloud init를 실행하고 다음 안내를 따르세요.

    gcloud init

    원격 서버에서 SSH를 사용하는 경우 --console-only 플래그를 사용하여 다음 명령어로 브라우저를 실행하지 못하게 할 수 있습니다.

    gcloud init --console-only
  2. 안내를 따라 gcloud에서 Google Cloud 계정을 사용하도록 승인합니다.
  3. 새 구성을 만들거나 기존 구성을 선택합니다.
  4. Google Cloud 프로젝트를 선택합니다.
  5. 영역 클러스터의 기본 Compute Engine 영역이나 리전 또는 Autopilot 클러스터의 리전을 선택합니다.

gcloud config 사용

  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project PROJECT_ID
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone COMPUTE_ZONE
  • Autopilot 또는 리전 클러스터를 사용하는 경우 기본 컴퓨팅 리전을 설정합니다.
    gcloud config set compute/region COMPUTE_REGION
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

API 버전에 대한 참고사항

이 가이드에서는 Google Kubernetes Engine 클러스터에 VerticalPodAutoscaler API 버전 v1이 설치되어 있다고 가정합니다.

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

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

수직형 Pod 자동 확장을 사용 설정하여 새 클러스터를 만들려면 다음 명령어를 입력합니다.

gcloud container clusters create CLUSTER_NAME \
    --enable-vertical-pod-autoscaling --cluster-version=VERSION

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름입니다.
  • VERSION: 클러스터에 지정할 버전입니다.

기존 클러스터에 수직형 Pod 자동 확장을 사용 설정하려면 다음 명령어를 입력합니다.

gcloud container clusters update CLUSTER_NAME \
    --enable-vertical-pod-autoscaling

CLUSTER_NAME을 기존 클러스터 이름으로 바꿉니다.

수직형 pod 자동 확장을 사용 설정하거나 사용 중지하면 제어 영역이 다시 시작됩니다.

리소스 추천 받기

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

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

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

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

kubectl create -f my-rec-vpa.yaml

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-rec-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-rec-deployment
  template:
    metadata:
      labels:
        app: my-rec-deployment
    spec:
      containers:
      - name: my-rec-container
        image: nginx

매니페스트에서 CPU 또는 메모리 요청이 없는 것을 확인할 수 있습니다. 또한 매니페스트가 kind: Deploymentname: my-rec-deployment의 대상을 가리키므로 배포의 Pod가 VerticalPodAutoscaler에 속함을 알 수 있습니다.

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

kubectl create -f my-rec-deployment.yaml

몇 분 기다린 후에 수직형 pod 자동 확장을 확인합니다.

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와 메모리 요청을 배포 매니페스트에 추가하고, 배포를 다시 시작할 수 있습니다.

특정 컨테이너 선택 해제

이 연습에서는 특정 컨테이너가 선택 해제된 VerticalPodAutoscaler 객체를 만듭니다. 그런 다음 컨테이너가 두 개인 pod가 한 개 있는 배포를 만듭니다. pod가 생성되면 수직형 pod 자동 확장은 단일 컨테이너에만 추천값을 만들고 적용하며 선택 해제된 컨테이너를 무시합니다.

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

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-opt-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment
    name:       my-opt-deployment
  updatePolicy:
    updateMode: "Auto"
  resourcePolicy:
    containerPolicies:
    - containerName: my-opt-sidecar
      mode: "Off"

VerticalPodAutoscalerresourcePolicy 섹션에는 추가 정보가 있습니다. mode "Off"는 지정한 이름의 컨테이너(이 경우 my-opt-sidecar)에 대한 추천값을 사용 중지합니다.

매니페스트를 my-opt-vpa.yaml이라는 파일에 저장하고 VerticalPodAutoscaler를 만듭니다.

kubectl create -f my-opt-vpa.yaml

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-opt-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-opt-deployment
  template:
    metadata:
      labels:
        app: my-opt-deployment
    spec:
      containers:
      - name: my-opt-container
        image: nginx
      - name: my-opt-sidecar
        image: busybox
        command: ["sh","-c","while true; do echo Doing sidecar stuff!; sleep 60; done"]

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

kubectl create -f my-opt-deployment.yaml

몇 분 기다린 후에 수직형 pod 자동 확장을 확인합니다.

kubectl get vpa my-opt-vpa --output yaml

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

...
  recommendation:
    containerRecommendations:
    - containerName: my-opt-container
...

컨테이너 한 개에만 추천값이 있습니다. 컨테이너가 선택 해제되었으므로 my-opt-sidecar에 대한 추천값이 없습니다.

수직형 pod 자동 확장은 선택 해제된 컨테이너의 리소스를 업데이트하지 않습니다. 몇 분 기다리면 pod가 다시 생성되지만 컨테이너 한 개에만 리소스 요청이 업데이트됩니다.

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

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

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-auto-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-auto-deployment
  template:
    metadata:
      labels:
        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-auto-deployment.yaml 파일에 매니페스트를 복사하고 배포를 만듭니다.

kubectl create -f my-auto-deployment.yaml

실행 중인 Pod를 나열합니다.

kubectl get pods

출력에 my-deployment의 Pod 이름이 표시됩니다.

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

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

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

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

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment
    name:       my-auto-deployment
  updatePolicy:
    updateMode: "Auto"

매니페스트에서 targetRef 필드는 이름이 my-deployment인 배포에 의해 제어되는 모든 pod가 이 수직형 pod 자동 확장에 속해 있음을 나타냅니다.

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

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

kubectl create -f my-vpa.yaml

몇 분 기다린 후에 실행 중인 Pod를 다시 확인합니다.

kubectl get pods

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

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

kubectl get pod POD_NAME --output yaml

POD_NAME을 pod 중 하나의 이름으로 바꿉니다.

출력에서 수직형 pod 자동 확장이 메모리 및 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
    ...

수직형 pod 자동 확장에 대한 자세한 정보를 가져옵니다.

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킬로바이트의 메모리를 요청할 경우 최적의 상태로 실행된다는 것을 의미합니다.

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

삭제

수직형 pod 자동 확장을 사용 중지합니다.

gcloud container clusters update CLUSTER_NAME \
    --no-enable-vertical-pod-autoscaling

CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

선택적으로 클러스터를 삭제합니다.

다음 단계