[K8S] 設定 Keda 依據 Azure storage queue 的大小,來調整 deployment replica 數量
最近在改同事的程式,
看要怎麼用 Keda 來自動依據 Azure Storage Queue 的大小,
來調整 K8S pod replica 的數量,
就來簡單記錄一下吧~
下面是一個 K8S deployment,
我在裡面多加了一個環境變數
STORAGE_ACCOUNT_CONN_STR
STORAGE_ACCOUNT_CONN_STR
,
用來儲存存取 Storage account 需要用到的 connection string:
apiVersion: apps/v1
kind: Deployment
metadata:
name: adapter
labels:
app: adapter
namespace: {{ .Release.Namespace }}
spec:
replicas: 1
selector:
matchLabels:
app: adapter
template:
metadata:
labels:
app: adapter
spec:
containers:
- name: adapter
image: {{ .Values.appAcr.prefix }}/{{ .Values.images.agent }}
env:
- name: STORAGE_ACCOUNT_CONN_STR
value: "{{ .Values.storageAccount.connString }}"
command:
- bash
args:
- /entry_point.sh
apiVersion: apps/v1
kind: Deployment
metadata:
name: adapter
labels:
app: adapter
namespace: {{ .Release.Namespace }}
spec:
replicas: 1
selector:
matchLabels:
app: adapter
template:
metadata:
labels:
app: adapter
spec:
containers:
- name: adapter
image: {{ .Values.appAcr.prefix }}/{{ .Values.images.agent }}
env:
- name: STORAGE_ACCOUNT_CONN_STR
value: "{{ .Values.storageAccount.connString }}"
command:
- bash
args:
- /entry_point.sh
apiVersion: apps/v1 kind: Deployment metadata: name: adapter labels: app: adapter namespace: {{ .Release.Namespace }} spec: replicas: 1 selector: matchLabels: app: adapter template: metadata: labels: app: adapter spec: containers: - name: adapter image: {{ .Values.appAcr.prefix }}/{{ .Values.images.agent }} env: - name: STORAGE_ACCOUNT_CONN_STR value: "{{ .Values.storageAccount.connString }}" command: - bash args: - /entry_point.sh
有了這個環境變數,Keda 的
ScaledObject
ScaledObject
就可以取得 storage queue 的資訊,
進而根據 storage queue 的大小,來調整 replica 了。
- scaleTargetRef: 指定要調整的是 adapter 這個 deployment
- minReplicaCount/maxReplicaCount: 可伸縮的最小與最大 replica 數量
- triggers: 觸發的方式
- type: azure-queue 代表 Azure storage queue
- queueName: queue 的名稱
- queueLength: queue 在多大時要擴展
- connectionFromEnv: 要從哪個環境變數中取得 storage account connection string
- accountName: storage account 的名稱
- cloud: 這邊用 Private 是因為這是 Azure Stack Hub 的環境
- endpointSuffix: 在 private cloud 時需要指定 queue 的 url 後綴
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: adapter-sco
namespace: {{ .Release.Namespace }}
spec:
scaleTargetRef:
name: adapter
pollingInterval: 30
cooldownPeriod: 300
minReplicaCount: 1
maxReplicaCount: 6
triggers:
- type: azure-queue
metadata:
queueName: "{{ .Values.storageAccount.queueName }}"
queueLength: "50"
connectionFromEnv: STORAGE_ACCOUNT_CONN_STR
accountName: "{{ .Values.storageAccount.name }}"
cloud: Private
endpointSuffix: "queue.{{ .Values.ashFqdn }}"
- type: cpu
metadata:
type: Utilization
value: "80"
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: adapter-sco
namespace: {{ .Release.Namespace }}
spec:
scaleTargetRef:
name: adapter
pollingInterval: 30
cooldownPeriod: 300
minReplicaCount: 1
maxReplicaCount: 6
triggers:
- type: azure-queue
metadata:
queueName: "{{ .Values.storageAccount.queueName }}"
queueLength: "50"
connectionFromEnv: STORAGE_ACCOUNT_CONN_STR
accountName: "{{ .Values.storageAccount.name }}"
cloud: Private
endpointSuffix: "queue.{{ .Values.ashFqdn }}"
- type: cpu
metadata:
type: Utilization
value: "80"
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: adapter-sco namespace: {{ .Release.Namespace }} spec: scaleTargetRef: name: adapter pollingInterval: 30 cooldownPeriod: 300 minReplicaCount: 1 maxReplicaCount: 6 triggers: - type: azure-queue metadata: queueName: "{{ .Values.storageAccount.queueName }}" queueLength: "50" connectionFromEnv: STORAGE_ACCOUNT_CONN_STR accountName: "{{ .Values.storageAccount.name }}" cloud: Private endpointSuffix: "queue.{{ .Values.ashFqdn }}" - type: cpu metadata: type: Utilization value: "80"
這樣子就設定完成囉~
參考資料:
(本頁面已被瀏覽過 201 次)