将 Sidecar 容器带入新的阶段 | KubeCon NA 2019

深入剖析 Kubernetes 原生 Sidecar 容器 Kubernetes 1.28 引入了一种新型容器 - sidecar 容器。Kubernetes 将 sidecar 容器作为 init 容器的一个特例来实现,在 Pod 启动后,sidecar 容器仍将保持运行状态。具体的实现方式是在 init 容器中添加了一个新的字段, 该字段在特性门控启用时可用(该特性自 Kubernetes v1.29 起默认启用)。该字段是可选的,如果对其设置,则唯一有效的值为Always。 阅读详情

图为 KubeCon NA 2019 大会分享现场照

Speaker:

  • 徐迪 蚂蚁金服技术专家:负责蚂蚁金融云PaaS平台建设,Kubernetes 社区老兵,核心代码库贡献量社区前50;

  • 张晓宇 阿里云技术专家:负责阿里巴巴云原生应用容器平台的生态建设,主要设计和研发节点稳定性和资源利用率相关解决方案,同时也是 Kubernetes 社区热心的成员和贡献者。

本文根据徐迪和张晓宇在 KubeCon NA 2019 大会分享整理。分享将会从以下几个方面进行切入:首先会简单介绍一下什么是 Sidecar 容器;其次,我们会分享几个蚂蚁金服和阿里巴巴集团的通用场景,以及我们是如何解决这些挑战的。当然,现在还是有很多的挑战需要后续继续解决,邀请大家与我们一同努力。

Sidecar 简介

Sidecar 容器并不是一个新鲜事物。它是一种设计模式,主要用来做一些辅助的工作,比如网络连通性、下载拷贝文件之类的事情;如果大家熟悉 Docker Swarm 的话,就会发现 Docker Ambassador 其实就是 Sidecar。

看看如上这个例子,Service Consumer 和 Redis Provider 强耦合,部署在同一个节点上。如果这个时候,Redis Provider 出现问题,需要连接到另外一个 Redis 实例上,需要重新配置,并重启 Service Provider。

那么在引入了 Ambassador 以后,问题变得相对简单些,只需要重启这里的 Redis Ambassador 即可,并不需要 Service Consumer 进行任何变动。

当然这种模式,还可以进行跨节点通信,比如下图。这样 Service Consumer 和 Redis Provider 就可以部署在不同的节点上。在某种程度上,很容易地就将两种服务进行了解耦。

Sidecar 案例分享

Sidecar 容器能用来干什么?

一般来讲,Sidecar 容器可以:

  • 日志代理/转发,例如 fluentd;

  • Service Mesh,比如 Istio,Linkerd;

  • 代理,比如 Docker Ambassador;

  • 探活:检查某些组件是不是正常工作;

  • 其他辅助性的工作,比如拷贝文件,下载文件等;

  • ...

仅此而已?

事实上,Sidecar 越来越被大家接受,并且使用越来越广泛。Sidecar 容器通常和业务容器(非 Sidecar 容器)部署在同一个 Pod 里,共享相同的生命周期,为业务容器提供辅助功能。这是一个非常好的模式,能够极大程度解耦应用,并且支持异构组件,降低技术壁垒。

但目前 Kubernetes 对 Sidecar 的管理还不完善,越来越不满足我们的使用,尤其是在生产环境中使用 Sidecar。

几个典型案例

1. 顺序依赖

假设我们在一个 Pod 内注入了多个 Sidecar,但是 Sidecar 之间或者 Sidecar 和业务容器之间有相互依赖关系。

如下这个例子,我们需要先启动 proxy Sidecar 容器用于建立网络连接,这样 mysql client 才能连接到远端的 mysql 集群,并在本地暴露服务。而后主的业务容器才能正常工作。

#1 proxy_container (sidecar)
#2 mysql_client
#3 svc_container

当然,有的人会觉得这个地方,可以通过诸如更改镜像启动脚本延迟启动等方法来解决。但是这些方法侵入性太强,不利于扩展,还很难进行准确的配置。

2. Sidecar 管理

我们来看看另外一个案例。Sidecar 容器和业务容器耦合在同一个 Pod 内,共享相同的生命周期。因此,单独来管控 Sidecar 容器非常不方,比如更新 Sidecar 的镜像。

比如,我们已经给很多 Pod 注入了 Istio Proxy 这样的 Sidecar 容器,目前运行状态良好。但是如果这个时候我们想升级这个 Proxy 镜像的话,该怎么办?

