Open6
AKS で KEDA を使ってイベントドリブンのオートスケールを試す
目的
- KEDA の動きを理解したい
- 実際に AKS だとどんな動きするの?Kubernetes と同じなのか
参考記事
Kubernetes Event-driven Autoscaling (KEDA) アドオン (プレビュー) を使用したアプリケーションの自動スケーリングの簡略化
やること
- AKS の準備
- KEDA のデプロイ
- 何でスケールさせる?
- 実施してみる
準備
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
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
何でスケールさせるか
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 のサンプルを動かしてみることにする
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
アプリのデプロイ
以下の 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 になっている。