KEDA在Azure AKS中无法缩容及相关扩缩容问题咨询
KEDA ScaledJob 用于Azure DevOps代理的问题解决
问题1:混合代理池下的误扩容控制
当代理池同时包含VM和Docker代理时,KEDA默认会基于整个池的待处理任务(pending jobs)计算扩容需求,但未区分代理是否能处理对应任务(比如VM代理不具备Docker运行环境),导致误扩容。可以通过以下配置调整:
- 添加触发器的
agentDemands参数:在Azure Pipelines触发器的metadata中加入agentDemands,匹配Docker代理的专属标识(比如代理注册时设置的docker标签,或流水线要求的docker能力)。这样KEDA只会针对需要Docker代理的待处理任务计算扩容需求,避免因VM代理无法处理任务而误启动新的Docker代理Job。示例修改:
triggers: - type: azure-pipelines metadata: poolID: "xxx" organizationURLFromEnv: "AZP_URL" personalAccessTokenFromEnv: "AZP_TOKEN" agentDemands: "docker" # 替换为你的Docker代理的专属标识/需求 pendingJobsThreshold: "1" # 仅当待处理任务数超过1时触发扩容
- 设置
minReplicaCount为0:确保没有待处理任务时,不会保留空闲的Docker代理Job。 - 调整
pollingInterval:适当调长(如60秒),避免短时间内重复触发扩容判断,减少误触发概率。
问题2:Job无法自动缩容(清理)
ScaledJob的缩容逻辑是不再创建新Job,现有Job需在任务完成后自动退出并被清理。你的问题大概率是代理容器未正常退出,可通过以下方式解决:
- 给代理添加
--once启动参数:在容器的启动命令中加入--once,让Azure DevOps代理处理完一次任务后自动注销并退出,Job会变为Completed状态,随后根据你设置的successfulJobsHistoryLimit自动清理。修改容器配置:
containers: - name: azdevops-agent-job image: vstsimage imagePullPolicy: Always command: ["/bin/bash", "-c"] args: ["./start.sh --once"] # 添加--once参数 env: - name: AZP_URL value: [MYAZPURL] # ... 其他环境变量和挂载配置
- 检查PVC占用:确保挂载的PVC没有被进程占用导致容器无法退出,若流水线不需要跨任务保留数据,可改用临时存储替代持久化PVC。
问题3:删除ScaledJob后代理条目未从Azure DevOps池移除
Azure DevOps不会自动删除已注册的代理,除非代理主动注销或被检测为离线超过阈值。解决方式:
- 代理退出时主动注销:通过
--once参数让代理在任务完成后自动注销(如问题2的配置),这样代理退出时会向Azure DevOps发送注销请求,池中的对应条目会被移除。 - 配置Azure DevOps代理池的自动清理规则:在Azure DevOps代理池的设置中,开启"自动移除离线代理",设置离线时长阈值(比如1小时),超过该时长的离线代理会被自动清理。
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

