커스텀 측정항목으로 배포 자동 확장

이 가이드에서는 Kubernetes 포드가 Stackdriver로 내보낸 커스텀 측정항목에 기반하여 GKE 작업 부하를 자동으로 확장하는 방법을 보여 줍니다. Stackdriver에서 사용할 수 있는 다른 측정항목에 기반하여 작업 부하를 자동 확장하는 방법을 알아보려면 외부 측정항목으로 배포 자동 확장을 참조하세요.

목표

GKE에서 커스텀 측정항목으로 자동 확장을 설정하려면 다음을 수행해야 합니다.

  1. 커스텀 측정항목 Stackdriver 어댑터를 배포합니다.
  2. 커스텀 측정항목을 Stackdriver로 내보냅니다.
  3. HorizontalPodAutoscaler(HPA) 리소스를 배포하여 커스텀 측정항목을 기반으로 Deployment를 확장합니다.

시작하기 전에

다음 단계에 따라 Kubernetes Engine API를 사용 설정합니다.
  1. Google Cloud Platform Console에서 Kubernetes Engine 페이지로 이동합니다.
  2. 프로젝트를 만들거나 선택합니다.
  3. API 및 관련 서비스가 사용 설정될 때까지 기다립니다. 몇 분 정도 걸릴 수 있습니다.
  4. Google Cloud Platform 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

이 가이드에 사용된 다음 명령줄 도구를 설치합니다.

  • gcloud는 Kubernetes Engine 클러스터를 만들고 삭제하는 데 사용됩니다. gcloudGoogle Cloud SDK에 포함되어 있습니다.
  • kubectl은 Kubernetes Engine에서 사용되는 클러스터 조정 시스템인 Kubernetes를 관리하기 위해 사용됩니다. gcloud를 사용하여 kubectl을 설치할 수 있습니다.
    gcloud components install kubectl

gcloud 명령줄 도구의 기본값 설정

gcloud 명령줄 도구에서 프로젝트 IDCompute Engine 영역(zone) 옵션을 입력하는 시간을 절약하기 위해 기본값을 설정할 수 있습니다.
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

클러스터 생성 및 모니터링 설정

커스텀 측정항목 선택

커스텀 측정항목을 사용하여 자동 확장하는 방법은 두 가지가 있습니다.

  • Deployment의 모든 포드에서 커스텀 측정항목을 내보내고 포드당 평균값을 대상으로 지정할 수 있습니다.
  • Deployment 외부의 단일 포드에서 커스텀 측정항목을 내보내고 총 값을 대상으로 지정할 수 있습니다.

배포는 주어진 한도 내에서 측정항목 값에 기반하여 복제된 포드를 확장할 수 있습니다. 전체 목표 값이 있는 측정항목은 항상 확장으로 측정항목의 값이 목표 값에 가까워지도록 목표 값을 정의해야 합니다.

예를 들어 초당 쿼리 측정항목을 기반으로 프런트엔드 애플리케이션을 확장한다고 생각해 보겠습니다. 측정항목 값이 증가하면 포드의 수도 증가하여 각 포드가 전과 비슷한 양의 트래픽을 처리해야 합니다. 각 포트의 초당 쿼리 값을 내보내고 원하는 목표 평균 값을 설정하면 원하는 동작이 이루어집니다. 하지만 초당 쿼리 총 개수를 내보내고 이 측정항목의 총 목표 값을 설정하면 포드 수 증가로 총 트래픽이 줄어들지 않기 때문에 이 경우에는 원하는 동작이 이루어지지 않습니다.

평균 요청 지연 시간 같은 다른 측정항목을 총 목표 값에 직접 사용하면 사용 사례에 따라 배포를 확장할 수 있습니다.

1단계: 커스텀 측정항목 Stackdriver 어댑터 배포

GKE 객체에게 Stackdriver에 저장된 측정항목에 대한 액세스 권한을 부여하려면 커스텀 측정항목 Stackdriver 어댑터를 배포해야 합니다. 커스텀 측정항목 어댑터를 실행하려면 다음 명령어를 실행하여 필수 승인 역할을 만들 수 있는 능력을 사용자에게 부여해야 합니다.

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

클러스터에 어댑터를 배포하려면 다음 명령어를 실행하세요.

kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml

2단계: 측정항목을 Stackdriver로 내보내기

측정항목을 애플리케이션에서 직접 Stackdriver로 내보내거나 Prometheus 형식으로 노출하고 Prometheus-to-Stackdriver 어댑터를 Pod 컨테이너에 추가하여 내보낼 수 있습니다.

custom/[METRIC_NAME](예: custom/foo)을 검색하면 측정항목 탐색기에서 내보낸 측정항목을 확인할 수 있습니다.

애플리케이션에서 측정항목 내보내기

커스텀 측정항목을 만들어 애플리케이션 코드에서 직접 Stackdriver로 내보낼 수 있습니다. 자세한 내용은 Stackdriver 모니터링 설명서의 커스텀 측정항목 만들기를 참조하세요. Stackdriver의 커스텀 측정항목 자동 생성 기능을 활용할 수도 있습니다.

측정항목은 다음 요구 사항을 충족해야 합니다.

  • 측정항목 종류는 GAUGE여야 합니다
  • 측정항목 유형은 DOUBLE 또는 INT64가 될 수 있습니다.
  • 측정항목 이름은 custom.googleapis.com/ 프리픽스로 시작하고 그 뒤에 간단한 이름이 와야 합니다.
  • 리소스 유형은 "gke_container"여야 합니다.
  • 리소스 라벨에는 다음이 포함되어야 합니다.
    • 하향식 API를 통해 가져올 수 있는 Pod UID로 설정된 pod_id
    • container_name = ""
    • 애플리케이션이 메타데이터 서버에서 가져올 수 있는 project_id, zone, cluster_name. 값을 얻으려면 Google Cloud의 컴퓨팅 메타데이터 클라이언트를 사용하면 됩니다.
    • 임의의 값으로 설정할 수 있는 namespace_id, instance_id

다음 매니페스트 파일은 Stackdriver 클라이언트 라이브러리를 사용하여 측정항목을 내보내는 Go 애플리케이션의 단일 인스턴스를 실행하는 배포를 설명합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: custom-metric-sd
  name: custom-metric-sd
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: custom-metric-sd
  template:
    metadata:
      labels:
        run: custom-metric-sd
    spec:
      containers:
      - command: ["./direct-to-sd"]
        args: ["--metric-name=foo", "--metric-value=40", "--pod-id=$(POD_ID)"]
        image: gcr.io/google-samples/sd-dummy-exporter:latest
        name: sd-dummy-exporter
        resources:
          requests:
            cpu: 100m
        env:
          - name: POD_ID
            valueFrom:
              fieldRef:
                apiVersion: v1
                fieldPath: metadata.uid

Prometheus를 사용하여 내보내기

애플리케이션에서 측정항목을 Prometheus 형식으로 노출하고 Prometheus-to-Stackdriver 어댑터를 배포하면 측정항목을 스크레이프하여 Stackdriver로 내보낼 수 있습니다. 측정항목을 Prometheus 형식으로 노출하는 예는 Kubernetes 계측 가이드를 참조하세요.

측정항목은 다음 요구 사항을 충족해야 합니다.

  • 측정항목 유형은 Gauge여야 합니다
  • 측정항목 이름에 custom.googleapis.com 프리픽스가 포함되면 안 됩니다.

Prometheus-to-Stackdriver 어댑터를 측정항목을 내보낼 Pod의 컨테이너로 배포하고 다음 플래그를 컨테이너에 전달합니다.

  • pod-idnamespace-id: Downward API를 통해 가져온 Pod 및 네임스페이스 UID로 설정합니다.
  • source=http://localhost:[PORT], 여기서 [PORT]는 측정항목이 노출되는 포트입니다.
  • stackdriver-prefix=custom.googleapis.com

다음 매니페스트 파일은 Prometheus 클라이언트 라이브러리와 어댑터 컨테이너를 사용하여 측정항목을 노출하는 Go 애플리케이션이 포함된 포드를 설명합니다.

apiVersion: v1
kind: Pod
metadata:
  name: custom-metric-prometheus-sd
