用 KEDA 按排队扩容 Worker,并用 GitLab 与 Argo CD 纳管工作负载

发布时间:2026/10/14 15:30:19

用 KEDA 按排队扩容 Worker,并用 GitLab 与 Argo CD 纳管工作负载 用 KEDA 按排队扩容 Worker并用 GitLab 与 Argo CD 纳管工作负载本文记录这一阶段在现网上的做法安装 KEDA 2.21.0让 Dify 的 worker 在 vLLM 排队超过 10 时扩到最多 3 个副本安装 Argo CD 3.5.4把llm、dify、observability的工作负载收进 GitLab CE 的私有仓库由 Application 自动同步。本章目录是cicd。机器是prod102地址10.0.1.47。集群、探针、GPU Operator 和 Vault 写在同级目录k8s-从零部署、k8s-迁移、k8s-探针与密钥。流程对照页是同目录的《走一遍 GitOpsKEDA、GitLab 和 Argo CD.html》。scripts/10、scripts/12、scripts/13发现现网已经装过就会停住。不要在这台机器上再执行一遍。scripts/11会短时间把 worker 扩到 3 再缩回 1复习时看记录即可。登录口令沿用现网值。Vault 根令牌、Langfuse 的NEXTAUTH_SECRET、SALT、ENCRYPTION_KEY、Redis 口令、MinIO 口令、kubeadm 加入令牌以及 Argo CD 仓库 Secret 里的个人访问令牌不写进本文。不要把本文发到公网。一、这三样各自做什么请求路径没有变浏览器打开 Dify对话从 Dify 到 New-API再到 vLLM 的qwen3.6-27b。这一阶段在这条路径旁边加了两层控制。1. KEDAKEDA 按外部指标修改 Deployment 的副本数。本机的指标来自 Prometheus查询是sum(vllm:num_requests_waiting{model_nameqwen3.6-27b})Prometheus 地址是http://prometheus.observability.svc.cluster.local:9090。threshold和activationThreshold都是10。排队人数小于或等于 10 时触发器不激活dify/worker保持 1 个副本。超过 10 之后期望副本是排队人数除以 10 再向上取整上限 3。伸缩对象是 worker不包括 vLLM也不包括worker-beat。KEDA 会创建 HPAkeda-hpa-dify-worker。副本下限已经是 1又没有空闲副本KEDA 提示pollingInterval和cooldownPeriod不参与伸缩改副本数的是这条 HPA。2. Argo CDArgo CD 把 Git 仓库里的 YAML 当成集群的期望状态。Applicationplatform盯着仓库的manifests目录发现差异就提交到集群。selfHeal为 true有人直接改集群时会拉回 Git 上的内容。prune为 falseGit 里没有的对象不会被删掉。dify/worker的/spec/replicas写在ignoreDifferences里。KEDA 把副本改成 2 或 3 时Argo CD 不会把它改回 Git 里的 1。3. GitLab CEGit 仓库放在 GitLab Community Edition 19.4.2。这是 GitLab 的开源版本。网页是http://10.0.1.47:8929登录root/R3po-Argo-2026。项目gitops/platform是私有的默认分支main。Argo CD 在集群内使用http://gitlab.gitlab.svc.cluster.local:8929/gitops/platform.git拉仓库的用户名是oauth2口令是个人访问令牌放在 Secretargocd/gitops-repo。令牌本身不写进本文。二、动手前现网是什么样vLLM、Dify、监控已经在跑环境变量已经由 Vault 和 External Secrets 同步。节点可分配的nvidia.com/gpu是 1。vLLM、Xinference 和宿主机 Python 都不申请这个资源。写 ScaledObject 和导出清单时没有改 vLLM 镜像没有给 vLLM 加上nvidia.com/gpu也没有重启 New-API。三、安装 KEDAHelm release 名keda命名空间kedachart 版本 2.21.0。三个镜像都在ghcr.dockerproxy.net/kedacore标签2.21.0拉取策略IfNotPresent。安装时三个 Pod 各重启过一次随后保持 1/1。config/scaledobject-dify-worker.yaml就是现网对象。scripts/10-安装KEDA.sh在 prod102 上发现 release 已存在会退出。四、模拟一次排队scripts/11-模拟排队扩容.sh把查询临时写成vector(25)并把 HPA 的扩容、缩容稳定窗口设为 0。worker 从 1 个就绪变成 3 个就绪。HPA 先显示25/10三个副本就绪后显示约8334m/10。脚本退出时把查询改回真实的sum()副本回到 1。vLLM 的/health保持 200。现网查询已经是真实的sum()。不要把vector(25)留在 ScaledObject 上。五、安装 Argo CD版本 v3.5.4。安装对象都在config/argocd-install.yaml这是官方install.yaml换过镜像之后的同一份大约 3.4 万行CRD 占了绝大部分。提交时用kubectl apply --server-side --force-conflicts因为客户端 apply 会在applicationsets.argoproj.io的注解长度上失败。镜像组件镜像argocdm.daocloud.io/quay.io/argoproj/argocd:v3.5.4dexghcr.dockerproxy.net/dexidp/dex:v2.45.1redisdocker.m.daocloud.io/redis:8.2.3-alpine上游清单里的imagePullPolicy: Always已改成IfNotPresent。argocd-cmd-params-cm里server.insecure为true。argocd-cm的调和超时是 30 秒对外地址是http://10.0.1.47:8080管理员账号允许登录。scripts/12-部署ArgoCD.sh看到argocd-server已在就会退出。网页不直接暴露 argocd-server。config/argocd-ui-proxy.yaml用 nginx 把节点8080转到argocd-server.argocd.svc.cluster.local:80。转发的头是 Host、X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Host。Deployment 策略是 Recreate同一时间只有一个 Pod 占用 8080。登录http://10.0.1.47:8080admin/Argocd-git-2026。这组账号的会话接口返回 200浏览器也能进入 Applications。六、把现有工作负载收进 Git导出程序是scripts/export_gitops.py。范围是三个命名空间里的 Deployment、Service、ExternalSecret、ScaledObject。Secret 不导出。对象上的 uid、resourceVersion、managedFields 和 status 会去掉。创建 Application 之前用 dry-run 对比过每个 Deployment 的 Pod 模板。模板一致第一次同步没有新建 Pod。vLLM 的 Pod 仍是vllm-67b8d8c9f6-vvfsquid26326358-d9a7-4eec-8b13-df4d800d2ae5。演示提交只改了导航页模板注解gitops.local/demonav-1。硬刷新后导航页 Pod 带上这行注解。导航页策略是 Recreate所以换的是导航页自己的 Pod。vLLM 没有换。/health仍是 200。作业里更换 vLLM 镜像那一步没有做。那两个标签和现网镜像对不上改镜像会重启正在服务的模型。scripts/13-纳管GitOps.sh看到 Applicationplatform已在就会退出。现网不要再跑它。config/argocd-app-platform.yamlapiVersion:argoproj.io/v1alpha1kind:Applicationmetadata:name:platformnamespace:argocdspec:project:defaultsource:repoURL:http://gitlab.gitlab.svc.cluster.local:8929/gitops/platform.gittargetRevision:mainpath:manifestsdirectory:recurse:truedestination:server:https://kubernetes.default.svcnamespace:defaultsyncPolicy:automated:prune:falseselfHeal:truesyncOptions:-ApplyOutOfSyncOnlytrue-RespectIgnoreDifferencestrueignoreDifferences:-group:appskind:Deploymentname:workernamespace:difyjsonPointers:-/spec/replicas七、GitLab CE镜像docker.m.daocloud.io/gitlab/gitlab-ce:19.4.2-ce.0。数据目录/usr/cluster/gitlab挂到容器的/var/opt/gitlab、/var/log/gitlab、/etc/gitlab。节点端口 8929。容器内 SSH 不对节点发布。捆绑 Prometheus 关闭。内存请求 4Gi上限 8Gi。/dev/shm用 512Mi 的内存卷。/-/readiness在这版、并且关闭捆绑监控之后返回 404。探针使用/users/sign_inHTTP 200 才算就绪。更新策略是 Recreate。GitLab 拒绝了含有产品名的初始口令。网页账号是root/R3po-Argo-2026。浏览器已经用这组账号打开gitops/platform。注册已关闭。仓库main上有两个提交当前修订e07c4aa6f11d5740bc1dd0759a0003d2b2d23814。Application 指向 GitLab 之后仍是 Synced、HealthyvLLM 的 uid 没有变。早先的 Gitea 工作负载已经删除。数据目录/usr/cluster/gitea还在磁盘上当前同步不读它。清单在config/gitlab.yaml。prod102 上 GitLab 已经在跑不要再提交一份会滚动它的安装。八、做完时的核对检查结果KEDAkeda-operator、metrics-apiserver、admission-webhooks 均为 1/1ScaledObjectReady 为 TrueActive 为 False查询为真实sum()worker副本 1就绪 1Argo CD各组件 1/1。platformSynced、Healthy修订e07c4aa仓库GitLab 集群内地址。登录页 HTTP 200代理argocd-ui-proxy策略 Recreate就绪 1vLLMuid26326358-d9a7-4eec-8b13-df4d800d2ae5/health为 200Gitea 命名空间已删除再看一眼kubectl-ndify get scaledobject dify-worker kubectl-ndify get deploy worker kubectl-nargocd get application platform kubectl-ngitlab get pods kubectl-nllm get pod-lappvllmcurl-s-o/dev/null-w%{http_code}\nhttp://127.0.0.1:8000/healthcurl-s-o/dev/null-w%{http_code}\nhttp://127.0.0.1:8080/curl-s-o/dev/null-w%{http_code}\nhttp://127.0.0.1:8929/users/sign_in九、文件文件作用config/keda-values.yamlKEDA 2.21.0 的镜像和副本数config/scaledobject-dify-worker.yaml现网 ScaledObject查询必须保持真实sum()scripts/10-安装KEDA.sh安装 KEDA 并提交 ScaledObject。release 已在时退出scripts/11-模拟排队扩容.sh用vector(25)扩到 3 再缩回 1结束时恢复真实查询config/argocd-install.yamlArgo CD 3.5.4 的安装清单。镜像、明文访问和对外地址已经写在里面config/argocd-ui-proxy.yaml节点 8080 到 argocd-server 的反代策略 Recreateconfig/argocd-app-platform.yamlApplicationplatform仓库指向 GitLabconfig/gitlab.yamlGitLab CE。数据在/usr/cluster/gitlab端口 8929scripts/12-部署ArgoCD.sh安装 Argo CD 3.5.4。server 已在时退出scripts/13-纳管GitOps.sh早期纳管步骤。Application 已在时退出现网不要再跑scripts/export_gitops.py导出 Deployment、Service、ExternalSecret、ScaledObject走一遍 GitOpsKEDA、GitLab 和 Argo CD.html按真实结果整理的流程说明
延伸阅读

