惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
V
V2EX
GbyAI
GbyAI
量子位
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
S
SegmentFault 最新的问题
O
OpenAI News
N
News and Events Feed by Topic
博客园 - Franky
爱范儿
爱范儿
Forbes - Security
Forbes - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V2EX - 技术
V2EX - 技术
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News and Events Feed by Topic
N
News | PayPal Newsroom
Schneier on Security
Schneier on Security
Cloudbric
Cloudbric
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recent Commits to openclaw:main
Recent Commits to openclaw:main
人人都是产品经理
人人都是产品经理
P
Privacy International News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
Last Week in AI
Last Week in AI
罗磊的独立博客
Spread Privacy
Spread Privacy
Recent Announcements
Recent Announcements
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
The Register - Security
The Register - Security
Y
Y Combinator Blog
J
Java Code Geeks
I
Intezer

蛮荆

如何获取更多的免费服务器 Kubernetes 调度器队列 - 设计与实现 Kubernetes 调度器 - 核心流程 Kubernetes Networking Model & CNI Kubernetes 控制器管理总结 Kubernetes CronJob 设计与实现 Kubernetes Job 设计与实现 Kubernetes HPA 设计与实现 Kubernetes Deployment 滚动更新实现原理 Kubernetes GC 设计与实现 Kubernetes Pod 驱逐 - 设计与实现 Kubernetes Daemonset 设计与实现 Kubernetes ReplicaSet 设计与实现 Kubernetes EndPoint 设计与实现 Kubernetes Informer 设计与实现 降本增效之应用优化 (三) 日志存储与检索 Kubernetes Pod 设计与实现 - 创建流程 Kubernetes 探针设计与实现 Unix 编程艺术名句摘录 Kubernetes - CRI 概述 Golang 编译速度为什么这么快? Kubernetes Pod 设计与实现 - Pause 容器 Kubernetes - kube-proxy 代理模式工程优化 Kubernetes 应用最佳实践 - 优雅关闭长连接 Kubernetes Service 类型和会话亲和性 Kubernetes 为什么需要 Ingress Kubernetes 架构 - 控制平面和数据平面 降本增效之应用优化 (二) 大报表 Go 语言如何获取 CPU 利用率 降本增效之应用优化 (一) Redis 业务规则引擎演变过程简述 微服务中的熔断算法 漏桶算法和令牌桶算法 jsonparser 为什么比标准库的 encoding/json 快 10 倍 ? zap 高性能设计与实现 HTTP Router 算法演进 fastcache 高性能设计与实现 Web 常见的三个安全问题 ants Code Reading Go 线程安全 map 方案选型 布隆过滤器 死锁、活锁、饥饿、自旋锁 sync.Pool Code Reading Go 内存管理概述 Go netpoll Code Reading goroutine 泄漏与检测 time/Timer Code Reading GMP Scheduler Code Reading Go channel 的 15 条规则和底层实现 为什么 Linux “一切皆文件” context.Context Code Reading runtime/HACKING.md Goland 最佳实践 互联网开发与金庸武学 为什么 Redis 6.0 引入多线程模型? Kubernetes 应用最佳实践 - 金丝雀发布 容器中如何正确配置 GOMAXPROCS ? singleflight Code Reading sync.Map Code Reading sync.Cond Code Reading sync.WaitGroup Code Reading sync.RWMutex Code Reading sync.Mutex Code Reading sync.Once Code Reading Go 无锁编程 sync/atomic Code Reading goroutine 交替打印奇偶数 GODEBUG Go 并发模式 Go 汇编 UUID 通用技术选型 Kubernetes 应用最佳实践 - 水平自动伸缩 Go 高性能 Tips fasthttp 为什么比标准库 net/http 快 10 倍 ? 技术文章配图指南 ChatGPT 初体验 Docker 网络原理概览 iptables 的五表五链 Kubernetes 应用最佳实践 - 亲和性和污点容忍度 Go 的反射与三大定律 Docker 官方提供的最佳实践 Go 语言内置的设计模式 HTTP1 到 HTTP3 的工程优化 Kubernetes 应用最佳实践 - init 容器和钩子函数 为什么 recover 必须在 defer 中调用? 为什么 defer 的执行顺序和注册顺序不同? Go map 设计与实现 Go 切片扩容底层实现 Go 语言中的零拷贝 Go Delve 云原生和边缘计算简介 Kubernetes Pod 服务质量等级 Kubernetes 应用最佳实践 - 探针 Kubernetes 应用最佳实践 - 资源请求和限制 CDN 原理 Kubernetes 应用最佳实践 - 开篇 缓存策略和模式 Go 内存模型 Kubernetes 核心概念 软件版本语义化
Kubernetes 应用最佳实践 - Sidecar 模式
2023-03-16 · via 蛮荆

2023-03-16 Kubernetes

Sidecar 模式

Sidecar (边车) 是一种安装在摩托车、踏板车或自行车侧面的单轮装置,使整个车辆成为三轮车辆。 – 维基百科

Sidecar 摩托三轮

Sidecar 和 Kubernetes 之间并没有什么实质性联系,但是通过 Sidecar 的机械工业设计思路,可以提炼出一种代码或者模块间的工作模式,称之为 “Sidecar 模式”。

