标签 Kubernetes 下的文章

一、核心配置结构说明

containerd 2.x 对镜像仓库配置进行了结构化优化,所有相关配置均集中在 /etc/containerd/certs.d/ 目录下,遵循 "一仓库一目录" 的配置原则:

  • 每个镜像仓库(registry)对应一个独立目录,目录名需与仓库域名(或 IP 地址)完全一致
  • 每个目录下必须包含一个 hosts.toml 文件,用于定义仓库连接参数
  • hosts.toml 核心配置项:仓库服务地址(server)、操作权限(capabilities)、认证信息(auth)、证书验证开关(skip\_verify)

二、分步配置实战

1. 版本确认

首先通过以下命令验证 containerd 版本是否为 2.x 系列:

\\\[root@k8s-master ~]# containerd --version
containerd containerd.io v2.2.0 1c4457e00facac03ce1d75f7b6777a7a851e5c41

2. 创建配置目录

根据 Harbor 仓库地址创建对应的配置目录,目录名需与仓库域名(或 IP)严格匹配(示例中 Harbor 仓库地址为 harbor.liyb.com):

mkdir -p /etc/containerd/certs.d/harbor.liyb.com
注意:若仓库未使用域名(直接通过 IP 访问),可直接以 IP 地址作为目录名(如 /etc/containerd/certs.d/192.168.1.100

3. 编写 hosts.toml 配置文件

创建并编辑 hosts.toml 文件,配置仓库连接参数:

vi /etc/containerd/certs.d/harbor.liyb.com/hosts.toml

添加如下配置内容:

server = "https://harbor.liyb.com"

\\\[host."https://harbor.liyb.com"]
capabilities = \\\["pull", "resolve", "push"]  # 支持的操作:拉取、解析、推送
skip\\\_verify = true  # 自签名证书时启用(跳过证书验证)
\\\[host."https://harbor.liyb.com".auth]
username = "admin"  # Harbor 登录用户名
password = "Harbor12345"  # Harbor 登录密码

配置说明:

  • 若使用企业级可信证书,无需设置 skip\\\_verify = true,只需将 CA 证书文件放置到对应配置目录(如 /etc/containerd/certs.d/harbor.liyb.com/)即可
  • 权限配置可根据实际需求调整,例如仅需拉取镜像时可改为 capabilities = \\\["pull", "resolve"]

4. 确认主配置文件路径

检查 containerd 主配置文件 /etc/containerd/config.toml 中是否正确指定了仓库配置路径,确保以下配置项存在且无误:

toml

# /etc/containerd/config.toml
\\\[plugins."io.containerd.grpc.v1.cri".registry]
config\\\_path = "/etc/containerd/certs.d"  # 仓库配置目录路径(默认已启用)
注意:containerd 2.x 默认启用该配置,但生产环境部署时务必手动校验,避免路径配置错误导致配置失效

三、配置验证方法

1. 使用 nerdctl 验证(推荐)

通过 nerdctl 工具拉取 Harbor 仓库镜像,验证配置是否生效:

nerdctl pull harbor.liyb.com/prod/nginx:1.27

成功输出示例:

plaintext

harbor.liyb.com/prod/nginx:1.27: manifest-sha256:114dff0fc8ee3d0200c3a12c60e3e2b79d0920dd953175ecb78a0b157425b25e: done
config-sha256:1e5f3c5b981a9f91ca91cf13ce87c2eedfc7a083f4f279552084dd08fc477512: done
elapsed: 0.1 s
total: 0.0 B (0.0 B/s)

2. Kubernetes 节点验证

在 Kubernetes 节点上通过 crictl 工具拉取镜像(适用于 K8s 集群环境):

crictl pull harbor.liyb.com/prod/nginx:1.27
关键注意点:镜像名称必须显式包含 Harbor 仓库地址(完整格式:仓库地址 / 项目名 / 镜像名:标签),否则会导致 K8s Pod 拉取镜像失败

四、高频踩坑与解决方案

image.png

当 Andrew Harmel-Law 邀请演讲者参加 QCon 伦敦大会时,他首先想到的是:“让 Diana 和 Cat 一起登台!”这完全是出于一种顽皮的冲动。

 

Cat Morris 是一位产品经理。Diana Montalion 是一位系统架构师。我们都专门从事软件系统和平台开发。我们都把对方视为我们所有痛苦的根源。不是个人层面的,我们从未一起工作过,但我们都认为对方所代表的角色是问题所在。

 

但我们也致力于改善我们的工作方式。如果我们能够消除我们之间存在的摩擦……那对每个人来说都是一件好事,对吧?

 

首先,我们对参与的每一个重大项目做了建模分析。我们发现,每一个项目的结局都像泰坦尼克号一样:撞上了冰山。

 

我们发现了以下这些改变职业生涯的真相:

 

  • 我们的工作有很多重合的地方。

  • 我们需要彼此。合作会带来更好的结果。我们思考问题的方式不同但互补。

  • 我们要解决的不是技术问题。技术挑战不难解决。困难之处在于消除摩擦。

 

摩擦是阻碍变革的无形暗流。摩擦并非孤立存在的,而是一个系统性问题,其来源是人、团队与技术之间的关系。解决之道不在于 Kubernetes、云计算或人工智能,而在于改变我们的思维模式、沟通方式和组织架构。

 

本文描述了在每一个项目中都会反复出现的六种摩擦:

 

  • 反直觉行为

  • 拒绝改变

  • 效率与控制

  • 产品与技术角色之间相互指责

  • 线性管道思维

  • 交付能力不足

 

每一种摩擦都让我们忙于重写相同的代码库或重绘相同的组织结构图。摩擦导致很多无益于我们避开冰山的工作浪费。这篇文章将帮助你弄清楚如何应对这些问题。

 

反直觉行为

 

我们怪错了对象。因此,我们做错了事情。

 

反直觉行为,由系统科学家 Jay Forrester 定义,是指复杂的社会和管理系统倾向于用让问题变得更糟糕的解决方案来应对问题。例如,为一个处于后期的项目增派更多的工程师,加快项目进度。

 

面对系统性挑战时,我们人类会倾向于指责他人。遗憾的是,我们怪错了对象。我们责怪工程团队工作效率低下,或者断定是因为团队太小,却未能意识到甘特图不过是虚构的简化模型,它过度简化了复杂的动态过程。

 

“任何系统的输出结果都是其内在设计的必然产物‌。”——W. Edwards Deming

 

当我们改变一个系统的运作方式时,我们也需要改变塑造系统的底层模式、结构和心智模型。例如,不是在本已臃肿的数据库上放上 GraphQL 就能称之为图,而是需要重新构建我们思考数据的方式。我们需要创建异步事件,而不是把什么都塞进管道,我们需要创建反馈循环,让我们能及时知道数据在跨系统移动时出现了异常。

 

这可以解释为什么工程师们会工作到很晚。他们一边忙着给猪涂口红,一边又要完成甘特图上没有预料到的工作。

 

解决之道:理解系统

 

反直觉行为具有引力,会将我们吸入其中,卷入漩涡。至少,我们的感受是这样:感觉像是在行动,在前进,而实际情况是,我们就像烘干机里的衣物,在原地打转。自始至终,我们都是从同一个狭小的视角凝视问题。

 

解决方法是暂时停下来,找准方向再行动。

 

首先是确定核心领域。系统的目标是什么?对于联邦快递来说,是快速递送包裹。很可能,你所经历的反直觉行为,源于人们的说法一致但前进方向不同。

 

每个参与的人都清楚变革与核心领域的关系吗?怎么才能加快包裹递送而不产生负面影响?系统本身如何导致了问题的产生?当前的流程和模式会产生什么样的心态?系统中的关系如何强化了这些模式?有什么你没有看到的变革需求吗?开始绘制这些模式,确定你的核心领域,所需的变革自然便会显现。

 

拒绝改变

 

每个试图变革的组织都有这样一些人:守门人、地牢主、自封的 10 倍速工程师,他们对组织非常了解,并且拥有一个魔法词:不。

 

他们说,“我们已经尝试过迁移。我们已经尝试过平台迁移或重构。我们已经尝试过重组。都行不通。别费心了。”他们掌握着生产环境或管道或某个关键系统的控制权,你没法忽视他们。

 

对此,人们很容易把责任归咎于那人的固执性格。但他展现的行为模式,正是长期的奖励与强化所形成的。通过管理遗留系统的复杂性,他已成为不可或缺的存在。要改变他,必须改变整个组织的思维方式,否则,又会冒出另一个类似的角色取而代之。仅靠技术手段无法从根本上解决问题。

 

拒绝改变是会传染的。当那个人关闭了好奇心,其他人也会转向固定思维模式。人们首先做的是怀疑而不是实验。组织无法在规避风险和尝试新事物之间找到平衡。变革陷入了停滞。

 

“变革之所以困难,是因为人们高估了他们所拥有的东西的价值,低估了他们放弃这些东西可能获得的价值。” ——《会飞的水牛:卓越腾飞,学会让员工引领》(Belasco 和 Stayer,1999 年)

 

解决之道:解雇那个人

 

好吧,这可能有点极端。你可能无法解雇他们,但你可以限制他们的影响。你不是他们的导师、母亲或心理医生。不要陷入那种角色。

 

把他们装进盒子里。给他们一个静态领域,让他们可以保留自己的脚本和遗留代码,而你去改变系统的其余部分。用“是”的力量去平衡他们“不”的力量。

 

是的,这并不意味着认同所有观点。这意味着探索可能性。将对话引向可以向前推进的方向。找到愿意做出改变的人,并帮助他们解决自己的问题,而不是等待守门人为他们开锁。

 

效率与控制

 

效率带来安全感。控制带来责任感。二者结合,便形成了现代组织中最诱人的反模式:效率与控制。

 

当它们占据主导地位时,我们关注的焦点便会缩小到产出:发布特性、关闭工单、满足截止日期。工作以速度来衡量,而不是价值。组织最小化互动和反思,坚信速度等于进步。

 

但在复杂的系统中,只讲效率会使系统变得脆弱。你按时交付了错误的东西。你得到了与蓝图相匹配的结果,但忽略了变化的环境。你得到了短期的解决方案,而那最终会成为未来的障碍。

 

我们制定了一个有预算有时间表的路线图,而唯一的上下文是一堆令人困惑的架构。

 

要求我们增加控制,但又理不清头绪。效率不过是掩盖混乱的遮羞布。其结果是一场组织作秀:Jira 工单、自信满满的时间表,以及追踪一切却唯独忽略意义的指标。

 

截止日期不可更改。功能已锁定。缺的是什么呢?一个明确的目标和协同一致的成果,同时又留有空间,允许在学习过程中进行调整。包裹配送时间没有改善,客户体验也未见提升。

 

解决之道:设计知识流

 

让团队注重效能而非过度追求效率。如何确保时间、精力和注意力都用在塑造真正重要的成果上?用协同取代控制:建立能让正确信息在正确时间传递给正确人员的工作机制,让信息跨越边界自由流动,无需高管做微观管理。

 

思考你目前正在开展的项目。你是在度量产出还是成果?截止日期是反映了现实还是一厢情愿的想法?如何改善信息流,而不是构建一个工厂式的交付过程?做工作与交付价值不是一回事;改善知识流能让你更快地获得价值。

 

产品 vs. 技术

 

Andrew 让我们聚在一起,因为我们有类似的挫败感。我们都面临着用 Kubernetes 解决系统性问题的压力。当然,我们做不到。我们也因为反直觉行为,养成了互相指责对方角色的习惯。

 

工程团队不喜欢产品经理给他们施加压力,要求他们在一个紧迫的时间表内完成特性交付。他们不明白,他们正在做的改变怎么能提高代码质量。基础设施、架构和 DevSecOps 人员则抱怨说,他们需要的改进从未被优先考虑。

 

产品团队不喜欢工程师表现出的抵触和消极态度。他们不明白,为什么一些简单的事情需要那么长时间来构建。他们抱怨说,过度工程化浪费了大量的会议时间,而那些时间本来可以用在寻找前进的方法上。

 

在许多组织中,产品和工程是相互隔离的孤岛。双方对效率与控制的定义截然不同,成了两股相互对立的势力。产品部门只需将需求抛过隔离墙,便坐等可运行的代码返回;而工程部门则被要求加快编码速度,无暇顾及系统设计。

 

即使这两个角色坐在一起,他们相互冲突的方法和控制欲也会加剧摩擦。

 

解决之道:向学习驱动型转变

 

Carol Dweck 博士描述了两种心态:固定型和成长型

 

固定型心态认为,擅长某事就意味着那件事应该很容易做到。如果某事很难,则说明你缺乏天赋。在这种模式下,人们会回避挑战,将反馈视为批评,将他人的成功视为威胁。其结果是团队很脆弱,他们要保护自己的地盘,而不是一起学习。

 

成长型心态认为,能力可以通过实践、反馈和坚持来提升。你不能只是做 Netflix 所做的事。在这种模式下,人们欢迎挑战,将努力视为精通之道,将挫折当作改进的数据基础。其结果是个人和团队都更有韧性,他们会适应而不是抵触。

 

当每个人,无论什么角色,都采用成长型思维时,他们就会一起学习。同理心是一项关键能力。它不同于单纯的同情,而是从多个角度理解情境的能力——对用户和代码的影响;产品团队与技术团队之间的流程和协作模式所导致的顽固问题。

 

为了共同做出有影响力的决策,我们需要成长型思维,借鉴他人的经验来丰富我们的世界观,并引导自己获得更深刻的洞察力。

 

线性管道思维

 

还记得过去软件中某个地方有 Bug 的日子吗?修复一行代码就能解决问题。现在,在微服务和分布式系统构成的复杂世界中,Bug 通常存在于各部分之间的关联关系中。系统架构的艺术和科学在于设计和编排。

 

每天,我们都会经历摩擦,因为我们在一个异步世界中交付线性管道。或许我们称其为平台,但真正的平台是精心设计的不同技术与流程之间的关联体系。它们能用不同的方式响应不同时间发生的各类事件。平台的各部分相互协同,达成单个组件无法独立实现的成果。这种现象被称为涌现(emergence)。

 

面向涌现的设计需要综合多方视角,理解如何调整整个系统以实现包裹快速配送,而又不破坏异步关系。

 

综合意味着不能单打独斗。你需要其他人贡献他们的专业知识,并将这些专业知识与你的知识整合在一起。当我们无法构建能整合组织知识与经验的实践体系时……我们就无法设计(或调试)平台。于是我们交付了一条管道,而所有人都将它的缺陷归咎于不充分。

 

解决之道:构建关系

 

与其用线性思维处理异步情境,不如退一步思考以下问题:

 

  • 在你的系统中,关系如何产生效果?

  • 系统各部分之间如何通过关系实现它们不直接做的事情?

  • 信息如何在技术系统中流动?

  • 痛点和瓶颈在哪里,以及如何优化关系以消除这些阻碍?

 

如果你的组织不支持这项工作,就组建一个秘密小组。无论身处何种角色,都要将多元视角融入建议的更改方案中。确保信息在人员之间顺畅流动,从而实现服务之间的无缝衔接。

 

当具有不同观点的团队(如架构师 Diana 和产品经理 Cat)共同构建这些模式时,一切都会变得更加轻松。与其他团队交流,观察用户使用系统的过程,向基础设施团队了解他们的痛点,并将这些洞察融入解决方案之中。

 

交付能力不足

 

我们以为我们专注于目标,而实际上我们是在专注于需求。目标是一个可衡量的成果,比如,提高包裹递送速度。如果我们提高了系统的能力,我们就实现了目标,而不是简单地添加另外一项功能。

 

对于内部平台团队而言,一个可能的例子是:团队被告知需将软件部署管道从 Jenkins 迁移至 CircleCI。这明确告知了操作步骤,却未说明迁移背后的原因。

 

这里的隐藏目标是将开发者的管道维护工作量减少百分之五十。没有这些信息,团队可能会迁移了软件交付管道却没有达到预期的结果。他们也可能有一些想法,不需要昂贵的管道迁移就能实现目标。

 

部署变更的能力早就已经存在。在这种情况下,交付流程会频繁出现各种断层。对于如何部署变更,每个人都有不同的想法。如果关注点是改变工具,那么这些想法将导致无尽的摩擦。

 

解决之道:专注于目标

 

制定有意义的目标,并整合实现目标的各种方案。描述需要交付的具体且可衡量的效益或成果。确保目标紧密契合核心领域,即加速包裹配送。系统的所有功能都应该服务于这个目标。每次部署变更时,我们(期望)都在提升系统履行职责的能力。聚焦目标能确保每位贡献者都理解自身工作的价值。

 

去尝试

 

现在,你可能感到不知所措。“我做不到这一切!我的工作已经很忙了!”这是真的。

 

幸运的是,你不需要全都做。选一件事来做就行。一个可以减少摩擦的小变革,可以是你最感兴趣的事情,也可以是给你的日常生活造成最大摩擦的事情。

 

系统就是这样工作的……小变革可以扩展为大改进。摩擦在细节中,解决之道也在细节中。

原文链接:

https://www.infoq.com/articles/friction-fix/

作者:互联网容器团队-Chen Han、AI 研发团队 - Liu Dong Yang

在大规模GPU容器集群与模型训练场景,面临稳定性和资源利用率等多重挑战。本文展示vivo GPU平台的总体架构,介绍容器平台在大规模GPU容器集群稳定性建设措施,以及探索多种GPU容器降本提效的解决方案。分享AI工程训练平台大规模训练稳定性建设,及GPU利用率提升实践经验。

本文为2025年 vivo 开发者大会互联网技术专场分享内容之一,在微信公众号"vivo互联网技术"对话框回复【2025VDC】获取 2025VDC 互联网技术会场议题相关资料。

1分钟看图掌握核心观点👇

图1 VS 图2,您更倾向于哪张图来辅助理解全文呢?欢迎在评论区留言

一、GPU平台架构

vivo的GPU平台由物理层、容器平台层与AI工程层三方面构成。由多种GPU服务器和分布式存储以及高性能网络等基础设施,构成了可靠的物理层。容器平台层的GPU容器能力,主要包含了资源管理、编排调度、GPU虚拟化与多容器网络这四个方面。

其中资源管理,表现为多种架构资源池的部署与管理能力。编排调度能力,由GPU弹性伸缩、训推潮汐部署以及多种卡调度策略组成。自研的GPU虚拟化囊括了业界主流的MIG虚拟化、内核层虚拟化以及CUDA层虚拟化三种技术。由传统的Underlay网络以及SRIOV的RDMA直通网络,组成了丰富的容器网络架构。容器平台提供了开放的API接口,为AI工程层的训练和推理平台,提供了坚实的算力底座。通过训练和推理平台,支撑公司内的智能计算业务。

二、GPU容器能力实践

GPU容器能力实践分为两个模块,首先是大规模容器集群稳定性建设,其次是GPU容器提效降本方案。先了解下容器平台在大规模容器集群场景,如何进行稳定性建设的。

2.1 大规模容器集群稳定性

集群稳定性是一切的基石。当集群规模大时,任务多,调度频繁,导致核心组件负载激增,极易发生集群崩溃。随着节点规模扩大,运维复杂度呈指数级增长,日常运维工作繁重,发现问题不及时。同时故障处理也面临严峻挑战,故障中涉及的复杂场景多,故障处理的难度大。稳定性建设需要解决上述问题。

为了解决高频调度导致的核心组件高负载问题,我们针对Apiserver、etcd、CoreDNS,这3个核心组件进行了架构和性能优化,具体的方案如图所示。通过这些优化手段提升了组件性能,并且降低了组件负载,有利于大规模集群的平稳运行。

为了减轻集群运维负担,我们重点建设了自动化节点管理方案。把重复性的运维事项自动化。同时我们还完善了监控告警体系,开发了自动化巡检功能,使运维人员能够及时发现集群问题,快速介入,处理潜在风险,保障集群能够长久稳定运行。

故障处理是集群稳定的兜底措施,我们针对多个核心组件都做了,各类故障处理预案。结合可能存在的故障特点,构造故障场景,进行故障恢复演练,确保故障发生时,能够第一时间找到合理的解决方案,准确的处理问题。

通过上述的措施,在集群稳定性方面取得了不错的效果,首先日常的集群可用性稳定保持在99.99%水平,其次平台的年度故障复盘数相较于上一年下降60%。核心组件方面的优化也达到了不错效果,其中Apiserver的CPU负载下降70%,etcd提交延迟,从秒级缩短到毫秒级,CoreDNS的毛刺现象消失了,并且负载量下降了90%左右。

2.2 GPU容器提效降本实践

容器平台的核心竞争力之一就是助力业务提效降本,我们从不同业务维度,对GPU容器提效降本方案进行了探索。

  • 首先在单卡维度,通过自研GPU虚拟化方案,使多个容器,互不干扰的共享一张卡资源。
  • 其次是在单服务维度,使业务能够自动应对,负载变化的GPU弹性扩缩容方案。
  • 多服务维度,能够让推理服务和训练服务,分时复用整机资源的,训推潮汐部署方案。
  • 最后是在多机多卡的分布式场景中,让GPU容器搭配RDMA网络,来解决跨节点通信的瓶颈问题。

2.2.1 单卡共享-GPU虚拟化

如何让一张卡同时运行多个容器又不互相干扰,就涉及到GPU虚拟化技术。GPU虚拟化一直是AI云原生领域的热门话题之一,各大云厂商都有成熟的解决方案售卖。

vivo容器平台的自研GPU虚拟化方案,主要为了解决业务的三大痛点,

  • 首先是部分推理业务负载偏低,无法有效用满整卡资源,需要通过共享部署方式,减少资源总量,降低业务成本,提升利用率。
  • 其次是不同业务共享同一张卡时,对于安全性以及隔离性的要求各不相同,就需要使用不同的GPU虚拟化技术来满足不同业务诉求。
  • 最后在Dev开发机场景,用户使用频率偏低,需要通过显存超售,来提升资源复用率,但显存超售后又需要避免某个用户将显存耗尽,导致OOM错误影响同卡的其他用户。

自研GPU虚拟化方案包含MIG虚拟化、内核层虚拟化、CUDA层虚拟化这三种技术。结合业务场景,提供了丰富的卡调度策略,例如尽量聚集的Binpack策略、尽量分散的Spread策略,每个卡只有一个实例的CardOnlyOne策略,以及自定义节点和卡分配关系的CustomTopo策略。通过自研模块与组件,接入Kubernetes体系,对外提供统一调度能力。

首先,MIG虚拟化技术,是基于Nvidia硬件提供的,切块组合能力,能够按规则把计算单元和显存单元进行组合,组成MIG实例挂载到容器内,提供完全独立的运行环境。MIG方案的优点是拥有Nvidia官方支持,可以集成到自研体系中。由于是在硬件层面实现的算力和显存限制,所以隔离性和安全性最好。缺点就是仅支持Ampere及以后架构的部分卡,而且限定了切分比例。主要应用场景是对算力隔离有强需求的线上业务。

内核层虚拟化技术,是通过自研内核模块,创建虚拟字符设备替换原有的Nvidia字符设备,在内核态拦截IOCTL请求后,实现的算力和显存限制。优点是上层应用无感。并且内核态拥有良好的安全性。缺点是当前无开源方案,开发难度大,而且算力隔离的并不充分。主要应用场景是常规线上业务。

CUDA层虚拟化技术的原理:使用拦截库替换Nvidia Driver的原始库,建立拦截库与原始库的,API函数映射关系,从而拦截调用函数,实现算力和显存的限制。

优点是有开源方案,使用起来比较灵活。并且可以基于Nvidia提供的统一内存模型,开发显存超售能力。能够在显存不足时,使用内存替代,虽然处理速度下降,但是能够有效避免,显存OOM导致用户程序报错。

缺点是用户态导致安全性不足,并且算力隔离能力偏弱,主要应用场景是Dev开发机场景。

将自研的内核层虚拟化方案与业界方案,进行了自测性能对比,如图所示,可以看到自研方案在性能上,已经达到业界先进水平。业务使用该方案,与独占整卡部署相比较,平均单卡虚拟化率300%左右,就是把1张物理卡当3张卡使用,同时整机GPU利用率提升了30%+,成本优化超过50%。

2.2.2 服务提效-GPU弹性扩缩容

在单服务维度,如何帮助业务自动管理大量的GPU容器是提效的关键。我们引入了GPU弹性扩缩容方案。

  • 首先弹性扩缩容能力,能够快速响应负载变化,自动调节实例数量,减少人工干预次数,有利于业务在突发场景的平稳运行。
  • 其次是业务方在生产环境部署后,非生产环境的实例通常会闲置,这会浪费稀缺的GPU资源。
  • 最后由于Kubernetes原生,并不支持GPU维度的弹性扩缩容,需要寻找合适的方案来满足业务诉求。

如图所示,我们是基于开源的KEDA框架,自研了GPU-Scaler组件,使用Prometheus中存储,来自DCGM-Exporter的GPU指标,汇聚为扩缩容事件,用于触发KEDA框架,调整实例个数,以此实现了GPU弹性扩缩容能力。

由于KEDA框架支持将Workload实例数缩容到0,所以在非生产环境部署的GPU业务,默认开启无负载时,自动缩容到零的功能,以此自动回收,长期闲置的GPU资源。

最终的使用效果,线上业务资源不足类告警,下降了80%,单业务平均减少约每周1小时的,扩缩容工作量,有效降低了GPU业务的运维成本。

2.2.3 多服务降本-训推潮汐部署

在多服务维度,训练服务的资源短缺问题,与推理服务,低峰时段资源空闲问题,相对突出。考虑让训练业务利用推理的空闲资源,即训推潮汐部署方案。

首先推理和训练业务都需要稳定的运行环境。而且推理业务潮汐特征明显,夜晚负载低,资源空闲多,导致平均利用率偏低。并且多机多卡训练任务,需要整机资源,且资源需求日益增长,采购新设备,难且慢,导致训练资源缺口明显。

训推潮汐部署就是整机资源分时复用的逻辑,如图所示,推理业务在白天高负载时,稳定运行,在夜晚低峰时段,自动腾挪出空闲整机资源,借给训练业务使用。在清晨时段,训练业务结束,把整机资源还给推理业务,如此达到分时复用的效果。

如图所示。推理业务在部署前,需要评估保底负载容量。在部署时填入维持业务稳定的最少Pod数量。基于OpenKruise组件的,WorkloadSpread功能,管理不同的Subset,分别在稳定池和潮汐池中按需部署。同时配置CronHPA,定时缩容,自动调整副本数,到稳定Pod数量,优先删除潮汐池中的Pod。以此达到把潮汐池的节点整机腾空的效果。

其中我们还针对Workload的缩容优先级进行了优化。当缩容发生时,结合Pod和节点的拓扑关系,把所在节点实例数少的Pod优先缩容,达到更快的腾空效果。

通过上述方案,训推潮汐部署的降本效果明显,使推理业务,成本下降30%,同时整机GPU利用率提升20%多,有效缓解了训练资源短缺问题。

2.2.4 多机多卡提效-容器RDMA高性能网络

当前分布式训练和推理业务,对算力和显存的需求巨大,单节点资源不足,需要使用多机多卡资源,那么网络通信容易成为性能瓶颈。RDMA技术允许GPU直接访问支持RDMA设备中的数据,无需经过主机CPU或内存,实现跨节点的零拷贝数据传输,有效减少了CPU开销和网络延迟。所以从多机多卡维度,使用RDMA技术是网络提效的有效措施。从容器平台角度,GPU容器更加需要结合RDMA技术,提供简单高效的解决方案,方便业务使用。

如图所示,RDMA容器有两个网卡,一个是使用Calico-CNI插件,通过veth创建的eth0网卡,对应的是Underlay网络。另一个是使用Sriov-CNI插件,通过VF创建的eth1网卡,对应的RoCE_v2或IB协议网络。我们引入了Multus-CNI组件,能够在单容器创建时,按需调用多种CNI插件。同时我们选择使用Spiderpool组件管理IP池,以及进行IP分配和路由策略配置。

通过上述组件,在Kubernetes体系中实现了RDMA容器的全生命周期管理能力。基于容器RDMA能力,在大规模训练和推理场景,业务能够提速20%到30%之间,提升效果明显。

三、AI工程训练平台实践

3.1 训练平台整体架构

VTraining训练平台是由vivo AI计算平台团队打造的一站式大模型训练方案,它面向算法工程师,提供模型开发、模型训练和海量样本存储等能力。

VTraining底层是基于vivo容器平台、及高性能计算、网络、存储等基础设施之上构建,通过提供模型开发、模型训练、资产管理等能力,支撑公司的大模型训练业务。

像vivo手机的蓝心小V、相册等核心产品的大模型训练,都是在VTraining平台进行迭代的。

3.2 大规模训练稳定性实践

3.2.1 稳定性背景

稳定性问题是大规模训练的痛点。任务在大规模的同步训练过程中需要依赖计算、网络、存储、容器调度等复杂的基础设施环境,任何环节出问题都会导致任务中断,问题定位、恢复困难。

例如知名头部公司千亿参数大模型的大规模训练任务,平均每3小时触发一次意外中断。

3.2.2 稳定性实践-高频故障专项治理

其中一个问题,是GPU集群投入使用初期机器故障率会很高,训练任务会经常被中断。为了降低机器故障率,我们进行了高频故障专项治理。首先对GPU集群进行了大规模测试诊断、然后进行高频故障统计和修复,把有问题的软硬件进行维修、替换、升级或修复。

3.2.3 稳定性实践-故障处置流程完善

另一个问题,是任务故障就是不可避免的,所以为了缩短任务中断时间,尽快恢复任务运行,我们对故障处置流程进行了重点建设完善。

  • **训练前,**我们会针对GPU机器、网络通信等环境进行大规模检测,剔除异常节点、慢节点等问题节点,降低故障风险。
  • **训练中,**会开启自动化容错机制,以便能及时发现基础设施或任务异常,快速进行故障定位和故障容错,自动隔离故障、自动重启恢复任务运行。
  • **训练后,**对新问题进行搜集分析,完善异常特征库,增强问题诊断能力,以便后续遇到类似的故障可以快速容错。

3.2.4 稳定性实践-效果与总结

通过减少基础设施高频故障、完善任务故障处置流程两大措施,我们取得了良好效果:机器每天故障率由原来的百分之二下降到千分之一;千卡任务有效训练时长由原来的60%提升到99%,达到了行业一流水平。

同时我们也积累了相关的稳定性经验:

  • GPU集群由不稳定到稳定,需要一个软硬件磨合过程。因为不同的软硬件环境会触发不同的稳定性问题。
  • 大规模训练前,尽量剔除历史故障率高的机器。我们发现稳定的机器一般会一直很稳定,而故障率高的机器即使修复后出问题的概率也比较大。
  • 提升任务有效训练时长,需结合基础设施、训练框架、平台容错机制综合优化。例如秒级监控告警能力、checkpoint持久化策略等等都需要进行持续深入的优化。

3.3 GPU利用率提升实践

3.3.1 GPU利用率提升-业务背景及问题

GPU是稀缺资源,但是差异化的业务场景下GPU难以高效利用,利用率提升困难。比如GPU场景常见业务形态:有训练任务、推理业务、数据生产、开发调试等等类型。他们各有特点:

  • 训练任务虽然GPU利用率高,但是偶尔也会出现碎片化空闲资源,比如算法同学偶尔会将任务停下来排查问题,调下参数之类的操作,任务并不是一直不间断地在跑的。
  • 推理业务有很明显的潮汐特性,白天流量高峰期GPU利用率高、到了夜间流量低峰期利用率会比较低。
  • 数据生产任务属于离线任务,GPU利用率高、资源需求大、但难申请到资源;开发调试任务的话GPU利用率低并且要长期占用资源,导致GPU利用率长期低下。

所以不同的业务形态有不同的利用率特点,接下来介绍下我们的GPU利用率提升措施。

3.3.2 利用率提升措施一:低优任务

对于训练任务场景,偶现的碎片化空闲资源,我们 通过低优数据生产任务进行充分利用。如图所示,我们通过低优数据生产任务调度,复用训练场景偶现的碎片化资源,当正常任务需要资源时,可随时抢占低优资源,不会影响正常训练任务的调度。

3.3.3 利用率提升措施二:训推潮汐部署

对于推理业务场景,在夜间流量低峰期可以释放大量GPU资源,我们通过训推潮汐部署给离线业务复用。如图所示,通过训推潮汐部署机制,我们将夜间推理流量低峰期缩容的机器腾挪到了离线GPU资源池,给离线业务使用,白天再腾挪回在线GPU资源池进行扩容,达到潮汐复用的目的。

3.3.4 利用率提升措施三:GPU虚拟化

对于开发任务场景,长期独占GPU资源且利用率低,我们通过vivo自研VGPU虚拟化技术,减少开发任务占用的物理GPU卡数,释放冗余算力。如图所示,我们可以将单机4卡GPU机器,通过开启VGPU虚拟出16卡VGPU,相当于一卡顶四卡。

VGPU的优点是:可支持1:2、1:4超卖、还可以用内存补充显存不足,所以对用户是无感知使用的,很适用于开发任务这种对性能要求低的场景。

3.3.5 利用率提升总结与规划

总之,训练平台通过低优任务、训推潮汐部署、GPU虚拟化等策略,深度适配差异化业务场景特性,实现了资源高效复用。AI整体GPU利用率均值绝对值提升了5个百分点,接近行业一流水平。

未来训练平台也会持续对GPU利用率进行综合治理。例如进行低效任务治理、低效资源盘活、成本账单统计、奖励与惩罚措施的实施等等,让稀缺的GPU资源发挥更大价值!

四、GPU平台未来展望

在容器平台层面,我们会从多集群联邦调度、在离线GPU混部、国产异构计算芯片支持、GPU资源池化等方面能力进行综合建设,支撑上层平台业务对GPU资源的高效利用。

训练平台层面,我们会增强故障预警、任务动态容错等能力,增强业务稳定性;同时完善对大模型训练全流程能力的支撑,以及对GPU资源进行更精细化的运营,从而让GPU业务更加稳定、资源利用更加高效!

刚出的榜单,Go掉得挺多

今年1月的TIOBE编程语言排行榜出来了。有个事儿挺显眼的,Go语言这次排到了第16名。

要知道,2024年11月它还在第7名呢,这才过了多久,直接掉了9名。

很多写Go的朋友看到这个可能心里会犯嘀咕:这语言是不是不行了?以后还能不能用它找工作了?

咱们先别急着下结论。

在讨论这个问题之前,咱们得先搞清楚这个榜单到底是怎么回事,这次排名下降是不是真的代表Go语言出了大问题。

TIOBE指数到底是啥?

TIOBE这个榜单,它统计的数据来源其实是各大搜索引擎。

简单说,就是看有多少人在百度、谷歌、必应这些地方搜这门语言的名字。

它反映的是一种“搜索热度”。这里面有个逻辑大家要明白:一门语言搜的人多,不代表用的人就多;

反过来,搜的人少,也不代表用的人就少。

通常什么样的人会去搜?新手刚开始学的时候,或者遇到报错搞不定的时候,搜得最多。

如果一门语言大家都会用了,或者它运行很稳定、没啥新花样,大家反倒不去搜了。

所以,TIOBE的排名主要代表的是大家对这门语言的“好奇心”和“陌生感”,而不是它在实际项目里的使用率。

为啥这次Go掉到了第16?

那Go语言这次为啥排名掉得这么明显?我觉得有这么几个实实在在的原因。

Rust语言现在确实很受欢迎

在这次榜单上,Rust排到了第13名。Rust在安全性、系统底层开发这些方面确实有优势,吸引了很多开发者的注意力。

本来有些可能打算学Go的人,现在可能转头去研究Rust了。大家的关注点分散了,搜Go的人自然就少了一些。

还有就是Go语言现在太“稳”了

它现在的版本兼容性做得很好,依赖管理也成熟了。以前大家可能会经常搜“Go怎么配置环境”、“Go这个库怎么用”,现在这些问题都解决了,不需要老去搜。

而且,Go语言现在主要用在服务器后台、云计算这些地方。大家用Docker、用Kubernetes,底层其实都是Go写的,但大家平时操作的是命令行,不需要直接去写Go代码,也就不会去搜它。

实际情况到底怎么样?

排名虽然掉了,但咱们看看实际工作中的情况。

现在的互联网公司,特别是做后端开发的,用Go的还是非常多。像很多大厂的核心系统,依然是用Go在写。

在云原生这个领域,Go的位置目前还是很稳固的,没什么语言能轻易替代它。

Go语言有个很大的优点,就是简单、直接。代码写起来快,跑起来性能也不错,维护起来也方便。

对于公司来说,这能省成本,能提高效率。只要这个优势还在,公司就不会轻易把它换掉。

总结

所以看到排名下降,不用太担心。这个榜单反映的是当下的关注度和话题度,不是实际的市场占有率。

Go语言现在进入了一个平稳发展的阶段,不像刚出来时那么有新鲜感,但它在实际工作中还是非常有用的。

大家该学还是学,该用还是用。选编程语言,看的是能不能解决实际问题,能不能帮你把活干好,而不是看它在榜单上排第几。

只要它还能帮你高效地开发系统,它就是有价值的。

⚡️ 别把时间浪费在低效复习上

很多人复习抓不住重点。作为过来人,我分析了100+份大厂面试记录,将 Go/Java/AI 的核心考察点、高频题、易错点 浓缩进了一份 PDF。

不搞虚的,全是干货。

加我微信:wangzhongyang1993,备注 【面经】 免费发你,立即纠正你的复习方向,把时间用在刀刃上。

External Secrets Operator 中发现了一个严重安全漏洞。该工具是 Kubernetes 生态中广泛使用的外部密钥管理组件,用于连接 AWS Secrets Manager、HashiCorp Vault 等外部密钥系统与 Kubernetes 集群。漏洞编号为 CVE-2026-22822,CVSS 评分高达 9.3(严重),意味着攻击者可能借此直接获取敏感数据。
该漏洞导致 不安全的密钥读取(Insecure Secret Retrieval),并破坏了 Kubernetes 中最基本的命名空间隔离机制
问题源于一个名为 getSecretKey 的模板函数。该函数最初是为了支持 senhasegura DevOps Secrets Management (DSM) 提供商而引入的,但后来被发现功能过于强大,从而带来安全隐患。
根据安全公告:“该函数能够在 external-secrets 控制器的 roleBinding 权限下跨命名空间读取密钥,从而绕过我们的安全机制。”
这意味着,一个命名空间中的恶意资源或配置错误的资源,可能读取到另一个命名空间的密钥—— 而这些密钥原本是完全不允许它访问的。“攻击者或配置错误的资源可以从非预期的命名空间中读取密钥。”
这种绕过的影响极为严重。如果攻击者能够读取特权命名空间中的密钥,他们就能轻松进一步提升权限并完全控制集群。报告指出:“未经授权访问密钥可能导致权限提升、数据泄露,或服务账号与凭据被窃取。”
管理员应立即审计其集群。该漏洞影响 External Secrets Operator 从 v0.20.2 到 v1.2.0 的所有版本
维护者采取了果断的修复方式:直接删除了该功能。“该函数已被完全移除,因为它能实现的所有功能都可以通过其他方式完成,同时不会破坏我们的安全防护机制。”
用户被敦促立即升级到 v1.2.0 版本,该版本通过删除问题代码彻底修复了漏洞。
对于暂时无法升级的用户,也有临时缓解方案。管理员可以使用 Kyverno、Kubewarden 或 OPA 等策略引擎来 “阻止在任何 ExternalSecret 资源中使用 getSecretKey 函数”。

今天跟大家分享一个etcd的内存大量占用的问题,这是前段时间在我们开源软件Easegress中遇到的问题,问题是比较简单的,但是我还想把前因后果说一下,包括,为什么要用etcd,使用etcd的用户场景,包括etcd的一些导致内存占用比较大的设计,以及最后一些建议。希望这篇文章不仅仅只是让你看到了一个简单的内存问题,还能让你有更多的收获。当然,也欢迎您关注我们的开源软件,给我们一些鼓励。

为什么要用ETCD

先说一下为什么要用etcd。先从一个我们自己做的一个API网关 – Easegress(源码)说起。

Easegress 是我们开发并开源的一个API应用网关产品,这个API应用网关不仅仅只是像nginx那样用来做一个反向代理,这个网关可以做的事很多,比如:API编排、服务发现、弹力设计(熔断、限流、重试等)、认证鉴权(JWT,OAuth2,HMAC等)、同样支持各种Cloud Native的架构如:微服务架构,Service Mesh,Serverless/FaaS的集成,并可以用于扛高并发、灰度发布、全链路压力测试、物联网……等更为高级的企业级的解决方案。所以,为了达到这些目标,在2017年的时候,我们觉得在现有的网关如Nginx上是无法演进出来这样的软件的,必需重新写一个(后来其他人也应该跟我们的想法一样,所以,Lyft写了一个Envoy。只不过,Envoy是用C++写的,而我用了技术门槛更低的Go语言)

另外,Easegress最核心的设计主要有三个:

  • 一是无第三方依赖的自己选主组集群的能力
  • 二是像Linux管道命令行那样pipeline式的插件流式处理(支持Go/WebAssembly)
  • 三是内置一个Data Store用于集群控制和数据共享。

对于任何一个分布式系统,都需要有一个强一制性的基于Paxos/Raft的可以自动选主机制,并且需要在整个集群间同步一些关键的控制/配置和相关的共享数据,以保证整个集群的行为是统一一致的。如果没有这么一个东西的话,就没有办法玩分布式系统的。这就是为什么会有像Zookeeper/etcd这样的组件出现并流行的原因。注意,Zookeeper他们主要不是给你存数据的,而是给你组集群的。

Zookeeper是一个很流行的开源软件,也被用于各大公司的生产线,包括一些开源软件,比如:Kafka。但是,这会让其它软件有一个依赖,并且在运维上带来很大的复杂度。所以,Kafka在最新的版本也通过内置了选主的算法,而抛弃了外挂zookeeper的设计。Etcd是Go语言社区这边的主力,也是kubernetes组建集群的关键组件。Easegress在一开始(5年前)使用了gossip协议同步状态(当时想的过于超前,想做广域网的集群),但是后发现这个协议太过于复杂,而且很难调试,而广域网的API Gateway也没遇到相应的场景。所以,在3年前的时候,为了稳定性的考量,我们把其换成了内嵌版本的etcd,这个设计一直沿用到今天。

Easegress会把所有的配置信息都放到etcd里,还包括一些统计监控数据,以及一些用户的自定义数据(这样用户自己的plugin不但可以在一条pipeline内,还可以在整个集群内共享数据),这对于用户进行扩展来说是非常方便的。软件代码的扩展性一直是我们追求的首要目标,尤其是开源软件更要想方设法降低技术门槛让技术易扩展,这就是为什么Google的很多开源软件都会选使用Go语言的原因,也是为什么Go正在取代C/C++的做PaaS基础组件的原因。

背景问题

好了,在介绍完为什么要用etcd以后,我开始分享一个实际的问题了。我们有个用户在使用 Easegress 的时候,在Easegress内配置了上千条pipeline,导致 Easegress的内存飙升的非常厉害- 10+GB 以上,而且长时间还下不来。

用户报告的问题是——

在Easegress 1.4.1 上创建一个HTTP对象,1000个Pipeline,在Easegres初始化启动完成时的内存占用大概为400M,运行80分钟后2GB,运行200分钟后达到了4GB,这期间什么也没有干,对Easegress没有进行过一次请求。

一般来说,就算是API再多也不应该配置这么多的处理管道pipeline的,通常我们会使用HTTP API的前缀把一组属于一个类别的API配置在一个管道内是比较合理的,就像nginx下的location的配置,一般来说不会太多的。但是,在用户的这个场景下配置了上千个pipeline,我们也是头一次见,应该是用户想做更细粒度的控制。

经过调查后,我们发现内存使用基本全部来自etcd,我们实在没有想到,因为我们往etcd里放的数据也没有多少个key,感觉不会超过10M,但不知道为什么会占用了10GB的内存。这种时候,一般会怀疑etcd有内存泄漏,上etcd上的github上搜了一下,发现etcd在3.2和3.3的版本上都有内存泄露的问题,但都修改了,而 Easegress 使用的是3.5的最新版本,另外,一般来说内存泄漏的问题不会是这么大的,我们开始怀疑是我们哪里误用了etcd。要知道是否误用了etcd,那么只有一条路了,沉下心来,把etcd的设计好好地看一遍。

大概花了两天左右的时间看了一下etcd的设计,我发现了etcd有下面这些消耗内存的设计,老实说,还是非常昂贵的,这里分享出来,避免后面的同学再次掉坑。

首当其冲是——RaftLog。etcd用Raft Log,主要是用于帮助follower同步数据,这个log的底层实现不是文件,而是内存。所以,而且还至少要保留 5000 条最新的请求。如果key的size很大,这 5000条就会产生大量的内存开销。比如,不断更新一个 1M的key,哪怕是同一个key,这 5000 条Log就是 5000MB = 5GB 的内存开销。这个问题在etcd的issue列表中也有人提到过  issue #12548 ,不过,这个问题不了了之了。这个5000还是一个hardcode,无法改。(参看 DefaultSnapshotCatchUpEntries 相关源码

// DefaultSnapshotCatchUpEntries is the number of entries for a slow follower
// to catch-up after compacting the raft storage entries.
// We expect the follower has a millisecond level latency with the leader.
// The max throughput is around 10K. Keep a 5K entries is enough for helping
// follower to catch up.
DefaultSnapshotCatchUpEntries uint64 = 5000

另外,我们还发现,这个设计在历史上etcd的官方团队把这个默认值从10000降到了5000,我们估计etcd官方团队也意识到10000有点太耗内存了,所以,降了一半,但是又怕follwer同步不上,所以,保留了 5000条……(在这里,我个人感觉还有更好的方法,至少不用全放在内存里吧……)

另外还有下面几项也会导致etcd的内存会增加

  1. 索引。etcd的每一对 key-value 都会在内存中有一个 B-tree 索引。这个索引的开销跟key的长度有关,etcd还会保存版本。所以B-tree的内存跟key的长度以及历史版本号数量也有关系。
  2. mmap。还有,etcd 使用 mmap 这样上古的unix技术做文件映射,会把他的blotdb的内存map到虚拟内存中,所以,db-size越大,内存越大。
  3. Watcher。watch也会占用很大的内存,如果watch很多,连接数多,都会堆积内存。

(很明显,etcd这么做就是为了一个高性能的考虑)

Easegress中的问题更多的应该是Raft Log 的问题。后面三种问题我们觉得不会是用户这个问题的原因,对于索引和mmap,使用 etcd 的 compact 和 defreg (压缩和碎片整理应该可以降低内存,但用户那边不应该是这个问题的核心原因)。

针对用户的问题,大约有1000多条pipeline,因为Easegress会对每一条pipeline进行数据统计(如:M1, M5, M15, P99, P90, P50等这样的统计数据),统计信息可能会有1KB-2KB左右,但Easegress会把这1000条pipeline的统计数据合并起来写到一个key中,这1000多条的统计数据合并后会导致出现一个平均尺寸为2MB的key,而5000个in-memory的RaftLog导致etcd要消耗了10GB的内存。之前没有这么多的pipeline的场景,所以,这个内存问题没有暴露出来。

于是,我们最终的解决方案也很简单,我们修改我们的策略,不再写这么大的Value的数据了,虽然以前只写在一个key上,但是Key的值太大,现在把这个大Key值拆分成多个小的key来写,这样,实际保存的数据没有发生变化,但是RaftLog的每条数据量就小了,所以,以前是5000条 2M(10GB),现在是5000条 1K(500MB),就这样解决了这个问题。相关的PR在这里 PR#542

总结

要用好 etcd,有如下的实践

  • 避免大尺寸的key和value,一方面会通过一个内存级的 Raft Log 占大量内存,另一方面,B-tree的多版本索引也会因为这样耗内存。
  • 避免DB的尺寸太大,并通过 compact和defreg来压缩和碎片整理降低内存。
  • 避免大量的Watch Client 和 Watch数。这个开销也是比较大的。
  • 最后还有一个,就是尽可能使用新的版本,无论是go语言还是etcd,这样会少很多内存问题。比如:golang的这个跟LInux内核心相关的内存问题 —— golang 1.12的版sget的是 MADV_FREE 的内存回收机制,而在1.16的时候,改成了 MADV_DONTNEED ,这两者的差别是,FREE表示,虽然进程标记内存不要了,但是操作系统会保留之,直到需要更多的内存,而 DONTNEED 则是立马回收,你可以看到,在常驻内存RSS 上,前者虽然在golang的进程上回收了内存,但是RSS值不变,而后者会看到RSS直立马变化。Linux下对 MADV_FREE 的实现在某些情况下有一定的问题,所以,在go 1.16的时候,默认值改成了 MADV_DONTNEED 。而 etcd 3.4 是用 来1.12 编译的。

最后,欢迎大家关注我们的开源软件! https://github.com/megaease/ 

下面是我的简历

持有 CKA ccna 认证。
长期负责高并发电商系统的稳定性与性能治理,理解 Nginx 的事件驱动模型、Worker 并发机制与请求生命周期控制方式,并将其抽象为 “进入策略( Admission )— 排队策略( Queueing )— 满载策略( Overload )” 的系统行为诊断框架。

通过拆解全链路时间指标( Time-based Metrics ),结合 P95 / P99 延迟分位数,对比 request_timeupstream_response_time,判断请求阻塞发生在进入控制、系统排队或下游依赖阶段,用于快速界定网络层、应用层与数据层的性能边界。

参与并主导多次从单体架构向云原生、无状态化架构的演进,关注系统的可解释性、稳定性与成本控制。


技术技能

SRE 与性能诊断

  • 使用 Ingress / Queue / Worker / Egress 作为系统分层对象进行问题定位

  • 基于 P95 / P99 延迟分位数 分析尾延迟( Tail Latency )

  • 通过 request_timeupstream_response_time 的分位数差异判断系统内部是否发生排队

  • 区分整体性能退化与少量请求异常放大的不同问题模式

  • 依据进入控制、排队与满载策略分析系统稳定性取舍


Web 与中间件

  • Nginx 事件驱动模型、Worker 并发模型、连接与请求生命周期

  • 使用 limit / buffer / backlog / timeout 等配置参数实施系统行为控制

  • Nginx 与 PHP-FPM 的 Worker / Process / Queue 协同关系

  • 高并发 WordPress 架构的稳定性与性能治理


云原生与基础设施

  • 阿里云:ECS 、RDS 、OSS 、ALB

  • AWS

  • Docker 、Kubernetes ( CKA )

  • Terraform (基础设施即代码)

  • Calico ( Kubernetes 网络模型与 NetworkPolicy )


数据库与数据处理

  • MySQL 使用与常见性能问题定位

  • SQL 编写

  • PL/SQL 阅读

  • ETL 流程(数据抽取、清洗、加载)

  • 结合 P95 / P99 延迟分布 判断数据库是否为系统尾延迟来源


自动化与运维

  • Ansible Playbook

  • Shell 脚本

  • 配置一致性与变更管理


网络

  • TCP/IP

  • VPN

  • 负载均衡

  • CCNA 网络体系


工作经历

基础设施负责人 / 高级运维工程师

负责自营跨境电商平台的技术架构设计、云资源管理与系统稳定性。


性能瓶颈诊断与容量优化

  • 通过时间指标发现平均响应时间稳定,但 P95 / P99 延迟显著升高

  • upstream_connect_time 正常的情况下,response_time 分位数拉长

  • 判断请求未阻塞在网络或 TCP 层,而是在系统内部发生资源排队

  • 结合 Nginx 与 PHP-FPM 的并发模型,将问题定位为应用层并发策略导致的 Worker 争用

优化措施:

  • 引入 Redis 缓存,降低同步资源竞争

  • 调整 PHP-FPM Worker 数量,减少高分位请求等待时间

  • 调整 Nginx 超时与失败处理策略,防止慢请求放大系统负载

结果:

  • 页面 P95 延迟从约 5 秒下降至 2 秒以内

  • 尾延迟明显收敛

  • 高峰期服务稳定性显著提升


电商架构云原生改造

  • 数据库迁移至阿里云 RDS

  • 媒体资源迁移至 OSS

  • 前端通过 ALB 进行多节点负载

  • 应用层实现无状态化部署

结果:

  • 系统支持水平扩展

  • 综合成本下降约 30%

  • 大促期间可用性维持在 99.9%


日常运维

  • 使用 Ansible 管理 Nginx / PHP 配置

  • MySQL 备份与恢复演练

  • OpenVPN 远程访问环境维护


早期经历

网络管理员 / IT 支持
2011 年 – 2015 年

  • 企业网络规划与服务器维护

  • SQL 数据提取与分析


教育背景与证书

  • CKA ( Certified Kubernetes Administrator )

  • CCNA ( Cisco Certified Network Associate )

请教各位。我做了 10 年电商,从 23 岁就开始做了,这些爱好自学的。现在走下坡路了,要出来找工作了。
我学历也很低,是函授大专。今年 33 岁了。
我对内核,nginx,sre ,这些也有深入的理解,我不会开发软件,纯粹的想走运维路线
最近也打算学 python ,不会写脚本确实没有竞争力。
我知道我的问题,学历低,没项目经验和实际的工作经验,年纪也大。
上面每项技术,我确实认真的学了很久,而且做过大量的实验实操,理论也很扎实。
boss 直聘主动联系我的人很多,但是简历发了后基本就没下文了。
各位有某些负责招聘的老大,希望能说一下你们的观点
假如我真的没戏,我就不打算找这些工作了。
我也做外贸独立站。然后平时会搭建很多开源项目,也不是玩,确实是投入实际使用。所以不断的积累了相关的操作。就是把自己学的,都在开源项目里应用。

背景

前天朋友提供一个内推岗,这个公司蛮不错的,规模大待遇好还不是外包也不是有争议的 web3 ,他在里面工作,说招好几个月了还是没人去。我有个个人微服务项目准备拿去应聘,然而推荐后说没办法还是得垂直经验,因为现在有 AI 生成代码很简单,个人项目很容易被认为是 AI 代工。

项目介绍

项目原先是通过网课教程做的但不符合生产要求被我全部推翻重写,原来是 go micro 2.9.1 现在是 go micro 4 ,所有服务都是领域驱动,改过框架源码,链路追踪、监控、日志系统、架构等全部一人完成,期间技术栈做了很大的调整,一共迭代 6 个版本,目前是 6.1 ,耗时 3 个月,至今仍在迭代,有部分自编组件。包含压测报告、决策记录、变更日志和自述文件(含项目介绍及部署指南),用 Github Project 管理项目,2 周一版,部署在阿里云 K8S 集群上,使用超过 15 个组件,还用到 LUA 脚本。服务是模拟支付回调扣减库存过程,每个服务 2 个副本,单个 Pod 上限为单核 CPU + 512M 内存,压测 1596Qps ,P99 为 84ms 。

不存在 AI 代工

我开发过程中主要是用 AI 推荐轻量级工具并分析其难度,代码大部分还是自己写,因为 go micro 做 EDA 架构的案例本身就少得可怜直接导致 AI 生成的代码不靠谱,最后还是被我的方案优雅地取代。开发过程中每个版本都是巨大的挑战。

请问各位大佬如何证明个人项目不是 AI 代工以实现成功转型 Golang 开发?

RustFS 作为新一代的分布式对象存储系统,提供了 Helm Chart 以便 Kubernetes 集群上安装 RustFS 实例。而 DirectPV 是一个符合 CSI 标准的 Kubernetes 存储项目,由 Minio 发布且开源。本文使用 DirectPV 为 Kubernetes 上的 RustFS 实例提供后端存储服务,实现两个对象存储服务的“结合”。

前提

  • 运行良好的 Kubernetes 集群。

    本文使用 K3S 作为测试环境,根据 K3S 安装指南完成安装:

    # 安装 K3S
    curl -sfL https://get.k3s.io | sh -
    
    # 安装确认
    kubectl get nodes
    NAME             STATUS   ROLES           AGE   VERSION
    vm-0-17-ubuntu   Ready    control-plane   63m   v1.34.3+k3s1
  • 一块空磁盘

    本文在安装 K3S 的服务器上(OS 为 Ubuntu 24.04)挂载了一块容量为 20GB 的新磁盘:

    df -h
    vdb    253:16   0   20G  0 disk /root/data/disk
    
    mount | grep vdb
    /dev/vdb on /root/data/disk type ext4 (rw,relatime)

安装 DirectPV

可以直接根据 minio/directpv 文档进行 DirectPV 的安装。这个过程中会使用到 krew plugin,根据不同的 OS 执行安装命令即可。

在 Ubuntu 上执行如下命令:

(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)

安装完毕,将 PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH" 写到 ~/.bashrc 或 ~/.zshrc 即可。

开始安装 DirectPV。

  • 安装 directpv krew 插件
kubectl krew install directpv
  • 在 Kubernetes 集群中安装 DirectPV
kubectl directpv install
Installing on unsupported Kubernetes v1.34

 ███████████████████████████████████████████████████████████████████████████ 100%

┌──────────────────────────────────────┬──────────────────────────┐
│ NAME                                 │ KIND                     │
├──────────────────────────────────────┼──────────────────────────┤
│ directpv                             │ Namespace                │
│ directpv-min-io                      │ ServiceAccount           │
│ directpv-min-io                      │ ClusterRole              │
│ directpv-min-io                      │ ClusterRoleBinding       │
│ directpv-min-io                      │ Role                     │
│ directpv-min-io                      │ RoleBinding              │
│ directpvdrives.directpv.min.io       │ CustomResourceDefinition │
│ directpvvolumes.directpv.min.io      │ CustomResourceDefinition │
│ directpvnodes.directpv.min.io        │ CustomResourceDefinition │
│ directpvinitrequests.directpv.min.io │ CustomResourceDefinition │
│ directpv-min-io                      │ CSIDriver                │
│ directpv-min-io                      │ StorageClass             │
│ node-server                          │ Daemonset                │
│ controller                           │ Deployment               │
└──────────────────────────────────────┴──────────────────────────┘

DirectPV installed successfully
  • 安装确认并获取安装信息

kubectl -n directpv get pods
NAME                          READY   STATUS    RESTARTS   AGE
controller-54d56fb9f8-92cz8   3/3     Running   0          90m
controller-54d56fb9f8-kfltl   3/3     Running   0          90m
controller-54d56fb9f8-ncxcn   3/3     Running   0          90m
node-server-vgpn2             4/4     Running   0          90m

kubectl directpv info
┌──────────────────┬──────────┬───────────┬─────────┬────────┐
│ NODE             │ CAPACITY │ ALLOCATED │ VOLUMES │ DRIVES │
├──────────────────┼──────────┼───────────┼─────────┼────────┤
│ • vm-0-17-ubuntu │ -        │ -         │ -       │ -      │
└──────────────────┴──────────┴───────────┴─────────┴────────┘

0 B/0 B used, 0 volumes, 0 drives
  • 添加磁盘(驱动)

首先检测磁盘信息并将其信息写到 drives.yaml 文件中:

kubectl directpv discover

 Discovered node 'vm-0-17-ubuntu' ✔

┌─────────────────────┬────────────────┬───────┬────────┬────────────┬──────┬───────────┬─────────────┐
│ ID                  │ NODE           │ DRIVE │ SIZE   │ FILESYSTEM │ MAKE │ AVAILABLE │ DESCRIPTION │
├─────────────────────┼────────────────┼───────┼────────┼────────────┼──────┼───────────┼─────────────┤
│ 253:16$PXmUgO0FF... │ vm-0-17-ubuntu │ vdb   │ 20 GiB │ ext4       │ -    │ YES       │ -           │
└─────────────────────┴────────────────┴───────┴────────┴────────────┴──────┴───────────┴─────────────┘

Generated 'drives.yaml' successfully.

drives.yaml 文件内容如下:

version: v1
nodes:
    - name: vm-0-17-ubuntu
      drives:
        - id: 253:16$PXmUgO0FF7sKtsaVihMadap1hCZil9Rksbz2SdQkMfA=
          name: vdb
          size: 21474836480
          make: ""
          fs: ext4
          select: "yes"

接着使用 drives.yaml 文件进行 DirectPV 初始化:

kubectl directpv init drives.yaml --dangerous

 ███████████████████████████████████████████████████████████████████████████ 100%

 Processed initialization request '3a70561d-3de0-4756-b256-159fc98593d1' for node 'vm-0-17-ubuntu' ✔

┌──────────────────────────────────────┬────────────────┬───────┬─────────┐
│ REQUEST_ID                           │ NODE           │ DRIVE │ MESSAGE │
├──────────────────────────────────────┼────────────────┼───────┼─────────┤
│ 3a70561d-3de0-4756-b256-159fc98593d1 │ vm-0-17-ubuntu │ vdb   │ Success │
└──────────────────────────────────────┴────────────────┴───────┴─────────┘

恭喜你,走到这一步,你已经成功安装了 DirectPV(之前的每一步出错都会导致失败,请认真查看命令以及输出结果),使用如下命令确认:

kubectl get sc
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
directpv-min-io        directpv-min-io         Delete          WaitForFirstConsumer   true                   90m
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  115m

可以看到,名为 directpv-min-io 的 StorageClass 已经存在。接下来就使用这个 SC 进行 RustFS 的安装。

在 K3S 上安装 RustFS

RustFS 提供 Helm Chart来在 Kubernetes 上安装 RustFS。目前支持两种模式:单机单盘(SNSD)和多机多盘(MNMD)

可以将 GitHub Repo 代码 clone 到本地,然后进入到 helm/rustfs 目录下进行安装,也可以直接使用 RustFS 的远端仓库(RustFS 已经将 Helm Chart 发布到了 Artifact Hub),比如:

# 添加仓库
helm repo add rustfs https://charts.rustfs.com

# 安装 RustFS
helm install rustfs -n rustfs rustfs/rustfs --create-namespace  --version 0.0.80

由于 RustFS Helm Chart 默认使用 local-path StorageClass,而且默认的 PVC 大小为 256Mi,因此需要根据自身情况设置合适的大小,最简单的方式就是在本地创建一个 values.yml 文件,然后修改如下内容:

storageclass:
  name: directpv-min-io
  dataStorageSize: 256Mi
  logStorageSize: 256Mi
当然,也可以用 --set 来实现参数的覆盖,但是由于 RustFS 多种安装模式、多种 Ingress Controller,以及 pod 资源的自定义等,--set 就需要指定多个参数,会显得繁琐。将需要变更的信息写到本地 values.yml,然后用 -f 指定,可能更加便捷的自定义安装 RustFS。

本文采用本地安装模式(也就是 Helm Chart 代码在本地),执行如下命令进行安装:

helm install rustfs ./ -n rustfs --create-namespace -f values.yaml 

查看 PVC

kubectl -n rustfs get pvc 
NAME                     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE
data-rustfs-0-rustfs-0   Bound    pvc-8e9b520f-3a96-4a64-afb3-70f13d3edcd3   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-0-rustfs-1   Bound    pvc-8bef3219-469c-452c-969a-89c8470d3945   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-0-rustfs-2   Bound    pvc-aee2c489-6f4c-47dc-b464-b09fc5ea112c   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-0-rustfs-3   Bound    pvc-b59ec27c-9fb0-4ad1-a204-9858c1d405da   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-1-rustfs-0   Bound    pvc-8d840468-f6be-4154-ae42-73f68f6e36e3   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-1-rustfs-1   Bound    pvc-c5adc67b-f6ea-470a-861d-9b48b610bbee   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-1-rustfs-2   Bound    pvc-8d7b98e0-ff0b-4d5f-869c-fe7c1b71ffc2   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-1-rustfs-3   Bound    pvc-9268589f-7ca7-4480-a724-36bfcdc29cff   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-2-rustfs-0   Bound    pvc-f31689f3-1aa8-42f7-8fcb-f309a6b390b5   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-2-rustfs-1   Bound    pvc-28fecb41-9dd7-436d-9317-e8a3a588a87a   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-2-rustfs-2   Bound    pvc-77d4c8e6-918a-4b28-a2bc-408195f807d3   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-2-rustfs-3   Bound    pvc-6deab996-a8a3-4e02-ae6c-845f863526c0   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-3-rustfs-0   Bound    pvc-46c7cc1a-1f25-4c3e-8168-3c288ee552d5   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-3-rustfs-1   Bound    pvc-a0403935-2471-48d8-beac-fcf28fd85a7a   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-3-rustfs-2   Bound    pvc-d0c88736-ee1a-47e5-a335-53d086e87913   256Mi      RWO            directpv-min-io   <unset>                 61s
data-rustfs-3-rustfs-3   Bound    pvc-9fbac8a8-cb59-430b-abc1-4ad5105ed4ad   256Mi      RWO            directpv-min-io   <unset>                 61s
logs-rustfs-0            Bound    pvc-bc673cea-6cf0-479f-a323-5c2102479796   256Mi      RWO            directpv-min-io   <unset>                 61s
logs-rustfs-1            Bound    pvc-c823f3a4-2e07-4331-bdd3-f0c6172bb15b   256Mi      RWO            directpv-min-io   <unset>                 61s
logs-rustfs-2            Bound    pvc-059eeaf9-b209-41ec-87f6-da87f0105c41   256Mi      RWO            directpv-min-io   <unset>                 61s
logs-rustfs-3            Bound    pvc-348e4bfb-d272-4deb-ae8e-fc6ea70d4d74   256Mi      RWO            directpv-min-io   <unset>                 61s

可以看到生成了分布式安装所需的所有 PVC,状态是 Bound。接着查看 pods 状态:

kubectl -n rustfs get pods
NAME       READY   STATUS    RESTARTS   AGE
rustfs-0   1/1     Running   0          69s
rustfs-1   1/1     Running   0          69s
rustfs-2   1/1     Running   0          69s
rustfs-3   1/1     Running   0          69s

可以看到 pod 运行正常。接着就可以使用 ingress 来访问该 RustFS 实例了。

注意事项

安装 DirectPV 的过程中,会对该磁盘上的数据进行格式化,而且该磁盘不能被其他程序占用,否则会出现如下错误:


┌──────────────────────────────────────┬────────────────┬───────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ REQUEST_ID                           │ NODE           │ DRIVE │ MESSAGE                                                                                                                                                                                                                          │
├──────────────────────────────────────┼────────────────┼───────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ e9adb7af-8061-46b1-8112-d86e5fb653cd │ vm-0-17-ubuntu │ vdb   │ Failed; unable to format device /dev/vdb; unable to execute command [mkfs.xfs -i maxpct=50 -m uuid=2be5b9cc-beeb-4d54-bbcb-a1cbc5f0ef97 -f -L DIRECTPV /dev/vdb]; output=mkfs.xfs: cannot open /dev/vdb: Device or resource busy │
│                                      │                │       │ ; error=exit status 1                                                                                                                                                                                                            │
└──────────────────────────────────────┴────────────────┴───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

可以通过将此磁盘 umount 来解决。

本文以麒麟V10为例,演示超简单离线部署k8s 1.32.11

1 说明

关于kt

kt是基于kk二次开发产物,具备kk的所有功能,二开重点适配了信创国产化环境。

主要改进包括:简化arm架构部署过程、支持国产化和国际环境在线、离线部署及一条命令所有节点初始化

支持arm64amd64架构操作系统,已适配芯片+操作系统 如下:

  • CPU: 鲲鹏、飞腾、海光、兆芯、intel、amd 等。
  • OS: Centos、Ubuntu、Debian、银河麒麟V10、麒麟国防版、麒麟信安、中标麒麟V7、统信UOS、华为欧拉、移动大云、阿里龙蜥、TencentOS等。

注:本文使用kt版本3.1.13

2.环境准备

服务器基本信息

主机名架构OS配置IP
masterx86_64麒麟V102核4G192.168.85.153

2.1 上传离线制品

操作系统不需要安装docker,不需要设置selinux,swap等操作,全新的操作系统即可。

将离线制品、配置文件、kt和sh脚本上传至服务器其中一个节点(本文以master为例),后续在该节点操作创建集群。

2.2 修改配置文件

根据实际服务器信息,配置到生成的config-sample.yaml

kind: Cluster
metadata:
  name: sample
spec:
  hosts:
  - {name: master, address: 192.168.85.160, internalAddress: 192.168.85.143, user: root, password: "123123"}
  roleGroups:
    etcd:
    - master
    control-plane:
    - master
    worker:
    - master
    # 如需使用 kk 自动部署镜像仓库,请设置该主机组 (建议仓库与集群分离部署,减少相互影响)
    # 如果需要部署 harbor 并且 containerManager 为 containerd 时,由于部署 harbor 依赖 docker,建议单独节点部署 harbor
    registry:
    - master
  controlPlaneEndpoint:
    ## Internal loadbalancer for apiservers 
    internalLoadbalancer: haproxy

    domain: lb.kubesphere.local
    address: ""
    port: 6443
  kubernetes:
    version: v1.32.11
    clusterName: cluster.local
    autoRenewCerts: true
    containerManager: docker
  etcd:
    type: kubekey
  network:
    plugin: calico
    kubePodsCIDR: 10.233.64.0/18
    kubeServiceCIDR: 10.233.0.0/18
    ## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
    multusCNI:
      enabled: false
  registry:
    type: harbor
    registryMirrors: []
    insecureRegistries: []
    privateRegistry: "dockerhub.kubekey.local"
    namespaceOverride: "kubesphereio"
    auths: # if docker add by `docker login`, if containerd append to `/etc/containerd/config.toml`
      "dockerhub.kubekey.local":
        username: "admin"
        password: Harbor@123 # 此处可自定义,kk3.1.8新特性
        skipTLSVerify: true # Allow contacting registries over HTTPS with failed TLS verification.
        plainHTTP: false # Allow contacting registries over HTTP.
        certsPath: "/etc/docker/certs.d/dockerhub.kubekey.local"
  addons: []

2.3 系统初始化

解压kt-x86.tar.gz文件后执行./kt init-os -f config-sample.yaml 已适配操作系统和架构见1.说明

该命令kt会根据配置文件自动判断操作系统和架构以完成所有节点的初始化配置和依赖安装。

3 创建 Harbor私有仓库

3.1 创建镜像仓库

./kt init registry -f config-sample.yaml -a artifact-x86-k8s13211.tar.gz

此命令会在harbor节点自动安装dockerdocker-compose

3.2 创建harbor项目

创建 Harbor 项目

chmod +x create_project_harbor.sh && ./create_project_harbor.sh

4 创建k8s

./kt create cluster -f config-sample.yaml -a artifact-x86-k8s13211.tar.gz --with-local-storage

此命令kt会自动将离线制品中的镜像推送到harbor 私有仓库

执行后会有如下提示,输入yes/y继续执行

继续等待一段时间最终可以看到安装成功的消息

验证

5 总结

本文主要以离线方式部署,适用于在线和离线两种状态,而如果在线状态,那么步骤3可忽略,两条命令即可搞定。

配合最新版kt,系统初始化从未如此简单,不论x86还是arm,不论在线还是离线,不论国际还是国产操作系统,统统搞定。

最新消息,Apache DolphinScheduler 3.4.0 已正式发布!

本次版本带来了多租户调度隔离、工作流并行性能优化、任务重试与告警机制增强,以及资源管理和日志处理改进。无论是复杂企业业务场景,还是高并发任务调度,3.4.0 都让系统更高效、更可靠、更易用。立即升级,体验全新调度能力!

升级与下载

下载页面(可选择镜像下载):
https://dolphinscheduler.apache.org/zh-cn/download/3.4.0

GitHub Release 页面
https://github.com/apache/dolphinscheduler/releases/tag/3.4.0
升级时建议参考官方文档中的集群升级指南,确保兼容性和配置一致性。

核心功能增强与重要更新

通用 OIDC 认证支持

3.4.0 引入了对 OpenID Connect(OIDC)的通用支持,旨在简化与企业身份认证系统的集成。通过 OIDC,用户可以使用统一的身份提供商(如 Keycloak、Okta 等)进行 SSO 登录,无需额外实现复杂自定义逻辑。这提升了安全性和用户体验,尤其是在多系统联邦登录与统一认证场景中,能够使 DolphinScheduler 更自然地融入企业级认证体系,减少重复配置和验证成本,从而提高登录配置的扩展性和一致性。


(参考图)

gRPC 任务插件支持

本版本新增了 gRPC 任务插件能力,使调度器能够通过原生 gRPC 协议直接与远程服务交互。用户可以将后端微服务暴露的 gRPC 接口作为任务执行目标,无需中间脚本封装。这种方式特别适合微服务生态或跨语言执行场景,通过明确参数契约和高性能通信协议提升任务整合效率,从而减少资源调度延迟、提高任务可靠性。

支持工作流串行策略

实现了 工作流串行执行策略(Workflow Serial Strategy) 的核心逻辑重构,通过引入一个全新的串行命令队列机制(t_ds_serial_command 表及相关 DAO/Mapper),配合一套串行执行协调器(WorkflowSerialCoordinator)及策略处理器,使 DolphinScheduler 能更智能地管理串行类型的工作流(如 SERIAL_WAITSERIAL_PRIORITYSERIAL_DISCARD)。

该设计改进了工作流触发流程的执行类型判断、状态管理、命令队列处理等关键路径,使串行调度逻辑更清晰、更可靠,有助于提升串行工作流场景下的调度稳定性与可控性。同时,3.4.0 重构了触发器与状态机相关代码,增强该能力的可维护性和扩展性。

移除 PyTorch 任务类型

3.4.0 对任务类型体系进行了精简,正式移除了内置的 PyTorch 任务类型。该调整主要基于实际使用情况和长期维护成本的考量,因为原有 PyTorch 任务实现使用率较低,且与调度器核心任务模型耦合度较高,增加了版本演进和兼容性维护的复杂度。通过移除该任务类型,DolphinScheduler 能保持核心架构的简洁与稳定。

我们鼓励用户通过更通用的 Shell、Python 或插件化方式运行 PyTorch 作业,从而提升系统整体的可维护性和扩展性。

稳定性与重要修复

Kubernetes Worker 部署增强

在 Kubernetes 原生部署场景下,3.4.0 使 Worker StatefulSet 的 Helm Chart 支持注入 Secrets 和 InitContainers。通过 Secrets 注入,可以安全传递证书或凭据;InitContainers 允许在主容器启动前完成必要的初始化逻辑,如准备文件系统或校验环境依赖。

这些增强有助于在容器化环境下实现更安全、更一致的部署策略和生命周期管理。

SQL 任务取消能力

针对 SQL 任务类型,本次版本提供了对任务执行取消的原生支持。当执行的 SQL 语句由于逻辑错误或长期运行导致资源占用时,用户可以通过调度器下发取消操作,使任务尽快中止,而不是简单失败或等待超时。这一能力改善了任务控制能力,避免长时间运行对集群资源的无效占用,有助于提升整体资源利用率和执行调度体验。

条件任务节点在前置失败情况下执行逻辑修复

在某些复杂工作流中,当条件任务节点的前置任务失败时,条件节点未按预期执行。3.4.0 修复了这一调度核心逻辑,确保条件节点能够正确响应前置失败状态。这样,工作流分支逻辑能够按照既定 DAG 定义可靠运行,从而避免因逻辑错误导致的流程中断或不一致执行。

ZooKeeper 节点清理问题修复

在使用 ZooKeeper 作为协调组件的高可用部署中,部分用户反馈 Master Server 在启动失败后未正确清理已注册的 failover 节点路径,可能导致后续状态异常。该版本修复了这个问题,使 Master 在异常启动路径中能够正确清理关联注册节点,保持注册中心状态一致,确保高可用场景下集群状态的健康和可靠性。

Worker Group 分配逻辑错误修复

此前版本中,项目与 Worker Group 关联/移除操作可能在 API 层出现逻辑不一致,导致调度器未能正确识别项目与 Worker Group 的关系。本次版本修正了相关逻辑,使 API 行为与用户预期一致,从而改善 Worker 管控、资源隔离和调度分配体验。

此外,3.4.0 版本还进行了很多功能优化和问题修复,包括文档与配置规范完善(时区、安全、负载均衡)、核心调度与注册中心稳定性增强(TraceId、Failover 清理、可重入锁)、性能与资源管理优化(任务组索引)、前端与插件体验改进(日志查询、DataX 校验、文件展示)、依赖与安全更新(PostgreSQL JDBC、Spring Boot CVE 修复)等,篇幅所限不再一一展开,详情可查询完整更新列表:https://github.com/apache/dolphinscheduler/releases/tag/3.4.0

Bug 修复亮点

标记任务为 Inactive 状态逻辑修复

某些生命周期事件中,当任务状态需要被标记为 Inactive 时,状态变更可能未正确触发,导致 UI 和执行引擎状态不一致。此版本修复了这一逻辑,使状态标记与生命周期事件更加一致。

Workflow Lineage 删除逻辑优化

在工作流血缘关系删除操作中,系统可能未能彻底清理相关引用,导致历史血缘链路残留。3.4.0 改进了删除逻辑,使 DolphinScheduler 在删除血缘链时能够更精确地清理对应关系,避免分析后续依赖时出现错误链路。

其他 Bug 修复包括前置任务失败导致条件节点不执行问题修复、项目级 Worker Group 绑定与移除逻辑修正、子工作流触发参数丢失问题修复等,详情请查询完整 Release Note:https://github.com/apache/dolphinscheduler/releases/tag/3.4.0

文档更新

  1. 发布并完善 Apache DolphinScheduler 3.3.2 版本发布说明文档。
  2. 修复文档 CI 构建错误,提升文档发布流程的稳定性。
  3. 补充 Prometheus 指标接口的认证机制及其在 Kubernetes 环境下的使用说明。
  4. 同步更新 JdbcRegistry 引入事务机制后的相关文档描述,保证文档与实际行为一致。

致谢

本次版本发布离不开社区各位贡献者的热情参与与支持。特别感谢 @ Gallardot 作为 3.4.0 的 Release Manager,从版控、构建、候选版验证到最终投票组织,确保发布流程高质量推进。

同时,感谢以下本次版本的所有贡献者(GitHub ID,排名不分先后):

Gallardot、njnu‑seafish、det101、Mrhs121、EinsteinInIct、sanfeng‑lhh、ruanwenjun、tusaryan、qiong‑zhou、SbloodyS、kvermeulen、npofsi、CauliflowerEater、ChaoquanTao、dill21yu、sdhzwc、zhan7236、KwongHing、jmmc‑tools、liunaijie

感谢所有通过提交 PR、Issue、文档贡献、社区讨论、测试验证等方式参与 Apache DolphinScheduler 项目的人。正是你们的努力推进了 DolphinScheduler 的持续演进与社区繁荣,欢迎更多人加入我们的队伍!

Salesforce已完成对 1000 多个 AmazonElastic Kubernetes Service(EKS)集群从 Kubernetes Cluster Autoscaler 到Karpenter的分阶段性迁移,Karpenter 是 AWS 的开源节点配置和自动伸缩解决方案。这次大规模转型旨在减少扩展延迟,简化操作,降低成本,并为公司广泛的 Kubernetes 团队内部开发人员提供更灵活自助的基础设施。

 

面对基于自动伸缩组的自动伸(Auto Scaling)和集群自动伸缩(Cluster Autoscaler)的限制,包括扩展速度慢、跨可用区利用率低以及成千上万的节点组的激增,Salesforce 的平台团队构建了自定义工具来安全、可靠地自动化和管理迁移。这种方法结合了精心编排的节点转换和自动化,尊重 Pod 中断预算(Pod Disruption Budgets,PDBs),支持回滚路径,并与公司的 CI/CD 配置管道集成。

 

迁移之旅始于 2025 年中期的低风险环境,并在 2026 年初投入生产之前经历了测试和验证阶段。Salesforce 的工程师开发了一种内部 Karpenter 转换工具和补丁检查,可以处理节点轮换、亚马逊机器镜像(Amazon Machine Image,AMI)验证和优雅的 Pod 驱逐,从而实现了跨不同节点池配置的可重复和一致的转换。

 

通过这次转型,团队解决了操作上的挑战,例如配置错误的 PDBs 阻止了节点替换、Kubernetes标签长度限制导致自动化失败,以及 Karpenter 高效打包需要调整以防止单副本应用程序中断的工作负载模式。这些见解导致了改进的实践,包括主动策略验证和工作负载感知中断策略。

 

Salesforce 报告了迁移后可衡量的操作和成本改善。通过采用 Karpenter 的动态配置模型,集群扩展延迟从分钟减少到几秒,通过更智能的打包提高了节点利用率,并显著减少了对静态自动伸缩组的依赖。

 

由于自动化流程取代了手动节点组管理,使开发人员可以自己声明节点池配置,操作开销减少了大约 80%。这种加速的采用减少了对中央平台团队的依赖。此外,初步结果显示,2026 财年成本节省了约 5%,预计随着 Karpenter 的打包和现货实例利用率继续优化资源,预计 2027 财年将进一步减少 5-10%。

 

Salesforce 的迁移突出了大规模 Kubernetes 操作中的更广泛趋势,其中传统的自动伸缩机制难以跟上动态工作负载和异构基础设施需求的步伐。Karpenter 的实时决策、对异构实例类型的支持(包括 GPU 和 ARM)以及与云 API 的更紧密集成,与集群自动伸缩器相比,实现了更快的响应和更高效的节点使用。

 

其他从传统的 Kubernetes 自动伸缩向 Karpenter 等更动态的解决方案进行大规模过渡的组织面临了许多与 Salesforce 记录的相同结构性挑战。例如,Coinbase公开描述了其向 Karpenter 的转变,以处理具有变化需求模式的复杂混合工作负载集群,提到了扩展延迟和资源效率的改善,同时减少了静态节点组引起的操作摩擦。同样,宝马集团分享了在其汽车平台上采用 Karpenter 如何更好地利用现货实例和工作负载感知调度,实现了更快的开发人员反馈循环和降低基础设施成本波动。这些案例呼应了 Salesforce 的观察,即集群自动伸缩器依赖于预定义的自动伸缩组和较慢的决策路径,可能会阻碍具有多样化和突发工作负载的环境的响应能力。

 

Salesforce 迁移的不同之处在于其规模和自动化工具:转换超过 1000 个不同的 EKS 集群需要定制工具来处理策略验证、Pod 中断预算限制、Kubernetes 标签限制和舰队级别的增量推出自动化。其他公司报告了在个别集群或较小舰队中从 Karpenter 中的获益,但 Salesforce 的方法强调了在企业规模上可重复、自动化的转换,集成了回滚和合规性保障。在实践中,这意味着不仅要替换自动伸缩逻辑,还要协调工作负载模式、治理控制和全球平台上开发人员的自助服务期望。虽然这些迁移的最终目标是更快的扩展、更好的利用率和减少手动开销,但 Salesforce 的蓝图突出了将这些好处带给大型、生产关键环境所需的操作规程和自定义自动化。

 

随着企业越来越多地采用 Kubernetes 来支持关键任务服务,Salesforce 的经验为其他考虑类似转型的组织提供了一个蓝图,证明了自动化、联合自动扩展可以带来性能、成本效率和开发者速度的显著提升——前提是必须有周密的规划和工具支持来支撑这一变化。

 

原文链接:

https://www.infoq.com/news/2026/01/salesforce-eks-karpenter/

写在前面,本人目前处于求职中,如有合适内推岗位,请加:lpshiyue 感谢。同时还望大家一键三连,赚点奶粉钱。

现代软件发布不是简单的替换操作,而是在用户体验、风险控制和业务价值之间的精细平衡艺术

在掌握了Kubernetes的核心概念后,我们面临一个更关键的挑战:如何安全高效地将新版本软件交付给用户。灰度发布与蓝绿发布作为两种主流的现代发布策略,通过智能的流量控制和版本管理,实现了发布过程的风险可控用户体验无损。本文将深入探讨这两种策略的技术实现、适用场景及最佳实践。

1 发布策略的本质:风险控制与用户体验的平衡

1.1 传统发布方式的挑战与风险

在单体应用时代,停机发布是常见做法,但伴随着明显的业务中断和回滚困难。随着微服务架构的普及,系统复杂度呈指数级增长,简单的全量发布方式已无法满足业务连续性要求。

发布过程中的核心风险包括:

  • 业务中断风险:新版本缺陷导致服务不可用
  • 数据一致性风险:版本切换过程中的数据丢失或错乱
  • 用户体验风险:发布期间的服务降级或功能异常
  • 回滚复杂度:出现问题时的快速恢复能力

根据行业数据,超过70%的生产环境事故与发布过程相关,而合理的发布策略能将此风险降低80%以上。

1.2 现代发布策略的演进逻辑

现代发布策略从"一刀切"向精细化、可控化方向演进,核心思路是将发布过程从事件转变为过程,通过流量控制、渐进式验证等手段降低风险。

graph TD
    A[传统停机发布] --> B[蓝绿发布]
    B --> C[灰度发布]
    C --> D[功能开关发布]
    D --> E[影子测试]
    
    style A fill:#f9d5c8
    style B fill:#c8e6f5
    style C fill:#d4edda
    style D fill:#f0e6f5
    style E fill:#fff2cc

发布策略的演进路径,从高风险到高安全性的过渡

2 蓝绿发布:快速切换的确定性艺术

2.1 蓝绿发布的核心理念与架构

蓝绿发布的本质是环境冗余策略,通过维护两套完全独立的环境(蓝色代表当前生产环境,绿色代表新版本环境),实现版本的瞬时切换快速回滚

架构设计要点

  • 环境隔离:蓝色和绿色环境完全独立,包括计算、网络、存储资源
  • 数据兼容性:确保新版本对现有数据的前向兼容性
  • 流量切换机制:通过负载均衡器或API网关实现流量无缝切换

2.2 技术实现路径

在Kubernetes环境中,蓝绿发布可以通过Service的标签选择器巧妙实现:

# 蓝色环境(当前生产版本)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
      version: blue  # 版本标识
  template:
    metadata:
      labels:
        app: my-app
        version: blue
    spec:
      containers:
      - name: app
        image: my-app:v1.0.0
        ports:
        - containerPort: 8080

# 绿色环境(新版本)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-green
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
      version: green  # 版本标识
  template:
    metadata:
      labels:
        app: my-app
        version: green
    spec:
      containers:
      - name: app
        image: my-app:v1.1.0
        ports:
        - containerPort: 8080

# Service配置,通过修改selector实现切换
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: my-app
    version: blue  # 初始指向蓝色环境
  type: LoadBalancer

切换操作命令

# 从蓝色切换到绿色环境
kubectl patch service app-service -p '{"spec":{"selector":{"version":"green"}}}'

# 快速回滚到蓝色环境
kubectl patch service app-service -p '{"spec":{"selector":{"version":"blue"}}}'

2.3 适用场景与优缺点分析

蓝绿发布的优势

  • 快速回滚:秒级切换回旧版本
  • 风险隔离:新旧版本完全隔离,互不影响
  • 测试验证:可在生产环境隔离测试新版本
  • 简单可靠:技术实现相对简单,易于理解

局限性考量

  • 资源消耗:需要双倍基础设施资源
  • 数据兼容性:需确保双版本对数据结构的兼容
  • 状态管理:有状态应用的处理较为复杂
  • 切换瞬时性:全量切换,无法渐进验证

最佳适用场景

  • 版本间变更较大,需要完全隔离测试
  • 对回滚速度要求极高的业务场景
  • 基础设施资源充足,可承担冗余成本
  • 发布频率相对较低的应用

3 灰度发布:渐进式验证的精细控制

3.1 灰度发布的哲学与价值主张

灰度发布(又称金丝雀发布)源于矿业中的金丝雀预警机制,通过将新版本逐步暴露给少量用户,实现风险早期发现影响范围控制

与蓝绿发布的二元切换不同,灰度发布强调渐进式数据驱动的发布理念,将发布过程从技术决策转变为业务验证过程。

3.2 流量切分策略与技术实现

3.2.1 基于权重的流量切分

在Kubernetes中,最简单的灰度发布可以通过调整Deployment的副本数实现:

# v1版本(现有版本)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-v1
spec:
  replicas: 9  # 90%流量
  selector:
    matchLabels:
      app: my-app
      version: v1.0
  template:
    metadata:
      labels:
        app: my-app
        version: v1.0
    # ... 其他配置

# v2版本(新版本)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-v2
spec:
  replicas: 1  # 10%流量
  selector:
    matchLabels:
      app: my-app
      version: v1.1
  template:
    metadata:
      labels:
        app: my-app
        version: v1.1
    # ... 其他配置

# Service配置,同时选择两个版本
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: my-app  # 不指定版本,选择所有匹配的Pod
  type: LoadBalancer

3.2.2 基于特征的精细化路由

对于更复杂的场景,可以使用Service Mesh或Ingress控制器实现基于请求特征的精细路由:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-canary-ingress
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10"  # 10%流量到新版本
    nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"  # 基于Header
    nginx.ingress.kubernetes.io/canary-by-header-value: "true"
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app-service
            port:
              number: 80

3.3 渐进式发布流程设计

科学的灰度发布需要制定清晰的阶段规划验收标准

graph LR
    A[内部测试 1%] --> B[特定用户 5%]
    B --> C[小范围用户 20%]
    C --> D[半数用户 50%]
    D --> E[全量发布 100%]
    
    style A fill:#ffcccc
    style B fill:#ffebcc
    style C fill:#ffffcc
    style D fill:#ebffcc
    style E fill:#ccffcc

渐进式灰度发布流程,每个阶段都有明确的验收指标

各阶段验收指标

  • 内部测试阶段:基础功能验证、性能基准测试
  • 特定用户阶段:业务逻辑验证、用户体验收集
  • 小范围用户阶段:稳定性监控、错误率统计
  • 半数用户阶段:负载能力验证、性能指标对比
  • 全量发布阶段:全面监控、问题应急响应

3.4 适用场景与价值分析

灰度发布的独特价值

  • 风险控制:问题影响范围可控,最大程度减少业务影响
  • 数据驱动:基于真实用户数据做出发布决策
  • 用户体验:无缝渐进,用户无感知
  • 灵活调整:可根据验证结果动态调整发布策略

实施挑战

  • 复杂度高:需要完善的监控和自动化工具支持
  • 周期较长:完整的灰度流程需要较长时间
  • 技术门槛:需要专业的SRE团队进行维护和决策

理想适用场景

  • 用户量较大,故障影响范围需要严格控制
  • 需要真实用户数据验证新功能效果
  • 技术团队具备较强的监控和自动化能力
  • 对业务连续性要求极高的核心业务

4 关键支撑技术:流量治理与指标监控

4.1 智能流量切分策略

现代发布策略依赖于精细化的流量控制能力,常见的流量切分维度包括:

基于权重的随机切分

# 使用Istio进行权重配置
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: app-virtual-service
spec:
  hosts:
  - app.example.com
  http:
  - route:
    - destination:
        host: app-service
        subset: v1
      weight: 90  # 90%流量到v1
    - destination:
        host: app-service
        subset: v2
      weight: 10  # 10%流量到v2

基于请求特征的定向路由

  • 用户标识:特定用户群体优先体验新功能
  • 地理区域:从特定区域开始逐步扩大
  • 设备类型:按设备类型分别发布
  • 业务重要性:从非核心业务到核心业务渐进

4.2 多层次监控指标体系

有效的发布策略需要完善的监控验证体系,关键指标包括:

业务层面指标

  • 请求成功率、错误率分布
  • 业务转化率、关键路径完成率
  • 用户满意度、投诉率变化

技术层面指标

  • 应用性能:响应时间、吞吐量、错误率
  • 系统资源:CPU、内存、网络使用率
  • 中间件状态:数据库连接数、缓存命中率

自动化验收与决策
通过监控指标设置自动化的发布门禁,当关键指标异常时自动暂停或回滚发布:

# Kruise Rollout的自动化验收配置示例
apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
metadata:
  name: app-rollout
spec:
  strategy:
    canary:
      steps:
      - weight: 10
        pause: {duration: 300}  # 暂停5分钟进行验证
      - weight: 30
        pause: {duration: 600}
      - weight: 100
        pause: {duration: 0}
      metrics:
      - name: error-rate
        threshold: "5"  # 错误率阈值5%
        interval: 60s   # 每60秒检查一次
      - name: p99-latency  
        threshold: "500"  # P99延迟阈值500ms
        interval: 60s

4.3 回滚策略与版本管理

自动化回滚机制是发布安全的重要保障,需要建立多级别的回滚策略:

指标驱动回滚:当关键监控指标超过阈值时自动触发回滚
人工决策回滚:基于业务判断手动触发回滚
渐进式回滚:逐步减少新版本流量,而非直接全量回滚

版本管理最佳实践

  • 语义化版本控制:明确版本间的兼容性承诺
  • 版本元数据管理:记录每个版本的变更内容、已知问题等信息
  • 发布文档化:每个发布版本都有详细的发布说明和回滚指南

5 发布策略的选择与组合实践

5.1 决策框架:如何选择合适的发布策略

发布策略的选择需要综合考虑技术能力业务需求风险承受能力多个维度:

考虑维度蓝绿发布灰度发布滚动发布
团队技能入门级~中级中高级~专家级中级
基础设施资源充足资源弹性较好资源有限
发布频率低~中频中~高频高频
风险容忍中等容忍低容忍度中等容忍
回滚要求快速回滚渐进回滚缓慢回滚

5.2 混合策略:结合实际场景的灵活运用

在实际生产环境中,往往需要根据具体场景组合使用多种发布策略:

蓝绿+灰度组合

  1. 首先通过蓝绿发布搭建新版本环境
  2. 在新环境内进行灰度发布,逐步扩大流量
  3. 验证通过后全量切换,旧环境作为回滚备胎

功能开关+灰度发布

  1. 通过功能开关控制新功能的代码路径
  2. 结合灰度发布逐步开放给更多用户
  3. 出现问题时可快速通过功能开关关闭新功能

5.3 组织流程与文化建设

技术策略的实施需要相应的组织流程团队文化支持:

发布审批流程:建立基于风险的发布审批机制
发布窗口管理:根据业务特征选择合适的发布时机
跨团队协作:开发、测试、运维、业务的紧密配合
持续改进文化:每次发布后进行复盘和优化

总结

灰度发布与蓝绿发布代表了现代软件工程的精细化运维理念,通过技术手段将发布过程从"高风险事件"转变为"可控过程"。这两种策略各有侧重,适用于不同场景,但核心目标一致:在保证业务连续性的前提下,安全高效地交付用户价值。

关键成功因素

  1. 技术基础设施:完善的监控体系、自动化工具链、弹性基础设施
  2. 数据驱动决策:基于真实指标而非直觉的发布决策
  3. 组织协作能力:跨团队的高效协作与明确的责任划分
  4. 渐进式思维:小步快跑,快速验证,及时调整

随着云原生技术的普及,发布策略正在向更加智能化自动化的方向发展。未来,基于AI的预测性发布、自适应流量调度等新技术将进一步降低发布风险,提升交付效率。


📚 下篇预告
《全栈监控与告警设计——从SLO到告警规则,避免告警雪崩的分级体系》—— 我们将深入探讨:

  • 📊 SLO量化管理:将业务目标转化为可衡量的服务质量指标
  • 🚨 告警分级体系:基于影响范围和紧急程度的分类标准
  • 智能降噪策略:避免告警雪崩的聚合与抑制机制
  • 🔄 闭环管理流程:从告警产生到解决的全生命周期管理
  • 📈 可观测性成熟度:构建层层递进的监控能力体系

点击关注,构建稳定可靠的监控告警体系!

今日行动建议

  1. 评估当前业务的发布风险承受能力,选择合适的发布策略起点
  2. 建立关键的发布监控指标体系,制定明确的验收标准
  3. 设计自动化回滚流程,确保出现问题时的快速恢复能力
  4. 规划渐进式发布路线图,从简单场景开始逐步完善发布能力

Centos虽然已经停止维护了,而且内核也非常低,耐不住国内大环境很多公司还是一直在用它。时不时见到有人想要在centos上面部署k8s1.23版本,本文将以centos 7为例,从0开始搭建k8s+ks集群。

1.说明

关于kt

kt是基于kk二次开发的产物,具备kk的所有功能。二开主要为适配信创国产化环境、简化arm部署过程和国产化环境离线部署。支持arm64amd64架构国产操作系统,已适配芯片+操作系统 如下。

kt新增功能点

  • 适配arm架构harbor和支持,部署体验与X86一样简单。
  • 离线环境部署增强。常用国际和国产操作系统依赖,内置到安装包中。已适配芯片和操作系统如下

    • ./kt init-os 一条命令完成操作系统依赖安装和初始化操作。
    • CPU:鲲鹏、飞腾、海光、兆芯、intel、amd等。
    • OS:Centos、Rocky Linux、Ubuntu、Debian、银河麒麟V10、麒麟V11、麒麟国防版、麒麟信安、中标麒麟V7、统信UOS、华为欧拉、移动大云、阿里龙蜥、TencenOS等。
  • 支持开启防火墙,只暴露30000-32767端口,其他k8s端口添加到节点白名单。

    • ./kt firewall 一条命令自动获取节点信息开白名单和防火墙。

kt版本更新和下载地址

  • kt:kt
  • 关注我不迷路

2.环境准备

服务器基本信息

主机名架构OS配置IP
all-in-onex86_64Centos 74核8G192.168.85.164

2.1 上传离线制品

操作系统不需要安装docker,不需要设置selinux,swap等操作,全新的操作系统即可。

将离线制品、配置文件、kt和sh脚本上传至服务器其中一个节点(本文以master为例),后续在该节点操作创建集群。本文使用kt:3.1.12-centos版本

2.2 修改配置文件

根据实际服务器信息,配置到生成的config-sample.yaml

kind: Cluster
metadata:
  name: sample
spec:
  hosts:
  - {name: node1, address: 192.168.85.164, internalAddress: 192.168.85.164, user: root, password: "123123"}
  roleGroups:
    etcd:
    - node1
    control-plane:
    - node1
    worker:
    - node1
    # 如需使用 kk 自动部署镜像仓库,请设置该主机组 (建议仓库与集群分离部署,减少相互影响)
    # 如果需要部署 harbor 并且 containerManager 为 containerd 时,由于部署 harbor 依赖 docker,建议单独节点部署 harbor
    registry:
    - node1
  controlPlaneEndpoint:
    ## Internal loadbalancer for apiservers 
    internalLoadbalancer: haproxy

    domain: lb.kubesphere.local
    address: ""
    port: 6443
  kubernetes:
    version: v1.23.17
    clusterName: cluster.local
    autoRenewCerts: true
    containerManager: docker
  etcd:
    type: kubekey
  network:
    plugin: calico
    kubePodsCIDR: 10.233.64.0/18
    kubeServiceCIDR: 10.233.0.0/18
    ## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
    multusCNI:
      enabled: false
  registry:
    type: harbor
    registryMirrors: []
    insecureRegistries: []
    privateRegistry: "dockerhub.kubekey.local"
    namespaceOverride: "kubesphereio"
    auths: # if docker add by `docker login`, if containerd append to `/etc/containerd/config.toml`
      "dockerhub.kubekey.local":
        username: "admin"
        password: Harbor@123 # 此处可自定义,kk3.1.8新特性
        skipTLSVerify: true # Allow contacting registries over HTTPS with failed TLS verification.
        plainHTTP: false # Allow contacting registries over HTTP.
        certsPath: "/etc/docker/certs.d/dockerhub.kubekey.local"
  addons: []
  ---

2.3 系统初始化

解压kt-centos.tar.gz文件后执行./kt init-os -f config-sample.yaml 已适配操作系统和架构见1.说明

该命令kt会根据配置文件自动判断操作系统和架构以完成所有节点的初始化配置和依赖安装。

3 创建 Harbor私有仓库

3.1 创建镜像仓库

./kt init registry -f config-sample.yaml -a artifact-x86-k8s12317-ks3.4.1.tar.gz

此命令会在harbor节点自动安装dockerdocker-compose

3.2 创建harbor项目

<font style="background-color:rgb(255,245,235);">说明:</font>

<font style="background-color:rgb(255,245,235);">Harbor 管理员账号:</font><font style="background-color:rgb(255,245,235);">admin</font><font style="background-color:rgb(255,245,235);">,密码:</font><font style="background-color:rgb(255,245,235);">Harbor@123</font><font style="background-color:rgb(255,245,235);">。密码同步使用配置文件中的对应password</font>

<font style="background-color:rgb(255,245,235);">harbor 安装文件在 </font><font style="background-color:rgb(255,245,235);">/opt/harbor</font><font style="background-color:rgb(255,245,235);"> 目录下,可在该目录下对 harbor 进行运维。</font>

创建 Harbor 项目

chmod +x create_project_harbor.sh && ./create_project_harbor.sh

4 创建k8s和KubeSphere

./kt create cluster -f config-sample.yaml -a artifact-x86-k8s12317-ks3.4.1.tar.gz

此命令kt会自动将离线制品中的镜像推送到harbor 私有仓库

执行后会有如下提示,输入yes/y继续执行

等待一段时间,直至出现熟悉的等待安装完成的小箭头>>--->

期间可以另开一个窗口用以下命令查看部署日志

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f

继续等待一段时间最终可以看到安装成功的消息

5 验证

登录页面

集群管理

监控告警

配置文件默认只安装了监控,如果需要安装其他组件,可以自行在自定义资源中开启

数字公告板提供商 Pinterest 发布了一篇文章,解释了其新平台Moka在大规模数据处理方面的未来蓝图。该公司正在将核心工作负载从老化的 Hadoop 基础设施迁移到基于 Kubernetes 的系统上,该系统运行在亚马逊 EKS 上,以 Apache Spark 作为主要引擎,并即将支持其他框架。

 

在一个包含两篇文章的博客系列中,Soam Acharya、Rainie Li、William Tom 和 Ang Zhang 描述了 Pinterest 大数据平台团队如何考虑下一代大规模数据处理平台的替代方案,因为现有的基于 Hadoop 的系统(内部称为 Monarch)的局限性变得越来越明显。他们将 Moka 作为搜索的结果,以及基于 EKS 的云原生数据处理平台,该平台现在运行的生产负载达到了 Pinterest 的规模。该系列的第一部分关注整体设计和应用层。相比之下,第二部分转向作者所说的“Moka 的基础设施重点方面,包括经验和未来方向”。

 

文章从实际角度描述了向 Kubernetes 的转变。它展示了一个全行业的转变,即大型技术公司现在将 Kubernetes 视为数据的控制平面,而不仅仅是无状态的服务平台。在大数据社区日益增长的受欢迎程度和越来越多的采用的鼓励下,团队探索了基于 Kubernetes 的系统,作为 Hadoop 2.x 最有可能的替代品。任何候选平台都必须满足可扩展性、安全性、成本以及托管多个处理引擎的精确标准。Moka 是如何在不放弃现有 Spark 投资的情况下现代化 Hadoop 时代的数据平台的一个例子。

 

第二篇文章的核心主题是如何在 Kubernetes 上以非常大的规模运行 Spark。作者解释了他们如何围绕 Moka 添加日志、指标和作业历史服务,以便工程师可以在不了解底层集群拓扑的情况下调试和调整作业。他们使用 Fluent Bit 对日志集合进行标准化,并使用 OpenTelemetry 和 Prometheus 兼容的端点发布统一指标。这为基础设施和应用程序团队提供了系统健康的一致视图。

 

Pinterest 还投资于通过基础设施即代码的方式使平台可重复使用。在文章中,团队概述了他们如何使用 Terraform 和 Helm 创建 EKS 集群、配置网络和安全以及部署支持组件,如 Spark 历史服务器。

 

Pinterest 的工程师还讨论了处理不同的硬件架构。他们描述了他们如何构建多架构镜像,以便他们的数据工作负载在 Intel 和基于 ARM 的实例上运行良好,包括 AWS Graviton,并将此与集群规模的成本和效率目标联系起来。InfoQ 编辑 Eran Stiller 在 LinkedIn上对该项目中的总结指出,Moka“提供了容器级别的隔离、ARM 支持、YuniKorn 调度,并通过整合工作负载和跨实例类型的自动扩展实现了显著的成本节省”。这些细节将工作置于云用户寻求在不牺牲性能的情况下削减基础设施成本的更大趋势之中。

 

关于处理引擎的更广泛的行业对话为 Pinterest 的故事增添了细微差别。在另一篇LinkedIn帖子中,Acharya 写道:“虽然 Spark 是我们的主要主力,但 Moka 的成功意味着 Pinterest 的其他用例也在效仿:Flink Batch 已经投入生产,Apache Ray 紧随其后,Flink Streaming 也将在今年晚些时候推出”。通过对 Spark 和 Flink 技术的深入探讨,我们可以了解到这一点的重要性。强调 Spark 仍然非常适合大型批处理和交互式分析工作负载,而 Flink 是“为实时、有状态的流处理而构建的”,具有严格的逐事件处理。团队将 Moka 呈现为一个灵活的基础,可以根据特定工作负载的需求添加不同的引擎,而不是一个只支持 spark 的平台。

 

外部观察者从 Pinterest 案例中吸取了教训。ML工程师通讯将 Moka 文章描述为“在 Kubernetes 上部署 EKS 集群、Fluent Bit 日志、OTEL 指标管道、镜像管理和 Spark 的自定义 Moka UI”的例子,将其与其他现代数据基础设施案例研究并列。这些反应表明,Moka 被视为一类云原生数据系统的参考架构。

 

然而,团队确实将他们的迁移工作呈现为一个正在进行的旅程,而不是一个已经完成的项目。在博客和进一步的LinkedIn帖子中,Pinterest 作者讨论了“经验和未来的方向”,并描述了早期概念验证如何导致随着对新堆栈的信心增长而逐步远离 Hadoop 的迁移。Acharya 指出,“最好的问题出现在规模上”,构建平台涉及“解决难题”,因为团队转移了实际工作负载。对于其他组织来说,这种经验可能是最重要的教训。复制围绕 Kubernetes、EKS 和 Spark 的技术选择相对简单,但从遗留系统中解耦并投资于可观测性、自动化和多引擎支持的过程可能是未来真正的工作。

 

原文链接:

https://www.infoq.com/news/2026/01/pinterest-kubernetes-bigdata/

云原生热点

Agones 1.54.0 版本发布:计数器能力增强,GKE Autopilot 直通通信正式稳定

Agones 是一个开源的 K8s 原生游戏服务器托管与扩展框架,用于在 K8s 集群上运行、管理和自动扩缩专用游戏服务器资源。它通过自定义资源(如 GameServer、Fleet 等)和控制器,帮助开发者高效管理大规模实时游戏服务器生命周期与调度。

1.54.0 版本新增对 K8s v1.34 的支持,并强化了在 GKE Autopilot 场景下的端口直通能力;同时引入更完善的 Counter 状态工具,提升服务器状态可观测性,简化自动扩缩配置,并修复 Init Container 相关问题,整体提升了稳定性、易用性和云托管兼容能力。

Kube-OVN v1.15 发布:新年新版,网络功能再进化

Kube-OVN 是一个基于 OVN/Open vSwitch 的 K8s 云原生网络插件,将 SDN 虚拟网络能力引入容器网络,支持静态 IP 分配、VPC 多租户、灵活网络策略等丰富功能,提升集群网络可控性与性能。

Kube-OVN v1.15 近日成功发布,新版本重点增强网络灵活性与稳定性,支持更精细的 IPPool 绑定与管理,升级 OVS 和 OVN 核心组件,提升性能与安全性,同时强化监控与健康检查能力,并清理遗留代码,进一步提升生产环境下的可运维性与可靠性。

技术实践

文章推荐

K8s v1.35:云控制器管理器中的基于监视的路由协调

本文介绍了 K8s v1.35 在 Cloud Controller Manager(CCM)的路由控制器中新增特性门控 CloudControllerManagerWatchBasedRoutesReconciliation:将原先按固定间隔轮询对账,改为基于 informer 的 watch 机制,在节点增删或 .spec.podCIDRs.status.addresses 变化时触发对账,并保留 12–24 小时随机周期的补充对账,从而在路由无变化时显著减少对云厂商的无谓 API 请求,同时不改变既有对账逻辑,降低行为变化风险。

使用 clientcmd 进行统一的 API 服务器访问

本文介绍了 K8s 在 v1.35 中针对 clientcmd 访问 API Server 的改进(Uniform API server access using clientcmd),强调统一和简化使用 kubeconfig/clientcmd 与 API Server 交互的方式,使客户端(如 kubectl 或程序库)通过一致的配置和流程发现 API Server 地址、凭据与认证细节,从而减少重复配置和访问复杂度,提高与集群 API 交互的可靠性和开发效率,同时保持与现有访问机制兼容。

K8s 事故中惨痛教训揭示的隐藏不良实践

本文介绍了一些在生产事故中才暴露出来的 K8s 错误实践及其应避免的方式。文章由一位 SRE 工程师分享常见但常被忽视的错误做法,如错误配置探针/资源请求、缺乏网络策略、过度权限设置等,这些隐性坏习惯在集群运行和故障时会引发严重问题。作者结合实际事件,提出改善建议以提升集群稳定性与安全性,对于 K8s 生产环境的运维和 SRE 团队具有重要参考价值。

开源项目推荐

AIBrix

AIBrix 是一个开源的云原生大规模 LLM 推理基础设施框架,用于在 K8s 上高效部署、管理和扩展大型语言模型推理服务,支持路由、自动扩缩、分布式推理和 KV 缓存等关键能力,帮助企业构建可扩展、高性价比的生成式 AI 推理平台。它与 vLLM 紧密集成,适合生产环境和大规模应用场景。

Kyverno

Kyverno 是一个开源的 K8s 原生策略引擎,用于通过“策略即代码”(Policy as Code)管理集群中的资源安全、合规和自动化。它允许你用熟悉的 K8s YAML 定义策略,验证(validate)、变更(mutates)、生成(generate) 和清理(cleanup) 资源,增强安全性和治理,还支持镜像签名验证等高级用例,非常适合平台工程、DevOps 和安全团队。

vcluster

vcluster 是一个开源的虚拟 K8s 集群解决方案,它在一个真实集群内创建轻量级、隔离的虚拟集群实例。每个虚拟集群拥有独立的 API 和控制平面,但共享底层节点资源,启动快、资源占用少、权限隔离好。适合多租户开发测试、CI/CD 环境和平台自助服务等场景。

SpinKube

SpinKube 是一个开源的 WebAssembly(Wasm)无服务器运行时平台,简化在 K8s 上开发、部署与管理 Wasm 工作负载。它结合 Spin Operator、containerd shim 和 Runtime Class 管理器,可让轻量级、快速启动的 Wasm 应用像容器一样运行,并集成自动扩缩与 Kubernetes 原生机制。该项目已成为 CNCF Sandbox 成员,适合构建高效、可扩展的云原生服务。

关于KubeSphere

KubeSphere (https://kubesphere.io)是在 Kubernetes 之上构建的容器平台,提供全栈的 IT 自动化运维的能力,简化企业的 DevOps 工作流。

KubeSphere 已被 Aqara 智能家居、本来生活、东方通信、微宏科技、东软、新浪、三一重工、华夏银行、四川航空、国药集团、微众银行、紫金保险、去哪儿网、中通、中国人民银行、中国银行、中国人保寿险、中国太平保险、中国移动、中国联通、中国电信、天翼云、中移金科、Radore、ZaloPay 等海内外数万家企业采用。KubeSphere 提供了开发者友好的向导式操作界面和丰富的企业级功能,包括 Kubernetes 多云与多集群管理、DevOps (CI/CD)、应用生命周期管理、边缘计算、微服务治理 (Service Mesh)、多租户管理、可观测性、存储与网络管理、GPU support 等功能,帮助企业快速构建一个强大和功能丰富的容器云平台。

"夏哉ke":youkeit.xyz/15702/后
《不只是容器编排:基于JK-Kubernetes源码的云原生存储与网络深度整合》

在当今云原生技术迅猛发展的背景下,Kubernetes 已然成为容器编排的事实标准。然而,若将 Kubernetes 仅仅视为“容器调度器”,则大大低估了其作为云原生操作系统内核的深远意义。从 JK-Kubernetes 源码的视角深入观察,我们会发现:它真正构建的,是一个面向未来分布式系统的统一控制平面——尤其是在存储与网络这两大关键领域,Kubernetes 通过高度抽象与插件化机制,实现了前所未有的整合能力,正悄然重塑着现代应用基础设施的形态。

一、超越编排:Kubernetes 的“控制平面”革命

Kubernetes 的核心魅力,不在于它能启动多少个 Pod,而在于它定义了一套声明式、自愈、可扩展的控制平面模型。这种模型不仅适用于工作负载调度,更可延伸至存储卷、网络策略、服务拓扑等系统级资源。JK-Kubernetes 源码中清晰体现了这一设计理念:通过 CRD(自定义资源定义)与控制器模式,Kubernetes 将存储与网络从“外部依赖”转变为“一等公民”(first-class citizen),纳入其统一的管理语义中。

这意味着,无论是持久化卷的创建、挂载,还是跨节点网络策略的生效,都不再需要运维人员登录底层存储或网络设备进行手动配置,而是通过一个声明式的 YAML 文件提交,由 Kubernetes 控制器自动协调底层实现。这种“以应用为中心”的资源管理范式,极大降低了系统复杂性,提升了交付效率与一致性。

二、存储的云原生重构:从静态挂载到动态供给

传统 IT 架构中,存储往往是孤立、静态且高度耦合于硬件的。而在 Kubernetes 中,存储被抽象为 PersistentVolume(PV)PersistentVolumeClaim(PVC),实现了“申请即获得”的服务化体验。JK-Kubernetes 源码中,CSI(Container Storage Interface)的集成机制是这一变革的核心。

CSI 是一个标准化的存储插件接口,允许各类存储系统(如 Ceph、MinIO、AWS EBS、阿里云盘等)以独立组件的形式接入 Kubernetes。控制器通过监听 PVC 的创建事件,自动调用对应 CSI 驱动,完成卷的供给、格式化、挂载与绑定。整个过程对应用透明,且具备跨云可移植性。

更进一步,Kubernetes 还支持存储类(StorageClass) 的动态供给机制。管理员可定义不同性能等级的存储策略(如“高IO型”、“冷数据归档型”),开发者只需声明需求,系统即可自动匹配最合适的后端资源。这种“按需分配、自动调度”的能力,正是云原生存储区别于传统存储的根本所在。

此外,CSI 的演进还推动了有状态应用的云原生化。过去难以容器化的数据库、消息队列等组件,如今可在 Kubernetes 上实现自动扩缩容、故障迁移与备份恢复,真正享受云原生的弹性红利。

三、网络的统一治理:从连通性到策略化控制

如果说存储的挑战在于“持久化”,那么网络的挑战则在于“动态性”与“安全性”。在微服务架构下,服务数量激增、拓扑频繁变更,传统基于 IP 和端口的静态防火墙规则早已难以为继。Kubernetes 通过 CNI(Container Network Interface)与网络策略(NetworkPolicy),构建了一套面向服务的智能网络治理体系。

在 JK-Kubernetes 源码中,CNI 的设计体现了“插件化即生态”的哲学。无论底层是 Flannel 的覆盖网络、Calico 的 BGP 路由,还是 Cilium 的 eBPF 高性能数据面,Kubernetes 均通过统一的 CNI 接口进行集成。这意味着企业可以在不修改应用逻辑的前提下,灵活切换网络方案,适配不同性能与安全需求。

而网络策略的引入,则将安全控制从“边界防御”推进到“零信任微隔离”。通过定义 Pod 级别的入站与出站规则,企业可实现服务间的最小权限访问控制。例如,数据库服务仅允许来自特定应用命名空间的连接,有效遏制横向移动攻击。尽管默认策略需配合支持策略的 CNI 插件(如 Calico、Cilium)才能生效,但 Kubernetes 提供的声明式语法,为高级安全能力奠定了标准化基础。

更令人期待的是,随着 Service MeshGateway API 的发展,Kubernetes 正在将 L7 层流量(如 HTTP 路由、熔断、鉴权)也纳入其网络治理范畴。未来,Kubernetes 有望成为集 L3-L7 于一体的全栈网络控制平面,真正实现“服务即网络”的愿景。

四、整合的价值:构建统一的云原生基座

Kubernetes 对存储与网络的深度整合,其意义远超技术本身。它标志着企业 IT 正从“多系统拼接”迈向“统一平台治理”的新时代。过去,存储、网络、计算各自为政,运维需跨多个控制台操作,容易出错且难以审计。而如今,在 Kubernetes 的统一 API 模型下,所有资源均可通过 GitOps 流程进行版本化、自动化管理,实现真正的“基础设施即代码”(IaC)。

这种整合也带来了显著的经济与组织效益:

  • 降低运维复杂度:减少跨团队协作成本,提升交付速度;
  • 提升资源利用率:通过统一调度,避免存储与计算资源的孤岛浪费;
  • 增强安全合规性:策略集中管理,审计轨迹完整可追溯;
  • 加速云原生转型:为微服务、Serverless、AI 工作负载提供一致的运行时环境。

五、结语:云原生的“操作系统”正在成型

JK-Kubernetes 源码不仅是一段程序,更是一种技术哲学的体现——通过声明式 API 与控制器模式,将复杂系统分解为可组合、可扩展、自愈的组件单元。在这一架构下,存储与网络不再是“附加功能”,而是与计算同等重要的核心支柱。

当我们将目光从“容器编排”移开,转向其背后对存储与网络的深度整合时,会发现 Kubernetes 正在构建一个属于云原生时代的“操作系统”:它不直接提供硬件,却定义了如何使用硬件;它不实现所有功能,却提供了统一的治理语言。未来,随着 CSI、CNI、Gateway API 等标准的持续演进,Kubernetes 将进一步巩固其作为云原生基础设施中枢的地位,成为企业数字化转型不可或缺的“数字底座”。

理解并掌握这一整合逻辑,不仅是技术进阶的路径,更是把握未来云计算格局的关键所在。在。

"夏哉ke":youkeit.xyz/15702/后
《不只是容器编排:基于JK-Kubernetes源码的云原生存储与网络深度整合》

在当今云原生技术迅猛发展的背景下,Kubernetes 已然成为容器编排的事实标准。然而,若将 Kubernetes 仅仅视为“容器调度器”,则大大低估了其作为云原生操作系统内核的深远意义。从 JK-Kubernetes 源码的视角深入观察,我们会发现:它真正构建的,是一个面向未来分布式系统的统一控制平面——尤其是在存储与网络这两大关键领域,Kubernetes 通过高度抽象与插件化机制,实现了前所未有的整合能力,正悄然重塑着现代应用基础设施的形态。

一、超越编排:Kubernetes 的“控制平面”革命

Kubernetes 的核心魅力,不在于它能启动多少个 Pod,而在于它定义了一套声明式、自愈、可扩展的控制平面模型。这种模型不仅适用于工作负载调度,更可延伸至存储卷、网络策略、服务拓扑等系统级资源。JK-Kubernetes 源码中清晰体现了这一设计理念:通过 CRD(自定义资源定义)与控制器模式,Kubernetes 将存储与网络从“外部依赖”转变为“一等公民”(first-class citizen),纳入其统一的管理语义中。

这意味着,无论是持久化卷的创建、挂载,还是跨节点网络策略的生效,都不再需要运维人员登录底层存储或网络设备进行手动配置,而是通过一个声明式的 YAML 文件提交,由 Kubernetes 控制器自动协调底层实现。这种“以应用为中心”的资源管理范式,极大降低了系统复杂性,提升了交付效率与一致性。

二、存储的云原生重构:从静态挂载到动态供给

传统 IT 架构中,存储往往是孤立、静态且高度耦合于硬件的。而在 Kubernetes 中,存储被抽象为 PersistentVolume(PV)PersistentVolumeClaim(PVC),实现了“申请即获得”的服务化体验。JK-Kubernetes 源码中,CSI(Container Storage Interface)的集成机制是这一变革的核心。

CSI 是一个标准化的存储插件接口,允许各类存储系统(如 Ceph、MinIO、AWS EBS、阿里云盘等)以独立组件的形式接入 Kubernetes。控制器通过监听 PVC 的创建事件,自动调用对应 CSI 驱动,完成卷的供给、格式化、挂载与绑定。整个过程对应用透明,且具备跨云可移植性。

更进一步,Kubernetes 还支持存储类(StorageClass) 的动态供给机制。管理员可定义不同性能等级的存储策略(如“高IO型”、“冷数据归档型”),开发者只需声明需求,系统即可自动匹配最合适的后端资源。这种“按需分配、自动调度”的能力,正是云原生存储区别于传统存储的根本所在。

此外,CSI 的演进还推动了有状态应用的云原生化。过去难以容器化的数据库、消息队列等组件,如今可在 Kubernetes 上实现自动扩缩容、故障迁移与备份恢复,真正享受云原生的弹性红利。

三、网络的统一治理:从连通性到策略化控制

如果说存储的挑战在于“持久化”,那么网络的挑战则在于“动态性”与“安全性”。在微服务架构下,服务数量激增、拓扑频繁变更,传统基于 IP 和端口的静态防火墙规则早已难以为继。Kubernetes 通过 CNI(Container Network Interface)与网络策略(NetworkPolicy),构建了一套面向服务的智能网络治理体系。

在 JK-Kubernetes 源码中,CNI 的设计体现了“插件化即生态”的哲学。无论底层是 Flannel 的覆盖网络、Calico 的 BGP 路由,还是 Cilium 的 eBPF 高性能数据面,Kubernetes 均通过统一的 CNI 接口进行集成。这意味着企业可以在不修改应用逻辑的前提下,灵活切换网络方案,适配不同性能与安全需求。

而网络策略的引入,则将安全控制从“边界防御”推进到“零信任微隔离”。通过定义 Pod 级别的入站与出站规则,企业可实现服务间的最小权限访问控制。例如,数据库服务仅允许来自特定应用命名空间的连接,有效遏制横向移动攻击。尽管默认策略需配合支持策略的 CNI 插件(如 Calico、Cilium)才能生效,但 Kubernetes 提供的声明式语法,为高级安全能力奠定了标准化基础。

更令人期待的是,随着 Service MeshGateway API 的发展,Kubernetes 正在将 L7 层流量(如 HTTP 路由、熔断、鉴权)也纳入其网络治理范畴。未来,Kubernetes 有望成为集 L3-L7 于一体的全栈网络控制平面,真正实现“服务即网络”的愿景。

四、整合的价值:构建统一的云原生基座

Kubernetes 对存储与网络的深度整合,其意义远超技术本身。它标志着企业 IT 正从“多系统拼接”迈向“统一平台治理”的新时代。过去,存储、网络、计算各自为政,运维需跨多个控制台操作,容易出错且难以审计。而如今,在 Kubernetes 的统一 API 模型下,所有资源均可通过 GitOps 流程进行版本化、自动化管理,实现真正的“基础设施即代码”(IaC)。

这种整合也带来了显著的经济与组织效益:

  • 降低运维复杂度:减少跨团队协作成本,提升交付速度;
  • 提升资源利用率:通过统一调度,避免存储与计算资源的孤岛浪费;
  • 增强安全合规性:策略集中管理,审计轨迹完整可追溯;
  • 加速云原生转型:为微服务、Serverless、AI 工作负载提供一致的运行时环境。

五、结语:云原生的“操作系统”正在成型

JK-Kubernetes 源码不仅是一段程序,更是一种技术哲学的体现——通过声明式 API 与控制器模式,将复杂系统分解为可组合、可扩展、自愈的组件单元。在这一架构下,存储与网络不再是“附加功能”,而是与计算同等重要的核心支柱。

当我们将目光从“容器编排”移开,转向其背后对存储与网络的深度整合时,会发现 Kubernetes 正在构建一个属于云原生时代的“操作系统”:它不直接提供硬件,却定义了如何使用硬件;它不实现所有功能,却提供了统一的治理语言。未来,随着 CSI、CNI、Gateway API 等标准的持续演进,Kubernetes 将进一步巩固其作为云原生基础设施中枢的地位,成为企业数字化转型不可或缺的“数字底座”。

理解并掌握这一整合逻辑,不仅是技术进阶的路径,更是把握未来云计算格局的关键所在。在。

  • Design Data Intensive Application 2nd

高屋建瓴,系统地介绍了当前主流技术及其背后的原理,点到为止。阅读后,能获得对技术全景的宏观了解,而对具体某项技术也能知其大概。类似的书籍还有<<凤凰架构>>。

  • Kubernetes in Action 2nd

图文并茂, 浅显易懂, 当初就是靠这本书入门了 K8S, 但是里面有很多内容都过时了. 第一版本是 2017 年写的, 我一直在期待更新版本, 作者跳票了好多次了, 从 2020 年开始就在更新, 但出版日期一再延后, 希望这次不会跳票.

Docker 推出了一个全新的平台,旨在简化从本地开发到生产级云环境的迁移过程。

 

Docker Kanvas的推出标志着这家容器先驱企业在战略方向上的重大转变。它不再仅仅是一个容器引擎,而是蜕变为面向现代工程团队的综合部署协调器。该工具现在已通过Docker Hub以扩展的形式提供,它采用人们熟悉的 Docker Compose 语法,弥合了本地工作站与复杂云基础设施之间的鸿沟。

 

该平台的核心理念在于,保持软件工程师现有的工作流程不变,同时由系统管理 Kubernetes 部署的复杂性。平台在后台处理云资源配置的繁琐细节,减轻了开发人员的认知负担。传统上,从本地 Compose 文件迁移至可投入生产环境的 Kubernetes 集群需要大量的手动操作,通常涉及创建复杂的 YAML 清单文件和定制部署脚本。

 

Kanvas 通过将应用程序架构直接转换为适合云原生环境的部署工件来自动化这一迁移过程。这一转变标志着 Docker 迈入基础设施即代码(IaC)领域的新时代。该工具是与Layer5合作开发的,可以为 Terraform 和 Pulumi 等平台生成配置,能够在各种云提供商之间保持部署的一致性,同时将源代码逻辑保存在开源GitHub存储库中。

 

在 Docker 官方博客上,贡献者 Aabid Sofi 和 Ajeet Singh Raina 特别说明了这一转变对开发社区的重要意义。他们指出,该平台实现了从简单 Compose 文件到全托管工作负载的无缝衔接,彰显了基础设施可视化管理的便捷性。他们解释说,该工具的目标是,无论目标环境是托管的 Kubernetes 服务还是无服务器平台,都能保持 Docker 生命周期的简洁性。

 

虽然 Kanvas 提供的自动化功能为已经投资于 Docker 生态系统的团队带来了明显的好处,但它进入了一个竞争激烈的市场,其中已经有若干成熟的替代方案。目前,众多企业依赖HelmKustomize管理 Kubernetes 部署,虽然这些工具可以实现高度的定制化,但往往伴随着比较陡峭的学习曲线。此外,诸如OktetoGarden这样的内部开发平台则长期致力于解决开发环境与生产环境之间的差异问题,通过提供更贴近生产环境的远程开发环境来实现这一目标。

 

该平台还能生成应用架构的详细图解,帮助进行调试和架构审查。这种可视化功能基于特定的架构框架构建,可追踪分布式系统中微服务之间的依赖关系。通过清晰地呈现服务交互图谱,该系统能帮助团队在服务进入生产环境前识别潜在的瓶颈或安全配置错误。随着行业不断地向平台工程转型,能够抽象化基础设施复杂性的工具正变得日益重要。Docker 的最新举措表明,他们将长期致力于通过标准化来简化面向普通开发人员的云原生技术栈。

 

https://www.infoq.com/news/2026/01/docker-kanvas-cloud-deployment/

亚马逊云科技推出了Amazon EKS Capabilities,这是一套完全托管的、Kubernetes 原生特性,旨在简化工作负载编排、AWS 云资源管理以及 Kubernetes 资源组合和自动化。这些能力现在已在大多数 AWS 商业区域普遍可用,它将流行的开源工具捆绑到一个托管的平台层中,减轻了工程团队的运维负担,并在Amazon Elastic Kubernetes Service(EKS)上实现了更快的应用程序部署和扩展。

 

EKS Capabilities 集成了许多 Kubernetes 用户已经依赖的三个核心组件:Argo CDAWS Controllers for Kubernetes(ACK)和Kube Resource Orchestrator(KRO),并在 AWS 拥有的基础设施中运行它们,这些基础设施与客户集群抽象隔离。Argo CD 提供声明式的持续部署和GitOps工作流,允许直接从版本控制同步资源和应用程序。ACK 通过自定义资源扩展 Kubernetes,用于直接在 Kubernetes API 内管理 AWS 服务,如S3DynamoDBRDS。KRO 提供了一个简化的机制,用于创建和管理组合的自定义资源,帮助平台团队定义可重用的、更高层次的抽象,而无需手动处理复杂的控制器逻辑。

 

通过将这些能力作为托管的 AWS 资源而不是集群内的插件提供,EKS Capabilities消除了用户自己安装、补丁、扩展或更新基础 Kubernetes 工具的需求。AWS 处理扩展、维护、安全补丁和兼容性升级,使平台工程师和开发人员能够更多地专注于交付业务逻辑,而不是管理平台组件。实际上,团队继续使用熟悉的接口如kubectl、GitOps 工作流和声明式清单与 Kubernetes 一起工作;不同的是,持续部署和资源编排等核心服务由 AWS 作为 EKS 平台的一部分提供和维护。

 

这种转变与云原生运维的更广泛趋势相一致,在云原生运维中,托管服务越来越多地吸收了无差别的繁重工作,使组织能够更容易地扩展 Kubernetes 的采用。平台团队可以将常规的基础设施集成卸载到 AWS 托管的能力中,同时保留原生的 Kubernetes 工作流,应用程序开发人员则从统一、一致的能力中受益,这些能力跨越了集群,而无需投资于定制的平台工具。通过 EKS 控制台、AWS CLIeksctl或其他自动化工具启用 EKS 能力。当将 Argo CD、ACK 或 KRO 等能力添加到集群中时,它将作为 AWS 资源出现,可以像其他 AWS 服务一样进行标记、管理和监控。权限通过 AWSIdentity and Access Management(IAM)配置,对于 Argo CD 单点登录等功能,支持与 AWS IAM 身份中心的集成。AWS 还自动分析破坏性变更,并对活动功能应用更新或补丁,减少管理开销。

 

虽然每个功能都是独立且可选的,允许团队只启用他们需要的功能,但它们共同为 Kubernetes 环境提供了一个连贯、可扩展的平台层,融合了应用程序部署、AWS 资源控制和自定义资源组合。这种方法旨在缩短交付时间,最小化操作摩擦,并帮助组织在开发、测试和生产环境中大规模采用 Kubernetes。

 

这次更新引起了云和 DevOps 社区的共鸣。在Reddit上,实践者强调了托管 Argo CD 支持和集成的 AWS 资源管理的便利性,这是尝试新功能的令人信服的理由,特别是对于那些寻求统一 GitOps 工作流和资源配置而不进行手动插件管理的团队。同时,一些观察者指出,尽管托管能力减少了设置工作,但它们仍然需要 Kubernetes 专业知识和仔细的成本考虑,因为采用规模扩大,成本也被质疑是一个潜在的问题,因为许多团队可能已经有自己管理这些的方法,并且看不到为这项新的 AWS 功能支付额外费用的好处。

 

随着企业继续在混合云和多云环境中采用 Kubernetes,Amazon EKS Capabilities 通过将运维最佳实践嵌入到服务本身,代表了降低平台复杂性和加速云原生应用程序交付的一步。

 

https://www.infoq.com/news/2025/12/aws-eks-workload-orchestration/

以Docker+K8s为代表的容器技术得到了越来越广泛的应用,从安全攻防的角度,攻击者已经不再满足于容器逃逸,进而攻击整个容器编排平台,如果可以拿下集群管理员权限,其效果不亚于域控失陷。

在云原生安全攻防的场景下,甲乙攻防双方对于安全工具的关注点也不一样。本文试图收集一些开源的云原生安全工具,带你一起去了解云原生安全。

1、云原生攻防靶场

Metarget 是一个脆弱基础设施自动化构建框架,主要用于快速、自动化搭建从简单到复杂的脆弱云原生场景。

github项目地址:

https://github.com/Metarget/metarget

2、容器漏洞利用工具

CDK 是一个开源的容器渗透工具包,旨在在不依赖任何操作系统的情况下在不同的精简容器中提供稳定的利用。它带有有用的网络工具和许多强大的 PoCs/EXPs,可以帮助你轻松地逃离容器并接管 K8s 集群。

github项目地址:

https://github.com/cdk-team/CDK

3、容器逃逸检测工具

用于检测Docker 容器逃逸方式,目前支持15种容易逃逸场景的检测。

https://github.com/teamssix/container-escape-check

4、容器安全检测工具

容器安全扫描工具,支持检测容器/镜像的恶意文件、弱口令、漏洞后门、逃逸风险等功能。

github项目地址:

https://github.com/chaitin/veinmind-tools

5、容器漏洞分析工具

Clair 是一个容器漏洞分析服务,用于对容器镜像中的漏洞进行静态分析。

github项目地址:

https://github.com/quay/clair

6、容器安全扫描

Trivy 是一个全面的多功能安全扫描器,支持在容器镜像、Kubernetes、代码存储库、AWS中查找漏洞、错误配置、敏感信息和密钥、SBOM等。

github项目地址:

https://github.com/aquasecurity/trivy

7、容器镜像扫描

Syft 用于从容器镜像生成SBOM,Grype 用于容器镜像扫描,两者通常一起使用。

github项目地址:

https://github.com/anchore/grype

github项目地址:

https://github.com/anchore/syft

8、K8S漏洞扫描

kube-hunter 寻找 Kubernetes 集群中的安全漏洞。

github项目地址:

https://github.com/aquasecurity/kube-hunter

9、K8S基线核查

kube-bench 是一种工具,可通过运行CIS Kubernetes Benchmark中记录的检查来检查 Kubernetes 是否已安全部署。

github项目地址:

https://github.com/aquasecurity/kube-bench

云原生安全平台NeuVector 是唯一提供完整容器安全性的 kubernetes 原生容器安全平台。

github项目地址:

https://github.com/neuvector/neuvector