更多相关文章

2026/10/14 15:30:19

我的C语言学习1 2026/10/3-202610/12

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //二维数组逆置 int main10() { int matrix[3][3] { {1,2,3}, {4,5,6}, {7,8,9} }; printf(“逆置前数组&#xff1a;\n”); for (int i 0;i < 3;i) { for (int j 0;j < 3;j) { printf(“%d”, matrix[i][j…

2026/10/14 15:30:19

ADS1263驱动实战:高精度ADC落地的物理级避坑指南

简介&#xff1a;本资源为嵌入式系统开发人员提供的ADS1263高精度ADC驱动开发套件&#xff0c;面向STM32平台&#xff08;含F1系列&#xff09;的硬件工程师与嵌入式软件开发者&#xff0c;解决24位Σ-Δ型模数转换器在工业传感、医疗测量等场景下的快速集成与底层控制难题。压…

2026/10/14 15:30:19

歌帝梵百年庆典:情感营销与品牌价值创新

1. 活动背景与品牌价值解析歌帝梵&#xff08;Godiva&#xff09;作为1926年创立于比利时布鲁塞尔的顶级巧克力品牌&#xff0c;今年迎来了其百年华诞。这个以高品质巧克力闻名全球的品牌&#xff0c;名字来源于传说中的"戈黛娃夫人"&#xff08;Lady Godiva&#xf…