在前面的文章中提到过,Pod 是 Kubernetes 中应用运行的最小单位 (同时也是顶级资源),也称为容器组,既然每个 Pod 可以存在多个容器, 根据二八原则,可以将多个容器分为核心容器和非核心容器,将机械的 Sidecar (三轮摩托) 映射到 Pod 中的容器资源,就可以得到 “Sidecar 模式” 的通俗表达:

  • 核心容器也称为 Main 容器,负责主要工作 (对应三轮摩托的驾驶位)
  • 非核心容器也称为 Sidecar 容器,负责辅助工作和扩展性工作 (对应三轮摩托的侧面单轮装置)

组合优于继承

Sidecar 容器可以在不修改 Main 容器的情况下,进行功能扩展和增强,允许功能单一的容器通过运行时组合完成更多任务,同时分离每个容器的关注点

大多数情况下,多个不同的容器由不同的团队开发,并且使用不同的技术栈,通过正交性保证单个容器在其他服务中可以被复用,既可以单个容器作为 Pod 独立运行,也可以多个容器协作运行。

示例

Pod 内部的容器可以通过卷 (Volume) 来共享文件数据,并且通过本地网络进行通信,我们可以利用 Pod 这两个特性来列举几个使用 Sidecar 模式的小例子。

1. 静态资源服务器

图片来源: https://www.amazon.com/Kubernetes-Patterns-Designing-Cloud-Native-Applications/dp/1492050288

在这个示例中,主要分为两个容器:

  1. Main 容器: HTTP Server 容器仅仅提供静态资源文件的 HTTP 请求服务,不需要关注具体的文件来源
  2. Sidecar 容器: 将静态资源文件通过 Git 定时从远程服务器同步到本地 HTTP Server 指定的目录,不需要关注文件同步后的下一步操作

2. 配置热更新

图片来源: https://www.manning.com/books/kubernetes-in-action-second-edition

在这个示例中,主要分为两个容器:

  1. Main 容器: 也就是应用容器
  2. Sidecar 容器: 将 ConfigMap 挂载为一个卷(Volume), 应用可以直接从卷中读取配置数据 (这里的 Sidecar 并不是容器形式,但是这也是 Sidecar 模式的一种体现)

当配置数据需要更新时,修改 ConfigMap, 然后 Kubernetes 会自动触发相关的事件,通知 Pod 更新其挂载的卷,Pod 接收到更新事件,重新加载卷中的配置文件,从而实现配置热更新。

3. 日志

图片来源: https://openkruise.io/docs/next/best-practices/log-container-sidecarset/

在这个示例中,主要分为两个容器:

  1. Main 容器: 也就是应用容器
  2. Sidecar 容器: 也就是 FileBeat 日志收集组件

FileBeat 收集日志之后,发送到 ElasticSearch 集群, 最后通过 Kibana 展示。


适配器模式

Kubernetes 中的适配器模式是 Sidecar 模式的一个变种,作用和 “设计模式” 中的适配器模式类似,用于对异构的容器系统进行包装,最终对外输出自适应统一的接口。

容器允许我们以统一的方式打包和运行用不同库和语言编写的应用程序。如今,多个团队使用不同的技术并创建由异构组件组成的分布式系统是很常见的。

当其他系统必须以统一的方式处理所有组件时,这种异构性可能会造成困难。适配器模式通过隐藏系统的复杂性并提供对其的统一访问来提供解决方案。

示例

1. 监控系统

例如现在有一个监控系统希望监控所有服务,但是不同的服务是通过不同的技术栈完成的,并且接口输出的监控指标格式和协议也不相同,这时候就可以通过适配器模式, 在内部将不同的服务的指标转换成一种格式和协议,最后输出给监控系统 (例如 Prometheus)。

图片来源: https://www.amazon.com/Kubernetes-Patterns-Designing-Cloud-Native-Applications/dp/1492050288

在这个示例中,主要分为两个容器:

  1. Main 容器: 也就是应用容器
  2. Sidecar 容器: 读取应用容器本地存储的指标,并转换为监控系统可以理解的格式和协议

例如,对于运行在 Pod 中的 Go 应用,Sidecar 容器知道如何获取和解析监控系统需要的数据,而对于运行在 Pod 中的 Java 应用,Sidecar 容器同样如此, 简单来说,Sidecar 容器就是那个 “最强辅助”。


大使模式

大使模式是 Sidecar 模式的另外一个变种,作用和 “设计模式” 中的代理模式类似,通过对外统一接口来隐藏内部的业务逻辑和实现。

示例

1. 缓存

图片来源: https://www.amazon.com/Kubernetes-Patterns-Designing-Cloud-Native-Applications/dp/1492050288

在这个示例中,主要分为两个容器:

  1. Main 容器: 也就是应用容器
  2. Sidecar 容器: 读取缓存数据,这里将数据存储委托给 etcd

当然,也可以将 Sidecar 容器的存储委托方切换到 memcached:

图片来源: https://www.amazon.com/Kubernetes-Patterns-Designing-Cloud-Native-Applications/dp/1492050288

扩展阅读