Open6

AKS で KEDA を使ってイベントドリブンのオートスケールを試す

mihohoimihohoi

準備

aks-preview で拡張機能をインストール

AKS で拡張機能を使うために機能をインストールする

% az extension add --upgrade --name aks-preview
Extension 'aks-preview' 0.5.106 is already installed.
It will be updated if available.

AKS-KedaPreview 機能フラグを登録する

KEDA を使用するには、サブスクリプションで AKS-KedaPreview 機能フラグを有効にする必要がある。

% az feature register --name AKS-KedaPreview --namespace Microsoft.ContainerService
Once the feature 'AKS-KedaPreview' is registered, invoking 'az provider register -n Microsoft.ContainerService' is required to get the change propagated
{
  "id": "/subscriptions/xxxxxxxxxxxx/providers/Microsoft.Features/providers/Microsoft.ContainerService/features/AKS-KedaPreview",
  "name": "Microsoft.ContainerService/AKS-KedaPreview",
  "properties": {
    "state": "Registering"
  },
  "type": "Microsoft.Features/providers/features"
}

確認する

% az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/AKS-KedaPreview')].{Name:name,State:properties.state}"
Name                                        State
------------------------------------------  -----------
Microsoft.ContainerService/AKS-KedaPreview  Registering
mihohoimihohoi

KEDA アドオンをインストールする

既存の AKS に KEDA アドオンをインストールする

 % az aks update -g dev-public-AKS -n dev-public-aks01 --enable-keda
Argument '--enable-keda' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
The behavior of this command has been altered by the following extension: aks-preview
{
<中略>
  "workloadAutoScalerProfile": {
    "keda": {
      "enabled": true
    },
    "verticalPodAutoscaler": null
  }
}

アップデートされた情報の中にkedaが有効になっていることが確認できた。

show コマンドでも確認できるっぽい

% az aks show -g dev-public-AKS -n dev-public-aks01 --query "workloadAutoScalerProfile.keda.enabled"
The behavior of this command has been altered by the following extension: aks-preview
true

AKS でも KEDA がインストールされていることを確認できる

% kubectl get pods -n kube-system
NAME                                              READY   STATUS    RESTARTS   AGE
<省略>
keda-operator-5996f7cdfc-jtxm5                    1/1     Running   0          5m41s
keda-operator-metrics-apiserver-97f9f66d5-hk8zg   1/1     Running   0          5m41s

KEDA のバージョンは以下でも確認できるが、出力が長いので割愛

kubectl get crd/scaledobjects.keda.sh -o yaml
mihohoimihohoi

何でスケールさせるか

Azure サービスには次のスケーラーが利用される

  • Azure Application Insights
  • Azure Blob Storage
  • Azure Data Explorer
  • Azure Event Hubs
  • Azure Log Analytics
  • Azure Monitor
  • Azure Pipelines
  • Azure Service Bus
  • Azure Storage キュー

MS Learn のサンプルを動かしてみることにする

mihohoimihohoi

MS Learn

実施する MS Learn はここ

Azure for Redis を構築する

事前準備のために、Azure 上に Redis を構築しておく。

REDIS_NAME=redis-contoso-video-$RANDOM

az redis create --location $LOCATION --name $REDIS_NAME --resource-group $RESOURCE_GROUP --sku Basic --vm-size c0 --enable-non-ssl-port

REDIS_HOST=$(az redis show -n $REDIS_NAME -g $RESOURCE_GROUP -o tsv --query "hostName")
REDIS_KEY=$(az redis list-keys --name $REDIS_NAME --resource-group $RESOURCE_GROUP -o tsv --query "primaryKey")

Redis でリストを作成する

docker run して、ローカル環境から作成した Redis へ接続する

% docker run -it --rm redis redis-cli -h $REDIS_HOST -a $REDIS_KEY
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
redis-contoso-video-15276.redis.cache.windows.net:6379>

リストとランダムの項目を作成