2026/10/14 16:50:59

四方支付源码深度解析:从支付链路到二次开发实战

简介&#xff1a;四方支付源码是一套基于ThinkPHP框架开发的企业级PHP第三方API支付系统&#xff0c;面向需要快速接入支付宝、微信、银联等多种渠道的商家、平台运营方及二次开发人员。压缩包共2000个文件&#xff0c;以849个PHP核心程序文件为主&#xff0c;搭配HTML、JS、CS…

2026/10/14 16:50:59

软考中级备考指南:核心知识点与高效策略

1. 软考中级考试体系全景解读作为国内最具含金量的IT职业资格认证之一&#xff0c;软考中级&#xff08;简称"中项"&#xff09;的考试体系设计体现了对从业人员综合能力的全面考察。考试分为基础知识和应用技术两大科目&#xff0c;前者采用75道单项选择题的形式&am…

2026/10/14 16:50:59

中州养老项目源码实战:Spring Boot+Vue全栈工程拆解与二次开发

简介&#xff1a;这是一套基于若依框架开发的智慧养老后端管理系统可运行源码&#xff0c;面向需要学习若依开发平台、Spring BootVue3前后端分离项目以及物联网健康监测场景的Java开发者。项目覆盖入住智能评估、护理服务、微信小程序预约、智能检测等核心模块&#xff0c;并通…

