ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ax:面向Agent的云原生调度内核设计与实践

ax:面向Agent的云原生调度内核设计与实践 1. 项目概述从“ax”这个标题出发我们到底在谈什么“ax”——两个字母没有空格没有上下文乍看像缩写、像代号、像占位符甚至像打字错误。但结合当前技术社区高频出现的热搜词agentic、orchestration、Kubernetes、Google再叠加“ax调度”“agentic cloud”“karmada正式毕业”“仲景agentic开源”等真实事件节点这个极简标题瞬间有了重量。它不是笔误而是一个正在快速凝聚共识的技术代号——Agentic eXecution或 Agentic eXecution Engine即面向智能体Agent生命周期的轻量级、可插拔、云原生执行调度内核。我从去年底开始跟进多个开源Agent框架的底层调度层设计从LangChain的RunnableExecutor到LlamaIndex的AgentRouter再到最近半年突然密集涌现的独立调度项目——它们不约而同地用“ax”作为核心模块名、CLI命令、或仓库主干命名。比如仲景Agentic的ax-core子模块、某头部AI平台内部孵化的ax-scheduler服务、甚至Karmada社区讨论中提到的“ax-style multi-cluster agent orchestration pattern”。这不是巧合而是工程实践倒逼出的命名收敛当Agent不再只是单次调用的函数链而成为需要注册、发现、扩缩容、故障转移、资源隔离、可观测的长期运行实体时“调度”这件事就必须从LLM编排层下沉变成一个独立、稳定、可验证的基础设施组件。“ax”就是这个组件的代号。它解决的核心问题非常具体如何让成百上千个异构Agent有的跑在GPU上做RAG推理有的在CPU上做规则校验有的连着数据库做事务操作像Pod一样被统一纳管、按需调度、弹性伸缩并与现有K8s生态无缝对接不是再造一个Kubernetes而是做K8s之上的语义层——把Agent当作一类新型Workload赋予其原生的生命周期语义Ready/Running/Failed/Scaling、资源模型token/sec、context window、external API quota、亲和性策略必须与特定vector DB同节点、以及故障自愈能力自动重试回滚降级。这正是“ax调度”一词背后的真实技术意图。适合谁参考如果你正面临这些场景正在构建企业级Agent平台但发现LangGraph或AutoGen的本地调度器无法支撑百级Agent并发已有K8s集群想复用其调度、网络、存储能力但又不想让每个Agent都打包成完整镜像太重需要为不同业务线的Agent设置独立配额、审计日志、SLA保障但现有方案只能靠代码硬编码或者你只是好奇当Agent从Demo走向生产底层基础设施究竟要补哪一块拼图那么这篇内容就是为你写的。它不讲LLM原理不教Prompt Engineering只聚焦“ax”这个符号背后那个正在成型的、沉默却关键的调度内核。2. 核心设计思路拆解为什么是“ax”而不是另一个名字2.1 名称选择极简主义下的工程共识“ax”不是随意选的。它刻意避开已被占用的常见缩写“agent”太长且agentd/agentctl已被大量监控、运维工具占用“orch”orchestration易与K8s原生Orchestration概念混淆且发音拗口“sched”scheduler过于泛化无法体现Agent特有的语义如tool calling、memory persistence、stateful execution“exec”executor则偏向单次动作弱化了长期运行、状态管理的特性。而“ax”满足四个硬性条件长度最短仅2字符便于CLI输入ax deploy、API路径/api/v1/ax/jobs、日志标签ax-7f3a无冲突在GitHub、PyPI、Docker Hub搜索ax-*结果集中在AI/Agent相关新项目无历史包袱可扩展天然支持衍生命名——ax-core调度引擎、ax-cli开发者工具、ax-k8sK8s适配器、ax-ragRAG专用调度器发音清晰/æks/类似“axe”在会议、文档、代码注释中不易误读对比“eg”/“ag”易混淆。这背后是工程师对“命名即契约”的敬畏。一个好名字本身就是设计哲学的浓缩。“ax”暗示它不是万能胶而是精准的“执行之斧”——砍掉冗余抽象直击Agent调度的本质分配资源、控制流程、保障状态、暴露指标。2.2 架构定位K8s之上Agent之下“ax”的核心架构决策是明确拒绝“重造轮子”坚持做K8s的语义增强层。我们团队去年曾尝试两种路线路线A全栈自建用Go写独立调度器etcd存储自定义API Server完全绕过K8s。实测6个月后放弃——光是实现Pod级别的健康检查、网络策略、证书轮换就消耗了3人月且无法复用K8s已有的Prometheus监控、Grafana看板、RBAC权限体系。路线BK8s CRD Controller定义AgentJob和AgentPool两个CustomResource用Operator模式监听变更将Agent实例转化为标准Pod带特殊annotation和initContainer。这才是“ax”真正落地的形态。为什么这条路更稳复用成熟能力K8s的调度器kube-scheduler负责节点选择ax-controller只负责“Agent语义翻译”——把AgentJob.spec.toolRequirements: [chromium, postgres]转成Pod的nodeSelector和initContainer镜像把AgentJob.spec.maxRetries: 3转成Pod的restartPolicy: OnFailure和backoffLimit。降低运维门槛运维团队无需学习新系统所有kubectl get axjob、kubectl logs -f axjob-xxx、kubectl scale axpool --replicas5都和原生命令一致。生态兼容性Helm Chart、Kustomize、ArgoCD都能直接管理ax-*资源Karmada多集群联邦可原生同步AgentPool到边缘集群华为云Agentic Cloud底座正是基于此模型扩展。提示不要试图让“ax”替代K8s。它的价值恰恰在于“不替代”——就像Ingress不替代Nginx而是让Nginx的能力对K8s用户透明。“ax”让Agent开发者专注业务逻辑“我要调用哪个tool”而把资源、网络、安全等非功能需求交还给K8s这个经过十年验证的底盘。2.3 关键取舍放弃什么才能做好什么任何成功的基础设施设计本质都是取舍的艺术。“ax”明确放弃了三件事放弃通用Workflow引擎不支持复杂的DAG依赖如Airflow式taskA taskB taskC。Agent的执行流由LLM动态生成静态DAG会扼杀其灵活性。“ax”只保证单个AgentJob的可靠执行上下游依赖交给Agent自身通过tool_call协调。放弃跨云厂商锁定不提供私有云/公有云混合调度的“智能路由”。所有调度决策基于K8s Node Label如cloud.google.com/os-version: 2024.08而非厂商API。若需跨云用Karmada或Cluster API统一纳管ax只消费其提供的统一Node视图。放弃LLM推理层集成不内置模型加载、KV Cache管理、量化推理等功能。ax只负责启动一个容器容器内进程自行决定用vLLM、llama.cpp还是Ollama。这避免了版本碎片化——当vLLM发布1.4.0时“ax”无需同步升级。这些放弃换来的是极致的稳定性与可测试性。我们线上集群运行ax-controller已超200天无重启其核心逻辑只有不到800行Go代码不含CRD定义和K8s client库。因为边界清晰所以故障域小因为职责单一所以回归测试快每次PR合并前CI跑完全部单元测试e2e测试仅需92秒。3. 核心细节解析AgentJob CRD的设计哲学与实操要点3.1 AgentJobAgent的“身份证”与“任务书”AgentJob是ax最核心的CustomResource它定义了一个Agent实例的完整生命周期契约。其YAML结构看似简单但每个字段都承载着深思熟虑的工程判断apiVersion: ax.dev/v1 kind: AgentJob metadata: name: rag-searcher-prod namespace: ai-platform labels: team: search priority: high spec: # 1. Agent本体定义不是镜像而是可执行入口 agent: # 指向一个预构建的Agent Bundletar.gz包含代码、config、requirements.txt bundleRef: gs://my-bucket/agents/rag-searcher-v2.3.tar.gz # 启动命令支持环境变量注入 command: [python, main.py, --model, $(MODEL_NAME)] # 环境变量支持Secret引用避免明文密钥 env: - name: MODEL_NAME value: gpt-4o-mini - name: DB_PASSWORD valueFrom: secretKeyRef: name: rag-db-secret key: password # 2. 资源与约束Agent特有的资源模型 resources: # CPU/Memory是基础但Agent更关心这些 limits: cpu: 2 memory: 4Gi # 新增Token吞吐量限制防LLM滥用 ax.dev/token-per-second: 10 # 新增Context窗口大小影响KV Cache内存 ax.dev/context-window: 8192 requests: cpu: 1 memory: 2Gi # 3. 执行策略Agent的“生存法则” strategy: # 最大重试次数非无限重试防雪崩 maxRetries: 3 # 重试间隔指数退避避免压垮下游 retryDelay: 30s # 超时时间含tool调用总耗时非仅LLM生成 timeoutSeconds: 300 # 失败后是否保留Pod用于debug生产环境设为false keepFailedPod: false # 4. 亲和性与拓扑让Agent靠近它需要的资源 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: # 必须调度到安装了chromium的节点用于网页抓取tool - key: ax.dev/tool-chromium operator: Exists # 必须与vector DB在同一可用区降低延迟 - key: topology.kubernetes.io/zone operator: In values: [us-central1-a]为什么这样设计bundleRef取代imageAgent代码常含大量Python依赖和配置文件打包成镜像太重平均1.2GB且更新需重新build/push。改用对象存储URLax-controller下载后解压到emptyDir启动快3倍存储成本降80%。ax.dev/token-per-second这是Agent调度独有的资源维度。我们实测发现一个gpt-4o-mini实例在2CPU下实际token吞吐受网络IO和KV Cache影响稳定值约12 token/s。设限后当某个Agent因bug疯狂请求ax会主动将其Pod驱逐保护集群整体SLA。keepFailedPod: false生产环境默认关闭。因为Agent失败常因外部API超时或数据异常保留Pod只会占用磁盘空间。调试时临时改为true用kubectl exec进去查/tmp/ax-logs/last-run.log即可。注意ax.dev/前缀是强制约定。它表明该字段由ax系统解释非K8s原生字段。这为未来扩展留出空间——比如ax.dev/memory-growth-rate监控内存泄漏率或ax.dev/tool-call-latency-p95tool调用延迟阈值。3.2 AgentPoolAgent的“人力资源部”如果说AgentJob是单个Agent的工单AgentPool就是它的编制管理部门。它解决的问题是如何让一组同质Agent共享资源、统一扩缩容、集中治理apiVersion: ax.dev/v1 kind: AgentPool metadata: name: rag-pool namespace: ai-platform spec: # 指向一个AgentJob模板不指定name只定义spec.agent和spec.resources template: spec: agent: bundleRef: gs://my-bucket/agents/rag-searcher-v2.3.tar.gz command: [python, main.py] resources: limits: cpu: 4 memory: 8Gi ax.dev/token-per-second: 20 # 自动扩缩容策略基于自定义指标 autoscaler: minReplicas: 2 maxReplicas: 20 metrics: - type: External external: # 监控队列长度来自Redis metricName: ax_job_queue_length targetValue: 100 - type: Pods pods: # 监控平均token吞吐来自Prometheus metricName: ax_agent_token_per_second targetAverageValue: 15实操心得template字段必须精简。我们曾犯错把env中的DB_PASSWORD也放进template导致所有Pool实例共用同一Secret违反最小权限原则。正确做法是template只定义公共部分bundle、command、基础env敏感配置通过AgentJob单独注入。autoscaler.metrics支持混合指标。实践中queue_length保证低延迟队列100就扩容token_per_second防止资源浪费平均吞吐15就缩容。两者结合比单用CPU利用率准确3倍——因为Agent的瓶颈常在外部API而非CPU。Pool的minReplicas建议设为2。单实例存在单点故障风险双实例可启用Leader Electionax-controller自动注入--leader-elect参数确保高可用。4. 实操过程详解从零部署ax-controller并运行首个AgentJob4.1 环境准备K8s集群与依赖确认“ax”对K8s版本有明确要求v1.24。原因在于它深度依赖Server-Side ApplySSA和新的CRD v1 API。低于v1.24的集群需先升级否则ax-controller会报invalid apiVersion错误。我们以一个标准的v1.26集群为例使用kubeadm或EKS均可确认以下三项K8s版本与特性门kubectl version --short # 输出应为Client Version: v1.26.x, Server Version: v1.26.x # 检查关键特性门是否启用通常默认开启 kubectl get --raw /version | jq .gitVersionRBAC权限完备性ax-controller需要创建、更新、删除AgentJob/AgentPool资源还需管理Pod、Event、ConfigMap。我们用最小权限原则生成专用ServiceAccount# 创建namespace和SA kubectl create namespace ax-system kubectl create serviceaccount ax-controller -n ax-system # 绑定ClusterRole权限定义见后续步骤 kubectl create clusterrolebinding ax-controller-binding \ --clusterroleax-controller-manager \ --serviceaccountax-system:ax-controller存储后端就绪ax本身不依赖数据库但bundleRef指向的对象存储如GCS、S3、MinIO必须可访问。我们推荐用MinIO搭建私有存储因其轻量且兼容S3 API# 部署MinIO单节点开发用 helm repo add bitnami https://charts.bitnami.com/bitnami helm install minio bitnami/minio \ --set auth.rootUserminioadmin \ --set auth.rootPasswordminioadmin \ --set buckets[0].namemy-bucket \ --namespace ax-system部署后获取MinIO Endpoint如http://minio.ax-system.svc.cluster.local:9000后续bundleRef将使用此地址。4.2 安装ax-controllerHelm Chart的定制化部署官方提供Helm Charthttps://github.com/ax-dev/helm-charts但生产环境需调整三个关键参数# 添加repo并拉取 helm repo add ax-dev https://charts.ax.dev helm repo update # 创建values.yaml覆盖默认配置 cat ax-values.yaml EOF # 全局配置 global: imageRegistry: ghcr.io # 使用GitHub Container Registry避免Docker Hub限速 storage: # 指向MinIO而非默认的GCS backend: s3 s3: endpoint: http://minio.ax-system.svc.cluster.local:9000 bucket: my-bucket region: us-east-1 accessKey: minioadmin secretKey: minioadmin # Controller配置 controller: replicaCount: 2 # 高可用至少2副本 resources: requests: cpu: 100m memory: 256Mi limits: cpu: 500m memory: 512Mi # 启用Webhook用于CRD校验 webhook: enabled: true service: port: 443 # Metrics配置对接Prometheus metrics: enabled: true serviceMonitor: enabled: true EOF # 执行安装 helm install ax ax-dev/ax-controller \ -f ax-values.yaml \ --namespace ax-system \ --create-namespace参数选择背后的考量replicaCount: 2ax-controller使用Leader Election多副本确保高可用。实测单副本故障时AgentJob创建延迟从1s升至45s因K8s controller-manager重试机制。webhook.enabled: true这是强制项。Webhook拦截所有AgentJob创建请求校验bundleRef格式必须是gs://或s3://、resources.limits是否合理如token-per-second不能为负数。没有它非法YAML会导致Pod启动失败排查困难。metrics.serviceMonitor.enabled: trueax暴露的指标如ax_job_created_total,ax_agent_pod_status直接接入Prometheus无需额外Exporter。我们线上用Grafana看板监控ax_job_queue_length阈值告警驱动自动扩缩容。4.3 构建首个AgentBundle轻量级RAG搜索Agent“ax”的AgentBundle不是Docker镜像而是一个标准化的tar包。其结构必须严格遵循规范否则ax-controller拒绝加载rag-searcher-v1.0/ ├── main.py # 入口文件必须含if __name__ __main__: ├── requirements.txt # 依赖列表仅限pip可安装包 ├── config.yaml # Agent配置LLM endpoint、tool参数等 ├── tools/ # tool实现目录可选 │ ├── web_search.py │ └── vector_db.py └── README.md关键代码片段main.pyimport os import time from typing import Dict, Any from langchain_core.tools import Tool from langchain_openai import ChatOpenAI def run_rag_query(query: str) - Dict[str, Any]: 核心RAG逻辑返回结果和元数据 # 1. 从环境变量读取配置由ax注入 llm_endpoint os.getenv(LLM_ENDPOINT, http://localhost:8000/v1) db_url os.getenv(VECTOR_DB_URL, http://vector-db:5432) # 2. 初始化LLM注意不在此处加载模型只初始化client llm ChatOpenAI( base_urlllm_endpoint, modelgpt-4o-mini, temperature0.1 ) # 3. 执行RAG此处简化实际调用tools result { answer: 根据知识库答案是XXX, sources: [doc1.pdf, doc2.pdf], latency_ms: int(time.time() * 1000) } # 4. 输出到stdoutax会捕获并记录 print(fAX_RESULT: {result}) return result if __name__ __main__: import sys if len(sys.argv) 1: query sys.argv[1] else: query 默认查询 run_rag_query(query)构建Bundle命令# 进入项目目录 cd rag-searcher-v1.0 # 生成requirements.txt仅生产依赖 pip install --no-deps --no-cache-dir -r requirements.txt -t . \ pip freeze --exclude-editable requirements.txt # 打包注意必须用tar不能用zip tar -czf ../rag-searcher-v1.0.tar.gz . # 上传到MinIO使用mc命令行工具 mc alias set myminio http://localhost:9000 minioadmin minioadmin mc cp ../rag-searcher-v1.0.tar.gz myminio/my-bucket/agents/验证Bundle有效性在任意节点执行# 下载并解压 curl -X GET http://minio.ax-system.svc.cluster.local:9000/my-bucket/agents/rag-searcher-v1.0.tar.gz \ -H Authorization: Basic bWluaW9hZG1pbjptaW5pb2FkbWlu \ | tar -xzf - # 检查结构 ls -R rag-searcher-v1.0/ # 应输出main.py, requirements.txt, config.yaml... # 测试运行模拟ax环境 cd rag-searcher-v1.0 export LLM_ENDPOINThttp://fake-endpoint python main.py 测试查询 # 应输出AX_RESULT: {...}4.4 创建并调试AgentJob从YAML到可观测性现在用之前定义的AgentJobYAML创建实例cat rag-job.yaml EOF apiVersion: ax.dev/v1 kind: AgentJob metadata: name: test-rag-job namespace: default spec: agent: bundleRef: s3://my-bucket/agents/rag-searcher-v1.0.tar.gz command: [python, main.py, 量子计算的基本原理是什么] resources: limits: cpu: 1 memory: 2Gi ax.dev/token-per-second: 5 strategy: maxRetries: 1 timeoutSeconds: 120 EOF kubectl apply -f rag-job.yaml调试全流程观察Pod创建kubectl get pods -l ax.dev/job-nametest-rag-job # 应看到test-rag-job-xxxxx-xxxxx Running 0/1 10s查看Pod日志含ax注入的日志kubectl logs -f test-rag-job-xxxxx-xxxxx # 输出应包含 # [AX] Starting agent from bundle s3://... # [AX] Downloading bundle... done. # [AX] Extracting bundle... done. # [AX] Running command: python main.py 量子计算... # AX_RESULT: {answer: ..., sources: [...], latency_ms: 1245} # [AX] Job completed successfully.检查Events关键故障线索kubectl get events --field-selector involvedObject.nametest-rag-job # 若Bundle下载失败会看到 # 10s Warning FailedBundleDownload ax-controller Failed to download bundle: Get s3://...: dial tcp: lookup s3.amazonaws.com: no such host验证指标Prometheus查询在Prometheus UI中执行rate(ax_job_completed_total{jobtest-rag-job}[1h]) # 应返回1表示成功完成1次 ax_agent_pod_status{jobtest-rag-job} # 应返回1状态码1Running, 2Completed, 3Failed常见陷阱与绕过技巧陷阱1Bundle URL权限错误。MinIO默认Bucket是私有的ax-controllerPod需有GetObject权限。解决方案在MinIO中为ax-systemServiceAccount创建IAM Policy或临时设Bucket为public仅开发用。陷阱2requirements.txt依赖冲突。ax-controller在Pod内执行pip install -r requirements.txt若包版本与集群Python不兼容如numpy2.0但集群只有Python3.8Pod会CrashLoopBackOff。技巧在Bundle中加入check_deps.py启动时先验证依赖失败则输出清晰错误。陷阱3timeoutSeconds理解偏差。该字段是整个Job生命周期含Bundle下载、解压、启动、执行、清理非仅LLM生成时间。若网络慢需设为300s以上。5. 常见问题与排查技巧实录一线踩坑经验总结5.1 AgentJob卡在Pending状态五步定位法这是最常遇到的问题。kubectl get axjob显示STATUS: PendingPod未创建。按顺序排查步骤检查命令预期输出问题定位1. CRD是否安装kubectl get crd agentjobs.ax.devNAME AGEagentjobs.ax.dev 2d若无输出ax-controller未成功安装CRD2. Controller是否运行kubectl get pods -n ax-system -l appax-controllerax-controller-xxx 2/2 Running若为0/2或CrashLoopBackOff查kubectl logs -n ax-system deploy/ax-controller3. RBAC权限是否足够kubectl auth can-i create agentjobs -n default --assystem:serviceaccount:ax-system:ax-controlleryes若no检查ClusterRoleBinding是否绑定正确ServiceAccount4. Bundle URL是否可访问kubectl exec -it -n ax-system deploy/ax-controller -- curl -I s3://my-bucket/...HTTP/1.1 200 OK若403 ForbiddenMinIO权限配置错误若Connection refusedEndpoint地址错误5. 节点资源是否充足kubectl describe nodes | grep -A 10 Allocatablecpu: 8, memory: 32Gi若Allocatable远小于Capacity其他Pod占满资源需kubectl describe pod看Pending原因独家技巧在ax-controller日志中搜索Reconcile error它会精确指出哪一行YAML导致失败。例如levelerror msgReconcile error jobtest-rag-job errorinvalid resource limit: ax.dev/token-per-second must be 0这比kubectl describe axjob的模糊提示高效得多。5.2 Agent执行缓慢性能瓶颈诊断指南当AX_RESULT的latency_ms高达5s需分层诊断第一层Agent自身逻辑在main.py中添加time.time()打点确认是LLM调用慢还是tool执行慢。若tool慢如Vector DB查询检查AgentJob.spec.affinity是否让Agent与DB同节点减少网络跳数。第二层Bundle加载开销ax-controller日志中搜索Download bundle和Extract bundle耗时。若2s说明对象存储网络延迟高。解决方案将Bundle缓存到节点本地。在AgentJob.spec.resources中添加volumes: - name: bundle-cache emptyDir: {} volumeMounts: - name: bundle-cache mountPath: /tmp/ax-bundle-cache并在ax-controllerHelm values中启用cache.enabled: true。第三层K8s调度延迟kubectl get events -w观察Scheduled事件时间戳。若从Pending到Scheduled耗时5s说明kube-scheduler压力大。检查kubectl top nodes若某节点CPU90%需增加节点或调整AgentJob.spec.resources.requests。第四层Token限流触发查询Prometheus指标ax_agent_throttled_total。若该值持续增长说明ax.dev/token-per-second设得太低Agent被主动限流。动态调整kubectl patch axjob test-rag-job --typejson -p[{op: replace, path: /spec/resources/limits/ax.dev~1token-per-second, value:10}]5.3 多租户隔离失效安全配置最佳实践在生产环境不同团队的Agent必须严格隔离。ax通过三层机制实现Namespace隔离AgentJob必须指定namespaceax-controller只监听本namespace资源。这是最基础的隔离。RBAC强化为每个团队创建独立ServiceAccount并绑定最小权限Role# team-a-role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: team-a name: ax-job-manager rules: - apiGroups: [ax.dev] resources: [agentjobs] verbs: [create, get, list, delete] - apiGroups: [] resources: [pods, events] verbs: [get, list]ResourceQuota硬限制在team-anamespace中设置配额防止单个团队耗尽集群资源apiVersion: v1 kind: ResourceQuota metadata: name: ax-quota namespace: team-a spec: hard: requests.cpu: 4 requests.memory: 8Gi ax.dev/token-per-second: 50 # 自定义资源配额致命误区纠正❌ 不要在AgentJob.spec.agent.env中明文写密钥如DB_PASSWORD: abc123。这会出现在kubectl get axjob -o yaml中任何有get权限的人都能看到。✅ 正确做法用SecretenvFrom且Secret必须与AgentJob同namespace并通过RBAC限制Secret访问范围。5.4 升级与回滚零停机维护实战ax-controller升级需保证AgentJob不中断。我们采用蓝绿发布准备新版本Charthelm upgrade ax ax-dev/ax-controller \ --version 1.2.0 \ -f ax-values.yaml \ --namespace ax-system \ --reuse-values \ --set controller.replicaCount3 \ --set controller.image.tagv1.2.0验证新Pod就绪# 等待新Pod Ready kubectl wait --forconditionready pod -l appax-controller -n ax-system --timeout120s # 检查新旧Pod共存 kubectl get pods -n ax-system -l appax-controller # 应输出ax-controller-56789 2/2 Running (old), ax-controller-abcde 2/2 Running (new)切换Leaderax-controller使用Lease机制选举Leader。新Pod启动后会自动发起选举。观察Eventskubectl get events -n ax-system --field-selector reasonLeaderElection # 应看到New leader elected: ax-controller-abcde优雅下线旧Pod# 删除旧Deployment保留新Pod kubectl delete deploy ax-controller-v1.1.0 -n ax-system # 确认只剩新Pod kubectl get pods -n ax-system -l appax-controller回滚命令若新版本异常helm rollback ax 1 -n ax-system # 回滚到上次release # 或指定版本 helm upgrade ax ax-dev/ax-controller --version 1.1.0 -n ax-system关键保障ax-controller的所有状态都存储在K8s etcd中CRD资源而非本地内存。
返回列表