CDK8S를 사용하는 코드로서의 Keda ScaledObject

추상적인



  • keda은 Kubernetes Event-driven Autoscaling이며 현재 현명하게 사용되고 있습니다. 이 블로그에서는 CDK8S typescript를 사용하여 Keda scaledobject CRD를 코드로 생성하는 방법을 제공합니다.
  • Keda CRD를 가져오고 CDK8S를 사용하면 TypeScript와 같은 친숙한 프로그래밍 언어를 배율로 사용하여 Keda 배율 개체를 만들 수 있습니다.

  • 목차


  • Pre-requisite
  • Overview of Keda
  • Import Keda CRDs
  • Write code
  • Build keda scaledobjects from code
  • Apply and test
  • Conclusion



  • 🚀 전제 조건

  • Install typescript, node, and cdk8s as well as projen (optional) which is a tool of managing project configuration as code.
  • Getting started with cdk8s

  • 🚀 케다 개요


  • KEDA는 Horizontal Pod Autoscaler와 같은 표준 Kubernetes 구성 요소와 함께 작동하며 덮어쓰거나 복제하지 않고 기능을 확장할 수 있습니다.
  • KEDA는 Scaledobject 내에서 여러 트리거를 지원합니다. 각 트리거는 메트릭으로 분할되어 노출되며 HPA 컨트롤러는 모든 메트릭 간에 MAX를 수행합니다.

  • 🚀 Keda CRD 가져오기

    • Keda does not provide its CRDs separately so we can found the manifest in GH release section. Here I import the current latest version of keda v2.8.0 and out the imports folder in src/imports
      ⚡ $ cdk8s import https://github.com/kedacore/keda/releases/download/v2.8.0/keda-2.8.0.yaml --output src/imports/
      ------------------------------------------------------------------------------------------------
      A new version 2.0.88 of cdk8s-cli is available (current 2.0.13).
      Run "npm install -g cdk8s-cli" to install the latest version on your system.
      For additional installation methods, see https://cdk8s.io/docs/latest/getting-started
      ------------------------------------------------------------------------------------------------
      Importing resources, this may take a few moments...
      keda.sh
        keda.sh/clustertriggerauthentication
        keda.sh/scaledjob
        keda.sh/scaledobject
        keda.sh/triggerauthentication
    
    • Import result
      ⚡ $ tree src/imports/
      src/imports/
      └── keda.sh.ts
    
      0 directories, 1 file
    

    🚀 코드 작성

    • Overview of keda scaledObjects in this post

  • Typescript 언어로 KEDA scaledobject를 작성하는 시각적 코드를 사용하는 것이 훨씬 더 편리합니다. 문서를 읽고 KEDA CRD의 구성, 개체 및 속성에 대한 모든 참조를 찾을 수 있습니다
  • .
  • 이 블로그에서는 Apache 기류 작업자 구성 요소용 scaledObject(SO)를 만드는 사용 사례를 제공합니다. SO에 3개의 트리거(스케일러)가 포함되어 있습니다
  • .

    1. 크론 - 크론 일정에 따라 애플리케이션을 확장합니다.


  • Airflow 서버에서 예약된 파이프라인과 작업자 구성 요소는 그 때 확장되지만 노드를 시작하고 노드를 클러스터에 가입하고 포드를 준비하는 데 시간이 걸리므로(약 2-3분) cron을 사용하여 작업자를 사전 확장합니다

  • 2. PostgreSQL - PostgreSQL 쿼리를 기반으로 애플리케이션을 확장합니다.


  • 이 스케일러는 확장 작업에 대한 쿼리 명령의 출력을 기반으로 합니다. 여기서는 예약된 파이프라인(예: 보고서 실행)에 속하는 실행/대기 중인 공기 흐름 작업 인스턴스의 수를 계산합니다. 개수를 Airflow 작업자 동시성으로 나눕니다(예: 기본값은 16)
  • targetQueryValue: '1.5' - 위의 계산 결과를 이 대상 값으로 나누어 확장할 포드 수를 결정합니다
  • .

    3. CPU - CPU 메트릭스를 기반으로 애플리케이션 확장



  • CPU 사용률이 80%보다 높을 때 작업자 프로비저닝을 보장하므로 선택 사항입니다.
  • PostgreSQL Scaler는 데이터베이스를 쿼리하기 위해 airflow 사용자의 암호를 제공해야 합니다TriggerAuthentication. 자격 증명은 airflow-secret 네임스페이스 내의 K8S 비밀airflow에서 가져옵니다.


  •     const pgAuth = new TriggerAuthentication(this, 'KedaPostgresAuthentication', {
          metadata: {
            name: 'keda-airflow-postgresql-auth',
            namespace: 'airflow',
          },
          spec: {
            secretTargetRef: [{
              parameter: 'password',
              name: 'airflow-secret',
              key: 'postgresql-password',
            }],
          },
        });
    


  • 일부 SO 사양은 알아야 합니다.
  • pollingInterval : 각 트리거를 확인하는 간격입니다. 기본적으로 KEDA는 30초마다 모든 ScaledObject의 각 트리거 소스를 확인합니다. 따라서 공기 흐름 데이터베이스에 대한 쿼리 연결/워크로드를 줄이려면 이 값을 관리해야 합니다.
  • cooldownPeriod : 자원을 다시 0으로 조정하기 전에 마지막 트리거가 활성으로 보고된 후 대기하는 기간입니다.


  • 🚀 코드에서 keda scaledobjects 빌드

    • Source code:
      ⚡ $ tree src/
      src/
      ├── imports
      │   └── keda.sh.ts
      ├── keda-airflow.ts
      └── main.ts
    
      1 directory, 3 files
    
    • Build resource
      ⚡ $ npx projen build
      👾 build » default | ts-node --project tsconfig.dev.json .projenrc.ts
      👾 build » compile | tsc --build
      👾 build » post-compile » synth | cdk8s synth
      No manifests synthesized
      👾 build » test | jest --passWithNoTests --all --updateSnapshot
      No tests found, exiting with code 0
      ----------|---------|----------|---------|---------|-------------------
      File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
      ----------|---------|----------|---------|---------|-------------------
      All files |       0 |        0 |       0 |       0 |
      ----------|---------|----------|---------|---------|-------------------
      👾 build » test » eslint | eslint --ext .ts,.tsx --fix --no-error-on-unmatched-pattern src test build-tools projenrc .projenrc.ts
    
    • Manifest yaml file
      ⚡ $ tree dist/
      dist/
      └── keda
          └── airflow-keda-so.yaml
    
      1 directory, 1 file
    

    🚀 신청 및 테스트


  • 매니페스트 적용 및 결과 확인

  •   # k apply -f
    
      # k get so -n airflow
      NAME               SCALETARGETKIND       SCALETARGETNAME   MIN   MAX   TRIGGERS   AUTHENTICATION                 READY   ACTIVE   FALLBACK   AGE
      airflow-worker-1   apps/v1.StatefulSet   airflow-worker    2     12    cron       keda-airflow-postgresql-auth   True    True     False      2d21h
    
      # k get hpa -n airflow
      NAME                        REFERENCE                    TARGETS                                  MINPODS   MAXPODS   REPLICAS   AGE
      keda-hpa-airflow-worker-1   StatefulSet/airflow-worker   500m/1 (avg), 500m/1 (avg) + 2 more...   2         12        2          2d21h
    


    🚀 결론

    • Within the Scaledobject class, you can jump to definition to understand the meaning of each properties and also know which required/optional attributes.
    • We can create a custom construct and base on that to provision multiple KEDA scaledobjects with customize specs/meta such as min/max/desired replicas, triggers, trigger authentication, etc.

    좋은 웹페이지 즐겨찾기