2026/10/14 16:50:59

Java解析HJ212协议:CRC校验与动态因子映射实战

简介&#xff1a;本资源是一套基于Java实现的国标HJ212协议解析完整工程&#xff0c;面向环保监测系统开发工程师、Java后端开发者及物联网数据对接技术人员&#xff0c;解决污染源在线监控数据&#xff08;如COD、SO₂、NOₓ等污染物实时上报&#xff09;在Java服务端的标准化…

2026/10/14 16:50:59

Excel列宽同步问题解决方案与实现原理

1. 问题现象与背景分析最近在协助财务部门做数据迁移时&#xff0c;发现一个让人头疼的问题&#xff1a;当把本地Excel表格复制粘贴到服务器端的Web版Excel时&#xff0c;所有单元格内容都能正常传输&#xff0c;但表格列宽设置全部丢失。原本精心调整的报表布局变得一团糟&…

2026/10/14 16:45:58

PyTorch深度学习实战:从张量核心到模型训练与部署全解析

1. 从“调参侠”到“炼丹师”&#xff1a;PyTorch到底解决了什么问题先说个很实在的现象&#xff1a;现在随便翻开一份深度学习岗位的招聘JD&#xff0c;几乎都会带一句“熟悉PyTorch优先”。你问那些在工业界摸爬滚打了七八年的老工程师&#xff0c;框架选什么&#xff0c;十有…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”&#xff0c;而是它给出一段看起来合理的说明&#xff0c;程序却从中猜错优先级。通俗做法是&#xff1a;要求模型只交 JSON&#xff08;JavaScript Object Notation&#xff0c;轻量数据格式&#xff09;&#xff0c;再让代码验证它。Gem…

2026/10/13 17:09:18

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里&#xff0c;有A同学跑来问我&#xff1a;选什么毕设题目最稳妥&#xff0c;既能让评审老师觉得工作量够&#xff0c;又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友&#xff0c;在看完一堆“Hello World”和基础组件之后&#xff0c;大概率都会撞上同一堵墙&#xff1a;StatefulWidget 里那堆 initState、build、dispose 方法&#xff0c;到底什么时候被调用&#xff1f;为什么顺序是那样&#xff1f;在里面到…

2026/10/14 0:00:33

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:33

macOS/iOS高精度计时:mach_absolute_time原理与实战

1. 项目概述&#xff1a;为什么mach_absolute_time是 macOS/iOS 时间测量的“黄金标准”在 macOS 和 iOS 开发中&#xff0c;我见过太多人用CFAbsoluteTimeGetCurrent()或NSDate.timeIntervalSinceReferenceDate做性能打点&#xff0c;结果在高精度场景下被系统时钟跳变、NTP 同…

2026/10/14 0:00:33

SCORM课件演示与测试全解析:从API通信到自动化验证

简介&#xff1a;这是一套遵循SCORM标准的交互式课件演示与测试资源&#xff0c;面向E-Learning课程开发者、LMS平台测试人员及在线教学从业者&#xff0c;用于验证课件在不同学习管理系统中的识别、传递与跟踪能力。压缩包共28个文件&#xff0c;约12.07MB&#xff0c;以swf动…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