GKE 워크로드 측정항목으로 배포 자동 확장

이 튜토리얼에서는 애플리케이션에서 내보낸 커스텀 측정항목(예: 적극적으로 로그인한 계정 수 또는 HTTP 요청 수)에 따라 Google Kubernetes Engine(GKE) 워크로드를 자동으로 확장하는 방법을 보여줍니다.

GKE 워크로드 측정항목 파이프라인을 사용하여 애플리케이션에서 내보낸 측정항목을 수집하고 Cloud Monitoring으로 전송한 다음 이 측정항목을 사용하여 수평형 포드 자동 확장 처리(HPA)를 지원합니다.

목표

이 튜토리얼에서는 다음 태스크를 다룹니다.

  1. Prometheus 스타일 측정항목을 생성하는 예시 애플리케이션을 배포하는 방법
  2. PodMonitor 리소스를 배포하여 애플리케이션에서 측정항목을 스크레이핑하고 Cloud Monitoring에 게시하는 방법
  3. 커스텀 측정항목 어댑터 배포 방법
  4. Kubernetes Custom Metrics API를 사용하여 워크로드 측정항목을 쿼리하는 방법
  5. 수평형 포드 자동 확장 처리(HPA) 리소스를 배포하여 애플리케이션에서 스크래핑한 워크로드 측정항목을 기준으로 애플리케이션을 확장하는 방법

시작하기 전에

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

이 튜토리얼에 사용되는 gcloud, kubectl 명령줄 도구가 사전 설치되어 있는 Cloud Shell을 사용하여 이 튜토리얼을 따르면 됩니다. Cloud Shell을 사용하는 경우 이러한 명령줄 도구를 워크스테이션에 설치할 필요가 없습니다.

Cloud Shell을 사용하려면 다음 안내를 따르세요.

  1. Google Cloud Console로 이동합니다.
  2. Cloud Console 창 상단의 Cloud Shell 활성화 셸 활성화 버튼 버튼을 클릭합니다.

    Cloud Console 하단의 새로운 프레임에서 Cloud Shell 세션이 열리고 명령줄 프롬프트가 표시됩니다.

    Cloud Shell 세션

환경 설정

  1. 워크로드 아이덴티티가 사용 설정된 새 클러스터를 만들려면 다음 명령어를 사용합니다.

    gcloud beta container clusters create CLUSTER_NAME \
        --project=PROJECT_ID \
        --zone=ZONE \
        --monitoring=SYSTEM,WORKLOAD
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 클러스터 이름입니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • ZONE: 가장 가까운 영역을 선택합니다.

    이 작업에는 프로젝트에 대한 container.clusters.create 권한이 필요합니다.

  2. 기존 Standard 또는 Autopilot 클러스터에서 워크로드 측정항목을 사용 설정하려면 다음 명령어로 클러스터를 수정합니다.

    gcloud beta container clusters update CLUSTER_NAME \
        --project=PROJECT_ID \
        --zone=ZONE \
        --monitoring=SYSTEM,WORKLOAD
    

Prometheus 스타일 측정항목을 내보내는 애플리케이션 배포

이 튜토리얼의 애플리케이션 코드가 포함된 저장소를 다운로드합니다.

  git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
  cd kubernetes-engine-samples/workload-metrics

이 튜토리얼의 예시 애플리케이션은 두 개의 측정항목을 생성하고 localhost:1234/metrics에 내장된 Prometheus 엔드포인트를 통해 노출합니다.

  • example_requests_total: 애플리케이션 폴링에서 생성된 요청 카운터
  • example_random_numbers: 무작위로 생성된 숫자의 히스토그램

저장소에는 애플리케이션을 클러스터에 배포하기 위한 Kubernetes 매니페스트가 포함됩니다.

# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: workload-metrics
  name: workload-metrics
  namespace: gke-workload-metrics
spec:
  selector:
    matchLabels:
      app: workload-metrics
  template:
    metadata:
      labels:
        app: workload-metrics
    spec:
      containers:
      - image: us-docker.pkg.dev/google-samples/containers/workload-metrics:1.0
        imagePullPolicy: Always
        name: workload-metrics
        ports:
        - name: metrics-port
          containerPort: 1234
        command:
        - "/workload-metrics"
        - "--process-metrics"
        - "--go-metrics"