redis-contoso-video-15276.redis.cache.windows.net:6379> lpush keda Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eget interdum felis, ac ultricies nulla. Fusce vehicula mattis laoreet. Quisque facilisis bibendum dui, at scelerisque nulla hendrerit sed. Sed rutrum augue arcu, id maximus felis sollicitudin eget. Curabitur non libero rhoncus, pellentesque orci a, tincidunt sapien. Suspendisse laoreet vulputate sagittis. Vivamus ac magna lacus. Etiam sagittis facilisis dictum. Phasellus faucibus sagittis libero, ac semper lorem commodo in. Quisque tortor lorem, sollicitudin non odio sit amet, finibus molestie eros. Proin aliquam laoreet eros, sed dapibus tortor euismod quis. Maecenas sed viverra sem, at porta sapien. Sed sollicitudin arcu leo, vitae elementum
redis-contoso-video-15276.redis.cache.windows.net:6379> llen keda
(integer) 100
mihohoimihohoi

アプリのデプロイ

以下の Deployment を作成する

apiVersion: apps/v1
kind: Deployment
metadata:
  name: contoso-microservice
spec:
  replicas: 1                   # Here we are telling K8S the number of containers to process the Redis list items
  selector:                     # Define the wrapping strategy
    matchLabels:                # Match all pods with the defined labels
      app: contoso-microservice # Labels follow the `name: value` template
  template:                     # This is the template of the pod inside the Deployment
    metadata:
      labels:
        app: contoso-microservice
    spec:
      containers:
        - image: mcr.microsoft.com/mslearn/samples/redis-client:latest
          name: contoso-microservice
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 100m
              memory: 128Mi
          env:
            - name: REDIS_HOST
              value: "redis-contoso-video-XXXX.redis.cache.windows.net" # *** REPLACE with your value ***
            - name: REDIS_PORT
              value: "6379"                                        # *** REPLACE with your value ***
            - name: REDIS_LIST
              value: "keda"                                        # *** REPLACE with your value ***
            - name: REDIS_KEY
              value: "XXXXXXXXXXXXX"  # *** REPLACE with your value ***

作成完了

% kubectl get pods
NAME                                    READY   STATUS    RESTARTS   AGE
contoso-microservice-745b5655c5-7795g   1/1     Running   0          4m27s

KEDA: Deployment 用のマニフェスト作成

マニフェストを作成する。

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: scaled-contoso
spec:
  scaleTargetRef:
    apiVersion: apps/v1                             # Optional. Default: apps/v1
    kind: deployment                                # Optional. Default: Deployment
    name: contoso-microservice                      # Mandatory. Must be in the same namespace as the ScaledObject
    envSourceContainerName: contoso-microservice    # Optional. Default: .spec.template.spec.containers[0]
  pollingInterval: 30                               # Optional. Default: 30 seconds
  cooldownPeriod:  120                              # Optional. Default: 300 seconds
  minReplicaCount: 0                                # Optional. Default: 0
  maxReplicaCount: 20                               # Optional. Default: 100
  advanced:                                         # Optional. Section to specify advanced options
    restoreToOriginalReplicaCount: false            # Optional. Default: false
    horizontalPodAutoscalerConfig:                  # Optional. Section to specify HPA related options
      behavior:                                     # Optional. Use to modify HPA's scaling behavior
        scaleDown:
          stabilizationWindowSeconds: 300
          policies:
          - type: Percent
            value: 100
            periodSeconds: 15
  triggers:
  - type: redis
    metadata:
      # address:                  # Format must be host:port
      passwordFromEnv: REDIS_KEY
      listName: keda              # Required
      listLength: "10"            # Required
      enableTLS: "false"          # optional
      databaseIndex: "0"          # optional
      hostFromEnv: REDIS_HOST
      portFromEnv: REDIS_PORT

稼働確認

pod が増えていることがわかる(元々は1つ)
Redis で試すので、作成したリストと項目は減っていく、llen keda を実施して 10 以下であれば再度リストを作成する。

% kubectl get pods -w
NAME                                    READY   STATUS    RESTARTS   AGE
contoso-microservice-745b5655c5-6mmsz   1/1     Running   0          2m13s
contoso-microservice-745b5655c5-76bm5   1/1     Running   0          12s
contoso-microservice-745b5655c5-98jlz   1/1     Running   0          27s
contoso-microservice-745b5655c5-cxm84   1/1     Running   0          27s
contoso-microservice-745b5655c5-gb94p   0/1     Pending   0          12s
contoso-microservice-745b5655c5-gdch5   0/1     Pending   0          12s
contoso-microservice-745b5655c5-st7j7   1/1     Running   0          27s
contoso-microservice-745b5655c5-t59c4   1/1     Running   0          27s

しばらくすると Pod 数が 0 になっている。