如果按照 Istio 社区官方的文档[1],我们需要重新注入这些 Sidecar 容器。具体来说,需要删除原有 Pod,重新生成一份新的 Pod(有些 workload 关联的 Pod,会由相应的 workload 控制器自动生成)。

那如果我们有很多个这样的 Pod 需要处理的话,怎么办?通过命令行的话,太不方便,而且容易出错。通过自己单独写的代码的话,可扩展性是个问题,需要频繁更改这些代码。

而且这里还有另外一个问题,我们肯定不会一下子升级所有的 Sidecar,肯定要有个灰度的过程,也就是只升级一部分 Sidecar,这个时候又该怎么办呢?

社区进展

上游社区

这里我们非常感谢 Joseph Irving (@Joseph-Irving) 提出了一个 Sidecar kep[2],通过定义 LifecycleType 来区分是否是 Sidecar 容器。

未来只需要在 Pod Spec 中,按如下方式标记即可:

name: sidecarContainer
image: foo
lifecycle:
  type: Sidecar

Pod 内容器的启动顺序按照:初始化容器->Sidecar 容器->业务容器 的顺序依次启动。

其中上述 kep 的 kubelet 端实现[3] 正在进行中。

为了支持 Sidecar 更多的使用场景,我们以此为基础提出了 PreSidecar 和 PostSidecar,分别用于在业务容器之前和之后启动。具体的使用场景见 我们的 PR[4]。

为什么我们觉得 Sidecar 应该区分前置和后置呢?

这是因为在一些场景下,我们需要 Sidecar 容器优先于应用容器启动,帮助做一些准备工作。例如分发证书,创建共享卷,或者拷贝下载一些其他文件等。

而在另外一些场景下,我们需要一些 Sidecar 容器在应用容器之后启动。考虑到解耦和版本管理的因素,我们将应用分为两部分,应用容器专注于业务本身,而一些数据和个性化的配置放在 Sidecar 容器中。通常情况下,这两个容器将会共享一个存储卷,后置的 Sidecar 容器会更新替换掉一些默认和过时数据。

当然考虑到未来更复杂的场景,我们可能还会对容器的启动顺序做 DAG 编排,当然这个需要视生产实际需要而定。

蚂蚁金服及阿里巴巴如何应对

为了解决 Sidecar 的管理工作,我们需要一个更细粒度的 workload 方便我们进行管理。这个 workload 我们命名为 SidecarSet,目前已经开源,生产可用。大家可以访问 OpenKruise[5] 这个项目,可以在项目的 roadmap[6] 里了解我们目前的一些新进展。OpenKruise 这个项目目前有三个生产可用的 workload,分别是 Advanced StatefulSet、BroadcastJob、SidecarSet。另外2个 workload(AdvancedHPA 和 PodHealer)正在加紧开发中, 很快会开源出来,敬请期待。

OpenKruise: https://openkruise.io/OpenKruise 

roadmap: https://github.com/openkruise/kruise/projects

相关使用 Demo,大家可以观看 Lachlan Evenson 的尝鲜视频[7]。

spec 中的 SidecarContainer 的定义就是 Kubernetes 代码库中的 corev1.Container 定义。通过额外的一个 labelSelector,可以很方便地对指定的容器组进行操作。我们支持滚动升级(RollingUpdate)的方式,让用户可以分批的升级 Sidecar,同时也提供了 pause 功能,可以在紧急情况下暂停 Sidecar 的升级。

如果只是简单升级 Sidecar 的镜像, SidecarSet 控制器仅仅会 patch 原有 pod 的,非常方便的就可以一键升级镜像。

其他的挑战

我们在生产实践过程中,还发现了一些其他的挑战,目前还在寻找比较好的解法。

Sidecar 容器的资源管理

一般来讲 Sidecar 容器占用的资源都比较小,那么这个资源要不要计算到整个 pod 当中?还是可以直接共享业务容器的资源即可?相同的 Sidecar 在和不同的应用容器搭配使用,如何准确给 Sidecar 容器分配资源这些都需要进行考虑。

Sidecar 容器的容错性

一般来讲,Sidecar 容器都是非主要容器,那么这类容器出现问题时,比如 liveness 探活,要不要对主容器的状态或者整个 pod 的状态也产生影响。再或者,Sidecar 镜像更新出现问题时,要不要直接标记整个 pod 出现问题。

当然,还有一些其他的挑战,我们只是列举了几个通用的。对于这些挑战,我们需要大家一起集思广益,找到比较合理的解法。