클러스터에 애플리케이션을 배포합니다.

  kubectl create namespace gke-workload-metrics
  kubectl apply -f manifests/workload-metrics-deployment.yaml

애플리케이션이 배포될 때까지 잠시 기다린 후 모든 포드가 Ready 상태에 도달합니다.

  kubectl -n gke-workload-metrics get pods

결과:

  NAME                                READY   STATUS    RESTARTS   AGE
  workload-metrics-74fb6c56df-9djq7   1/1     Running   0          1m

예시 애플리케이션에서 측정항목을 스크래핑하는 PodMonitor 리소스 배포

예시 애플리케이션에서 내보낸 측정항목을 수집하려면 PodMonitor 커스텀 리소스를 만들어야 합니다.

저장소에는 PodMonitor를 클러스터에 배포하기 위한 Kubernetes 매니페스트가 포함됩니다.

# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Note that this PodMonitor is in the monitoring.gke.io domain,
# rather than the monitoring.coreos.com domain used with the
# Prometheus Operator
apiVersion: monitoring.gke.io/v1alpha1
kind: PodMonitor
metadata:
  name: workload-metrics-podmon
# spec describes how to monitor a set of pods in a cluster.
spec:
  # namespaceSelector determines which namespace is searched for pods. Required
  namespaceSelector:
    matchNames:
    - gke-workload-metrics
  # selector determines which pods are monitored.  Required
  # This example matches pods with the `app: workload-metrics-example` label
  selector:
    matchLabels:
      app: workload-metrics
  podMetricsEndpoints:
    # port is the name of the port of the container to be scraped.
  - port: metrics-port
    # path is the path of the endpoint to be scraped.
    # Default /metrics
    path: /metrics
    # scheme is the scheme of the endpoint to be scraped.
    # Default http
    scheme: http
    # interval is the time interval at which metrics should
    # be scraped. Default 60s
    interval: 20s
클러스터에 PodMonitor을 배포합니다.

  kubectl apply -f manifests/workload-metrics-podmon.yaml

커스텀 측정항목 어댑터 배포

커스텀 측정항목 어댑터를 사용하면 클러스터에서 Monitoring으로 측정항목을 보내고 받을 수 있습니다.

  1. 사용자에게 필수 승인 역할을 만들 수 있는 권한을 부여합니다.

    kubectl create clusterrolebinding cluster-admin-binding \
        --clusterrole cluster-admin --user "$(gcloud config get-value account)"
    
  2. Autopilot 클러스터 또는 워크로드 아이덴티티사용 설정된 클러스터를 사용하는 경우 다음을 수행합니다.

    1. 어댑터의 네임스페이스를 만듭니다.

      kubectl create namespace custom-metrics
      
    2. 어댑터의 Kubernetes 서비스 계정을 만듭니다.

      kubectl create serviceaccount --namespace custom-metrics \
      custom-metrics-stackdriver-adapter
      
    3. Monitoring 측정항목을 볼 수 있는 권한이 있는 Google 서비스 계정을 만듭니다.

      gcloud iam service-accounts create GSA_NAME
      
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
          --role "roles/monitoring.viewer"
      

      다음을 바꿉니다.

      • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
      • GSA_NAME: Google 서비스 계정의 이름입니다.
    4. IAM 정책 바인딩을 만들어 Kubernetes 서비스 계정이 Google 서비스 계정을 가장하도록 허용합니다.

      gcloud iam service-accounts add-iam-policy-binding \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]" \
        GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
      
    5. Kubernetes 서비스 계정에 주석을 달아 바인딩을 표시합니다.

      kubectl annotate serviceaccount \
        --namespace custom-metrics custom-metrics-stackdriver-adapter \
        iam.gke.io/gcp-service-account=GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
      
  3. 클러스터에 새 리소스 모델 어댑터를 배포합니다.

    kubectl apply -f manifests/adapter_new_resource_model.yaml
    
  4. 커스텀 측정항목 어댑터가 배포되었고 Ready 상태인지 확인합니다.

    kubectl -n custom-metrics get pods
    

    결과:

    NAME                                                 READY   STATUS    RESTARTS   AGE
    custom-metrics-stackdriver-adapter-6d4fc94699-zqndq  1/1     Running   0          2m
    