spec:
  containers:
  - command:
    - /bin/sh
    - -c
    - ./prometheus-dummy-exporter --metric-name=foo --metric-value=40 --port=8080
    image: gcr.io/google-samples/prometheus-dummy-exporter:latest
    imagePullPolicy: Always
    name: prometheus-dummy-exporter
    resources:
      requests:
        cpu: 100m
  - name: prometheus-to-sd
    image: gcr.io/google-containers/prometheus-to-sd:v0.2.3
    command:
    - /monitor
    - --source=:http://localhost:8080
    - --stackdriver-prefix=custom.googleapis.com
    - --pod-id=$(POD_ID)
    - --namespace-id=$(POD_NAMESPACE)
    env:
    - name: POD_ID
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: metadata.uid
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace

3단계: HorizontalPodAutoscaler 객체 만들기

측정항목을 Stackdriver로 내보낸 후 HPA를 배포하여 측정항목을 기반으로 배포를 확장할 수 있습니다.

다음 단계는 선택하는 측정항목 수집 및 내보내기 방법에 따라 달라집니다.

모든 포드의 측정항목에 기반한 자동 확장

HPA는 측정항목을 사용하여 평균을 계산하고 목표 평균 값과 비교합니다.

애플리케이션에서 Stackdriver로의 내보내기 예에서 배포는 측정항목을 내보내는 포드를 포함합니다. 다음 매니페스트 파일은 측정항목의 목표 평균 값에 기반하여 배포를 확장하는 HorizontalPodAutoscaler 객체를 설명합니다.

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: custom-metric-sd
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: custom-metric-sd
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Pods
    pods:
      metricName: foo
      targetAverageValue: 20

단일 포드의 측정항목에 기반한 자동 확장

HPA는 단일 포드에 의해 노출되는 값을 지정된 목표 값과 직접 비교합니다. 이 포드는 확장된 워크플로에 결합될 필요가 없습니다.

Prometheus에서 Stackdriver로의 내보내기 예에서는 단일 포드가 측정항목을 내보냅니다. 다음 매니페스트 파일은 배포와 측정항목의 목표 값을 기반으로 배포를 확장하는 HPA를 설명합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dummy-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      k8s-app: dummy-deployment
  template:
    metadata:
      labels:
        k8s-app: dummy-deployment
    spec:
      containers:
      - name: long
        image: busybox
        command: ["/bin/sh",  "-c", "sleep 180000000"]
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: dummy-deployment-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: dummy-deployment
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Object
    object:
      target:
        kind: Pod
        name: custom-metric-prometheus-sd
      metricName: foo
      targetValue: 20

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

다음 명령어를 실행하여 GKE 클러스터를 삭제합니다.

gcloud container clusters delete [CLUSTER_NAME]

문제해결

이 가이드에서 문제가 발생하면 다음 디버깅 단계를 수행합니다.

  1. kubectl api-versions를 실행하고 custom.metrics.k8s.io/v1beta1 API가 등록되어 있는지 확인합니다. 목록에 이 API가 표시되지 않으면 클러스터에서 커스텀 측정항목 어댑터(1단계에서 배포됨)가 실행 중인지 확인합니다.
  2. 측정항목 탐색기로 이동하여 커스텀 측정항목이 Stackdriver로 내보내지고 있는지 확인합니다. custom.googleapis.com/[NAME]으로 시작하는 측정항목을 찾습니다. 측정항목이 나열되지 않는 경우:

    • 내보내기 Deployment(2단계에서 배포됨)가 실행 중인지 확인합니다.
    • 노드의 서비스 계정을 --service-account로 맞춤설정한 경우, 모니터링 측정항목 작성자 IAM 역할(roles/monitoring.metricWriter)이 있는지 확인합니다.
    • 노드의 범위를 --scopes로 맞춤설정한 경우, 노드에 monitoring 범위가 있는지 확인합니다.
  3. kubectl describe hpa [DEPLOYMENT_NAME]을 실행하고 HPA가 커스텀 측정항목을 읽고 있는지 확인합니다. 오류가 표시되면 다음과 같이 합니다.

    • 확장된 Deployment(2단계에서 배포됨)가 실행 중인지 확인합니다.
    • 노드의 서비스 계정을 --service-account로 맞춤설정한 경우, 모니터링 뷰어 IAM 역할(roles/monitoring.viewer)이 있는지 확인합니다.

다음 단계

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

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

Kubernetes Engine 가이드