小结

随着 Sidecar 在生产环境使用越来越广泛,对其的管理愈发需要重视。Sidecar 虽然和业务容器部署在同一个 Pod 内,但是其本质上只是辅助性的容器。本文介绍了目前 Sidecar 的典型使用案例,以及面临的挑战,同时跟上游社区一起合作,将阿里经济体的技术解决方案在社区落地,帮助更多的用户。

文中涉及的相关链接

  • [1] Istio 社区官方的文档:

    https://istio.io/docs/setup/upgrade/steps/#sidecar-upgrade

  • [2] Sidecar kep:

    https://github.com/kubernetes/enhancements/pull/919

  • [3] kubelet 端实现:

    https://github.com/kubernetes/kubernetes/pull/80744

  • [4] Supports PreSidecars and PostSidecars 的 PR:

    https://github.com/kubernetes/enhancements/pull/1135/files#diff-053a4b80170c73fb99c6472a67b9e7d8

  • [5] OpenKruise:

    https://openkruise.io/

  • [6] OpenKruise roadmap:

    https://github.com/openkruise/kruise/projects

  • [7] Lachlan Evenson 的尝鲜视频: 

    https://www.youtube.com/watch?v=elB7reZ6eAQ

本文归档在 sofastack.tech。

???? 奖励支持 SOFAStack 的你~

* 点下右下角“在看”

* 到公众号对话框发送“圣诞快乐”,试试手气~

* 本期互动奖品“蚂蚁 U 型枕”