Kubernetes Custom Metrics API를 사용한 워크로드 측정항목 쿼리

Kubernetes Custom Metrics API를 사용하여 워크로드 측정항목이 GKE에 표시되는지 확인할 수 있습니다.

GKE 워크로드 측정항목은 프리픽스 workload.googleapis.com가 있는 Monitoring으로 내보내집니다. Kubernetes 커스텀 측정항목 API 서버는 측정항목 경로에서 / 문자를 지원하지 않으므로 모든 / 문자를 |로 바꿔야 합니다. 따라서 측정항목 이름에 workload.googleapis.com|example_request_total를 사용해야 합니다.

애플리케이션 측정항목이 Monitoring으로 전송될 때까지 잠시 기다린 후 다음 명령어를 실행하여 workload.googleapis.com|example_request_total 측정항목을 쿼리합니다.

   kubectl get --raw  \
   "/apis/custom.metrics.k8s.io/v1beta2/namespaces/gke-workload-metrics/pods/*/workload.googleapis.com|example_requests_total"

결과:

  {"kind":"MetricValueList","apiVersion":"custom.metrics.k8s.io/v1beta2",
  "metadata":{"selfLink":"/apis/custom.metrics.k8s.io/v1beta2/namespaces/
  gke-workload-metrics/pods/%2A/workload.googleapis.com%7Cexample_requests_total"},
  "items":[{"describedObject":{"kind":"Pod","namespace":"gke-workload-metrics",
  "name":"prom-example-74fb6c56df-9djq7","apiVersion":"/__internal"},"metric":
  {"name":"workload.googleapis.com|example_requests_total","selector":null},"timestamp ":
  "2021-08-23T10:48:45Z","value":"1199m"}]}

HorizontalPodAutoscaler 객체 배포

이전 단계에서 Custom Metrics API의 응답 페이로드에 workload.googleapis.com|example_requests_total 측정항목이 표시되면 수평형 포드 자동 확장 처리(HPA)를 배포하여 해당 측정항목을 기준으로 배포 크기를 조절할 수 있습니다.

저장소에는 HPA를 클러스터에 배포하기 위한 Kubernetes 매니페스트가 포함됩니다.

# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: workload-metrics-hpa
  namespace: gke-workload-metrics
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: workload-metrics
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Pods
    pods:
      metric:
        name: workload.googleapis.com|example_requests_total
      target:
        type: AverageValue
        averageValue: 1
이 HPA는 최소 포드 복제본을 1로, 최댓값을 5로 설정합니다. 모든 포드의 workload.googleapis.com|example_request_total 평균 값이 1이 되도록 배포를 확장합니다.

클러스터에 HorizontalPodAutoscaler을 배포합니다.

  kubectl apply -f manifests/workload-metrics-hpa.yaml

HorizontalPodAutoscaler 확장 관찰

다음 명령어를 실행하여 배포의 복제본 수를 주기적으로 확인하고 복제본 5개로 확장되는 것을 확인할 수 있습니다.

  kubectl -n gke-workload-metrics get pods

결과:

  NAME                                READY   STATUS    RESTARTS   AGE
  workload-metrics-74fb6c56df-9djq7   1/1     Running   0          5m
  workload-metrics-74fb6c56df-frzbv   1/1     Running   0          7m
  workload-metrics-74fb6c56df-h26rw   1/1     Running   0          8m
  workload-metrics-74fb6c56df-kwvx9   1/1     Running   0          10m
  workload-metrics-74fb6c56df-vvtnn   1/1     Running   0          11m

다음 명령어를 실행하여 수평형 포드 자동 확장 처리의 상태와 활동을 검사할 수도 있습니다.

  kubectl -n gke-workload-metrics describe hpa workload-metrics-hpa

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

다음 단계