Sidecar架构解析:AI代码编辑器的Rust后端引擎与LLM集成实践 在AI辅助编程领域,大型语言模型(LLM)与代码编辑器的深度集成已成为提升开发效率的关键技术。其核心原理在于通过语义理解、上下文管理和工具调用等机制,将自然语言指令转化为精准的代码操作。这一技术价值在于实现了从“代码补全”到“智能编程伙伴”的跨越,显著提升了复杂代码生成、重构和调试的效率。在实际应用场景中,此类系统需要处理代码库级别的上下文感知、多语言支持以及实时响应等工程挑战。本文聚焦的Sidecar项目,正是这一技术范式的典型实现。作为一个用Rust编写的高性能后端引擎,它通过模块化设计,将代码符号(S 阅读详情

相关推荐

docker-host:一个docker sidecar容器,用于将所有流量转发到本地docker主机或任何其他主机

docker-host:一个docker sidecar容器,用于将所有流量转发到本地docker主机或任何其他主机

Sidecar注入容器

介绍 使用 Sidecar 模式部署服务网格时,无需在节点上运行代理(因此您不需要基础结构的协作),但是集群中将运行多个相同的 Sidecar 副本。从另一个角度看:我可以为一组微服务部署到一个服务网格中,你也可以部署一个有特定实现的服务网格。在 Sidecar 部署方式中,你会为每个应用的容器部署一个伴生容器。Sidecar 接管进出应用容器的所有流量。在 Kubernetes 的 Pod 中...

qq_42747099的博客 2879

【通信协议】I2C总线(一主多从)

I2C总线(一主多从)之软件模拟代码详解

m0_75090944的博客 9841

容器设计模式:Sidecar

Sidecar 模式是一种容器设计模式,指的是在一个 Pod 中运行主容器和辅助容器(Sidecar 容器),二者共享 Pod 的资源(如网络和存储)。主容器负责核心业务逻辑,Sidecar 容器则负责为主容器提供增强功能,如日志收集、数据同步、服务代理等。

qq_35861084的博客 3781

Linux单独编译设备树,开发者分享 | Petalinux 工程中设备树的介绍

本文来自XILINX嵌入式产品应用工程师 Terry Ni设备树是 Petalinux kernel 的关键组件,接下来以 2020.1 版本为例,为大家介绍一下在Xilinx Petalinux 工程中的设备树是如何产生,配置以及修改的。Petalinux 工程中设备树的位置当我们创建了一个 petalinux 工程后(以zcu102为例),在编译的时候,会自动生成对应的设备树文件。这些设备树的...

weixin_28877107的博客 2594

【软件安装系列】Ubuntu+mysql5.7.27+Jira8.3.1+邮箱服务器配置+Confluence6.15.7安装经验和采坑总结

文章目录一、软件准备(百度云易被吞,就不放了)1.1 官网下载的新鲜的Jira和Confluence1.2 linux的jdk一份1.3 Jira和Confluence的破解程序或者破解包一份1.4 java的连接器一份二、安装过程1--java环境配置2.1 将下载下来的jdk包解压在/usr/local/java目录中2.2 写入环境变量三、安装过程2--mysql5.7.27环境配置3.1 ...

xiaosha_的博客 6892

sidecar模式

sidecar 简单的说,一个pod内有多个容器应用在同时工作,相互协同,完成特定需求。 sidecar的思想核心就是:不侵入主容器的前提下,可以进行服务功能扩展。一般都是一些共性的能力,比如说: 日志代理/转发,例如 fluentd; Service Mesh,比如 Istio,Linkerd; 代理,比如 Docker Ambassador; 探活:检查某些组件是不是正常工作; 其他辅助性的工作,比如拷贝文件,下载文件等; k8s不会明显区分主容器与sidecar容器,如果主容器与sidecar容

fzzjoy的专栏 1762

群晖Lucky套件高级玩法-——更新证书同步更新群晖自带证书

群晖Lucky套件高级玩法-——更新证书同步更新群晖自带证书

wojuzi的博客 2455

Kubernetes 原生 Sidecar 容器全面落地:告别 iptables Hack,重塑服务网格与 AI 工作负载架构

# Kubernetes 原生 Sidecar 容器全面落地:告别 iptables Hack,重塑服务网格与 AI 工作负载架构 ![Kubernetes 原生 Sidecar 容器](https://picsum.photos/seed/17864397599237/800/400) > 2

猿特佳 221

投入产出表之直接消耗系数和完全消耗系数计算--基于Excel

介绍 上篇博客已介绍投入产出表的结构类型及意义解读,在此就不重复写了。 投入产出法中相对稳定的因素是一些系数,根据投入产出表可以计算很多系数: 案例 案例数据即流量矩阵,采用的是中国2012年的部分行业数据,若有不对,请批评指正哈。 直接消耗系数的计算 根据上表和直接消耗系数的计算公式,直接消耗系数矩阵通常用A表示。农林牧渔产品和服务部门对其他部门产品的直接消耗系数分别为: 这些消耗系数的经济意义是,农、林、牧、渔产品和服务部门每生产单位(1亿元)总产出,要直接消耗0.1378亿元本部门产品,0.26

m0_46271335的博客 7万+

YOLOv11【第二十章:模型迭代与生态闭环篇·第1节】在线增量学习——部署后新数据自动回流重训!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 432

凌鲨客户端架构

客户端使用了tauri作为主框架,通过rust和内置应用(sidecar)为前端界面提供额外能力。

weixin_37582237的博客 515

高速电路设计必看:同步开关噪声问题解析

数字电路中的同步开关噪声(SSN)问题日益突出,尤其是随着高速器件应用增多。本文分析了地弹和电压弹的产生机理,指出其与电源网络电感、输出驱动电流变化率密切相关。文章详细阐述了地弹参数特征,包括峰值电压、脉冲宽度等关键指标,并探讨了负载电容、信号压摆率等因素对地弹的影响。最后提出系统化的解决方案,涵盖芯片选型、电路设计、PCB布局和后期调试等多个环节,强调通过降低回路电感和控制电流变化率来有效抑制SSN。这些措施需要在性能、成本和复杂度之间取得平衡,为高速数字电路设计提供了重要参考。

一只豌豆象的博客 298

Pod-2

以上是今天要讲的内容,学到了Sidecar类型容器;Static Pod;Pod 删除。

K要努力的博客 368

python基础:工作会用到的90%的python代码都在这了(万字详解!)

Python 备忘单是 Python 3 编程语言的单页参考表 著名的“Hello World”程序在 Python 中的实现 Python 不能在没有赋值的情况下声明变量 变量可以存放不同类型的值 内置数据类型 序列指一批有序的元素,集合指一批无序且不重复的元素查看: 数据类型 查看: 字符串 查看: 列表 查看: 判断 查看: 循环 查看: 函数 查看: 文件处理 表示 x 和 y 的商, 表示 x 和 y 的底商,另见 StackOverflow f-字符串 (Python 3.6+) 查看

数据知道的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

init模式_kubernetes学习init容器模式

init模式Kubernetes is an open-source container orchestration engine for automating deployment, scaling, and management of containerized applications. A pod is the basic building block of kubernetes appl...

weixin_26717681的博客 706

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【良品】k8s的sidecar原理及实例妙解

先要理解下面的shell脚本意思:执行之后会发现,每隔1秒屏幕将时间输出到/var/present.log文件中$(date)再执行命令,可查看到pod内指定容器的日志:kubectl logs -f po/present busybox为什么用它?可能有疑问,为什么不直接用这个命令?而要多此一举。因为,那样,日志分散存在每个容器中,不方便统一管理,采取sidecar方式,万一某个容器挂了,日志自然也无法查看,它的日志若是存在sidecar里,即便如此,也可以存在。

Friendsofthewind的博客 3376

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pod(二):创建包含多个容器的pod(sidecar)

一个pod里可以有一个容器,也可以有多个容器。一般一个pod里运行一个容器,那一个pod里运行两个容器的意义何在?一个容器是主容器,一个是副容器sidecar,比如nginx容器用来提供服务,另外一个容器使用工具来进行日志分析,两个容器挂载同一个数 据卷,日志分析容器读取数据卷即可分析日志。创建pod的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》

Vic的博客 5924

Kubernetes 1.28:介绍原生 Sidecar 容器

点击上方“程序猿技术大咖”,关注并选择“设为星标”回复“加群”获取入群讨论资格!作者Todd Neal (AWS), Matthias Bertschy (ARMO), Sergey Kanzhelev (Google), Gunju Kim (NAVER), Shannon Kularathna (Google)本文介绍如何使用新的边车特性,该特性允许设置可重新启动的 Init 容器,并已在 ...

xcbeyond|疯狂源自梦想,技术成就辉煌 834

基于Rust的推理服务Sidecar模式:模型版本管理、流量镜像与金丝雀发布

Sidecar分离路由控制和推理计算,实现模型版本的独立生命周期管理流量镜像的异步设计是关键——主请求不应因镜像分析而增加延迟金丝雀健康判定需要多维指标组合:P99延迟、错误率、输出相似度权重路由需感知GPU资源可用性,避免将请求路由到资源不足的实例自动回滚是金丝雀发布的必备安全网——健康检查异常立即恢复稳定版本。

2301_81410839的博客 4540

FFmpeg Sidecar 使用教程

FFmpeg Sidecar 使用教程 项目介绍 FFmpeg Sidecar 是一个 Rust 库,旨在将独立的 FFmpeg 二进制文件封装在一个直观的迭代器接口中。通过这个库,开发者可以方便地使用 FFmpeg 进行视频处理,而无需手动管理 FFmpeg 的安装和配置。FFmpeg Sidecar 提供了类似于 std::process::Command 的构建器 API,使得调用 FFmp...

gitblog_01169的博客 1011

【Rust日报】开源:如何为Helix编辑器贡献PR

一个关于Rust编译器rustc中的一个bug引发的故障排查过程的总结这是一个关于Rust编译器rustc中的一个bug引发的故障排查过程的总结。作者在开发一个名为rooc的优化建模语言时,想在浏览器中运行解算器,于是尝试使用一个纯Rust编写的线性规划库minilp。在测试阶段,作者发现minilp在Web Assembly(wasm)环境下会panic(运行时崩溃)。作者开始调试,首先尝试wa...

Rust语言学习交流 878

《Docker容器编排模式:了解Sidecar、Ambassador等模式,构建高效稳定的容器化应用》

本文将重点介绍Docker容器编排模式中的Sidecar、Ambassador等常见模式,探讨它们在容器编排中的应用。通过从社区角度、市场角度、领域角度、资源角度、生态角度、层面角度和技术领域应用等多个角度进行分析,帮助读者深入了解这些容器编排模式的原理和使用场景。Docker容器编排是将多个容器组合成一个整体应用的过程,它涉及到多个容器之间的交互和通信。在实际应用中,我们常常需要使用一些特定的模式来处理容器之间的交互和通信。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 787

微服务中的Sidecar设计模式解析

Sidecar 设计模式已经越来越受欢迎,并在社区内得到更广泛的采用。构建具有高度可扩展性、弹性、安全性和可观察性的微服务架构具有挑战性。Service Mesh 架构的发展已经改变了游戏规则。它降低了与微服务架构相关的复杂性,并提供了许多功能,如负载平衡、服务发现、流量管理、熔断、遥测、故障注入等。阅读我之前的博客能够了解 Service Mesh 的概念,为什么云原生应用需要它以及它受欢迎的原...

weixin_34235105的博客 2067
上一篇: SOFA Weekly | MOSN配置文档、SOFABolt等组件发布、社区活动预告
下一篇: 蚂蚁金服 Service Mesh 大规模落地系列 - 控制面篇
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值