k8s的SidecarSet配置和initContainers

目录

  • 引言
  • 一、k8s如何实现Sidecar
      • 这段配置正确吗?
      • 正确的配置方式
      • 为什么这样做?
      • 一个简单的例子
      • 总结
  • 二、什么是SidecarSet
      • 主要功能
      • 使用场景
      • 示例配置
  • 三、也可以通过 initContainers 的 restartPolicy 实现边车逻辑
  • 四、题外话:什么是InitContainer
      • 核心功能
      • 常见用途
      • 示例

引言

前篇文章《k8s的CRD自定义资源类型示例》,我们介绍了k8s的CRD自定义资源类型,遗留了一个问题,SidecarSet 属于 Kubernetes 默认的 kind 类型吗?属于CRD吗?我们继续来探讨一下。

本文作为抛砖引玉,部分内容小马也并未实践验证(指见过实例但未自己配置run过),仅为互相学习参考。

在这里插入图片描述

一、k8s如何实现Sidecar

这段配置正确吗?

先来看一段k8s SidecarSet配置例子。

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: main-containerimage: my-app-image# ...# 添加 sidecar 容器的定义sidecarContainers:- name: sidecar-containerimage: my-sidecar-image# ...

问题:这段配置正确吗?

DS是这么回答的。👇

您好!您提供的配置片段是不正确的

标准的 Kubernetes Pod 配置中不存在 sidecarContainers 这个字段。

在 Kubernetes 中,所有的容器(无论是主容器还是 Sidecar 容器)都定义在 spec.containers 这一个数组里。Kubernetes 本身并不区分“主”和“辅助”,所有在同一个 Pod 里的容器都是平等定义的,共享网络和存储等资源。我们只是根据它们的功能角色,习惯性地称其中一个为“主容器”,其他的为“Sidecar 容器”。

正确的配置方式

您的 Pod 定义应该修改如下:

# 作为常规容器定义的方式
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers: # 只有一个 containers 数组- name: main-container # 你的主应用容器image: my-app-image# ... 其他配置(如端口、环境变量等)- name: sidecar-container # 你的 Sidecar 容器image: my-sidecar-image# ... Sidecar 容器的其他配置# 还可以定义更多的容器...# - name: another-sidecar#   image: another-image

为什么这样做?

这种设计是 Kubernetes 的核心概念之一:

  1. 亲密性:Sidecar 模式用于将紧密协作的容器部署在同一个 Pod 中。
  2. 资源共享:同一个 Pod 内的所有容器:
    • 共享相同的网络命名空间(localhost)、IP 地址和端口空间。
    • 可以通过共享卷(Volumes)来交换数据。

一个简单的例子

下面是一个更具体的例子,包含一个主 Web 服务器和一个 Sidecar 容器(用于从共享卷中读取日志):

apiVersion: v1
kind: Pod
metadata:name: web-server-with-logger
spec:volumes:- name: shared-logs # 定义一个共享卷emptyDir: {}containers:- name: web-serverimage: nginx:alpineports:- containerPort: 80volumeMounts:- name: shared-logs # 将共享卷挂载到主容器的日志目录mountPath: /var/log/nginx- name: log-sidecarimage: busyboxargs: [/bin/sh, -c, 'tail -f /var/log/nginx/access.log'] # Sidecar 实时读取日志volumeMounts:- name: shared-logs # 将同一个共享卷也挂载到 Sidecar 容器mountPath: /var/log/nginx

在这里插入图片描述

总结

请记住:永远使用 spec.containers 数组来定义 Pod 中的所有容器sidecarContainers 不是一个有效的 Kubernetes 字段,会导致 API 校验错误,Pod 创建失败。

但需要注意,在Kubernetes中,kind: Pod是用于定义‌最小可部署计算单元‌的核心配置。实际生产环境中通常通过Deployment/StatefulSet等控制器间接管理Pod,而非直接操作。即如Deployment中的template字段定义了Pod的规格,包括容器镜像、端口等配置。

如:

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: serverbname: deployment-test-name #Deployment namenamespace: my-test-space #命名空间(隔离)
spec:replicas: 2selector:matchLabels:app: serverb #label标签template:metadata:labels:app: serverb #label标签spec:containers:- image: 'mirrors-registry-hub.com/mytestspace:serverb-v2' #容器将运行的镜像仓库中的镜像serverb-v2name: serverb #容器nameports:- containerPort: 9502 #容器的端口(相当于docker run时指定的端口)resources:limits:cpu: 250mmemory: 128Mirequests:cpu: 250mmemory: 128Mi

Deployment定义‌:通过replicas:2声明需要2个Pod副本,selector匹配带有app:serverb标签的Pod。

Pod模板‌:template字段定义了Pod的规格,包括容器镜像、端口等配置。

自动管理‌:Deployment会自动创建ReplicaSet来维护Pod副本数,确保始终有2个serverb Pod运行。

二、什么是SidecarSet

除了上文中作为常规容器定义,kind: Pod形式的主辅容器定义来实现Sidecar,边车容器应与主容器并列定义在 containers 字段中,共享 Pod 的网络和存储命名空间
还。有SidecarSet方式。

SidecarSet 是 Kubernetes 的一种自定义资源定义(CRD),属于Kruise扩展功能,主要用于在 Pod 中自动注入辅助容器(sidecar),实现日志收集、监控、鉴权等功能。

SidecarSet 不属于 Kubernetes 默认的 kind 类型,而是由 ‌OpenKruise‌ 项目提供的 ‌CRD(Custom Resource Definition)‌,用于专门管理 Sidecar 容器的生命周期‌。

OpenKruise是一个CNCF孵化项目,为Kubernetes提供扩展工作负载和应用管理功能,如CloneSet、AdvancedStatefulSet等。它增强了Kubernetes的自动化能力,包括原地升级、sidecar容器管理、高可用性防护和高级运维特性,适用于大规模云原生应用部署和管理。

主要功能

  • 自动注入:通过 admission webhook 机制,为符合标签选择器(如 app=nginx)的 Pod 自动添加 sidecar 容器。
  • 版本管理:支持原地升级已注入的 sidecar 容器镜像,无需重新部署 Pod。
  • 解耦设计:将 sidecar 容器的定义与业务容器解耦,便于独立升级和维护。

使用场景

适用于需要为特定 Pod 注入无状态辅助容器的场景,例如日志采集、监控代理等。例如,当所有 Pod 需统一注入日志收集器时,可使用 SidecarSet;若仅部分 Pod 需要特定功能(如慢查询采样),则更适合使用 SidecarSet 精细控制。

示例配置

# SidecarSet的方式注入边车
apiVersion: apps.kruise.io/v1alpha1  
kind: SidecarSet  
metadata:  name: scs-demo  
spec:  selector:  matchLabels:  app: nginx # app=nginx  的 Pod containers:  - name: sidecar1  image: busybox  command: ["sleep", "999d"]  volumeMounts:  - name: log-volume  mountPath: /var/log  

该配置会匹配所有 app=nginxPod,并向其注入 busybox 容器用于日志收集。

三、也可以通过 initContainers 的 restartPolicy 实现边车逻辑

当然还有一种方式,若集群启用了 SidecarContainers 特性门控(默认从 v1.29 开始启用),可通过 initContainers 的 restartPolicy 实现边车逻辑

# 使用 Kubernetes 原生 Sidecar 特性(v1.29+)方式
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:initContainers:- name: sidecar-containerimage: my-sidecar-imagerestartPolicy: Always  # 关键配置,使容器持续运行containers:- name: main-containerimage: my-app-image

常规容器方式适用于所有版本,但需手动管理边车生命周期。
原生 Sidecar 特性支持独立重启策略,避免主容器退出时边车阻塞 Pod 终止。

四、题外话:什么是InitContainer

InitContainer是Kubernetes中 Pod 的一部分,用于在主容器启动前执行初始化任务

核心功能

  • 顺序执行:多个InitContainer按定义顺序依次运行,所有InitContainer执行完成后主容器才会启动。
  • 资源共享与主容器共享存储卷和网络命名空间InitContainer产生的数据可被主容器使用

常见用途

  1. 数据库初始化:在主容器启动前完成数据库表创建、数据导入等操作。
  2. 配置文件加载:将配置文件、证书等从存储卷复制到主容器内部。
  3. 资源预热:提前分配CPU、内存等资源,避免主容器启动时资源不足。
  4. 网络检查:验证与其他服务的网络连接是否正常。

示例

apiVersion: v1
kind: Pod
metadata:name: myapp-pod
spec:containers:- name: myapp-containerimage: myappvolumeMounts:- name: config-volumemountPath: /appinitContainers:- name: config-initimage: busyboxcommand: ["sh", "-c", "cp /etc/config /app/config"]volumeMounts:- name: config-volumemountPath: /appvolumes:- name: config-volumeemptyDir: {}

该YAML定义了一个Kubernetes Pod资源,包含主容器和初始化容器,功能如下:

  • 基础结构‌

apiVersion/kind:声明Kubernetes资源类型为Pod
metadata:定义Pod名称为myapp-pod

  • 主容器‌

运行myapp镜像,挂载共享卷config-volume到/app目录

  • 初始化容器‌

使用busybox镜像,启动时执行命令将/etc/config复制到共享卷的/app/config
通过volumeMounts与主容器共享存储空间

  • 存储卷配置‌

定义emptyDir类型的临时卷config-volume,供容器间共享文件

特点:通过初始化容器完成预配置后,主容器才启动,确保依赖文件就绪。临时卷生命周期与Pod绑定。

这个Pod会运行‌两个容器‌,但它们的运行方式不同:

  • 主容器‌
    myapp-container(基于myapp镜像)会持续运行,直到Pod被删除

  • 初始化容器‌
    config-init(基于busybox镜像)仅在Pod启动时运行一次,完成配置文件复制后立即退出

关键区别:
初始化容器先于主容器执行;
初始化容器执行完成后才会启动主容器;
初始化容器完成任务后即终止,不会持续运行

因此最终Pod中‌持续运行的只有myapp容器‌,busybox容器仅作为初始化工具短暂存在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95780.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL与SQL Server:为什么 PostgreSQL遥遥领先

PostgreSQL与SQL Server:为什么 PostgreSQL遥遥领先 在数据库领域,PostgreSQL 和 Microsoft SQL Server 长期以来一直是竞争对手。然而,近年来,PostgreSQL 以其性能、灵活性和创新功能让 SQL Server 望尘莫及。以下是对 PostgreSQL 明显优越的…

零跑汽车8月交付57066台,同比增长超88%

零跑汽车官宣,在刚刚过去的8月份,品牌交付57066辆,同比增长超88%再创历史新高,并实现了连续6个月稳坐新势力销冠。目前,零跑旗下共有T03、B10、B01、C01、C10、C11、C16等七款车型在售,得益于零跑坚持全栈自…

DNS地址推荐

DNS地址推荐(2025年最新整理) 以下DNS服务器按使用场景分类,涵盖国内、国际、安全隐私、游戏优化等需求,均为2025年仍在维护的公共DNS服务: 一、国内通用DNS(适合中国大陆用户) 国内DNS服务器对…

兴趣电商内容数据洞察未来市场走向研究——基于开源AI智能名片链动2+1模式S2B2C商城小程序的实践

摘要:在互联网电商数据高度透明的当下,“已发生”的品类规模和品类增速数据虽易获取,但主要反映市场历史状况,难以预测未来走向。兴趣电商的内容数据因揭示消费者“新需求”和“潜在需求”,在宏观层面更早体现用户消费…

【已更新文章+代码】2025数学建模国赛A题思路代码文章高教社杯全国大学生数学建模-烟幕干扰弹的投放策略

截止周四晚上11点已更新五个问题完整建模和问题一二的代码 截止周五早上完整版已更新 可以看主页最新博文获取 完整内容请看文末最后的推广群2.1问题1的分析 问题1是典型的确定性时空几何与运动学计算问题,核心在于通过建立坐标系下的参数方程,量化烟幕云…

UE4 Rider如何直接调试PC DebugGame

背景1、用UBT 打了一个exe的包,打开时遇到崩溃,想获知这个崩溃时的中间信息,例如材质信息,于是我直接双击 打包位置下的崩溃dmp文件 (MyGame/Saved/Archived/WindowsClient/MyGame/Saved/Crashes/....dmp) …

【FastDDS】Layer DDS之Domain ( 06-Partitions )

在DDS(Data Distribution Service,数据分发服务)中,Partition(分区) 是一种在“域(Domain)”提供的物理隔离基础上,为发布者(Publisher)和订阅者(Subscriber)新增的逻辑隔离与通信筛选机制。它的核心作用是在“域”和“主题(Topic)”之外,进一步精细化控制哪些…

FastVLM:高效视觉编码助力视觉语言模型突破高分辨率效率瓶颈

想要掌握如何将大模型的力量发挥到极致吗?叶梓老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具。 1小时实战课程,您将学习到如何轻松上手并有效利用 Llama Factory 来微调您的模型,以发挥其最大潜力。 CSDN教学平台录播地址…

【HarmonyOS】一步解决弹框集成-快速弹框QuickDialog使用详解

【HarmonyOS】一步解决弹框集成-快速弹框QuickDialog使用详解 一、集成的应用背景介绍 最近比较忙,除了工作节奏调整,有重点项目需要跟。业务时间,也因为参加了25年创新大赛,我们网友,组成了鸿蒙超新星研发团队&#x…

当公司在你电脑上安装了IP-guard,你必须知道的事

保护公司机密的同时,你的隐私权何在?在现代企业中,为了保护敏感数据和知识产权,很多公司会选择在员工电脑上安装监控软件,IP-guard 就是其中常见的一款。如果你发现公司电脑安装了IP-guard,以下几点是你需要…

拆分TypeScript项目的学习收获:避免缓存问题,peerDependencies,引用本地项目

最近需要将工作中的一个TS包拆出一部分代码,以便在多个团队和项目中共享。原以为这会是一项特别简单的工作,但是也花了两天才大致拆成功。因此记录一下,也给有类似需求的同学一点经验。 所拆项目的大致功能:整个项目的结构大致分为…

无人机各种接头焊接方法

无人机接头的焊接直接关系到设备可靠性和飞行安全,以下是常见接头的焊接方法及注意事项:一、焊接通用原则工具准备恒温焊台(推荐温度:$350 \pm 20^{\circ}\text{C}$)含松芯焊锡丝(直径0.8mm)助焊…

[Linux] Linux标准块设备驱动详解:从原理到实现

Linux标准块设备驱动详解:从原理到实现 在Linux系统中,块设备是存储系统的核心组成部分,涵盖了硬盘、固态硬盘(SSD)、U盘、SD卡等各类持久化存储介质。与字符设备不同,块设备以固定大小的“块”为单位进行数…

什么是压力测试,有哪些方法

压力测试(Stress Testing)是性能测试的一种,旨在评估系统在极端负载条件下的表现,验证其稳定性、可靠性和容错能力。通过模拟超出正常范围的并发用户、数据量或请求频率,发现系统在高负载下的瓶颈(如内存泄…

lua脚本在redis中执行是否是原子性?

lua脚本在redis中执行是否是原子性?以及是否会阻塞其他脚本的执行【客户端的请求】?先解答第二个问题:是的,保持原子执行。这也是redis中支持lua脚本执行的原因。Lua 脚本在 Redis 中是以原子方式执行的,在 Redis 服务器执行EVAL命…

DeepSeek文献太多太杂?一招制胜:学术论文检索的“核心公式”与提问艺术

如果我们想要完成一次学术论文检索,那我们可以把它想象成一次精准的“学术寻宝”。你不是在漫无目的地闲逛,而是一名装备精良的“学术寻宝猎人”,你的目标是找到深藏在浩瀚文献海洋中的“珍宝”(高价值论文)。1 你的寻…

Linux内存管理章节一:深入浅出Linux内存管理:从物理内存到ARM32的用户与内核空间

引言 如果说操作系统是计算机的心脏,那么内存管理就是它的灵魂脉络。它默默地工作在Linux内核的最底层,却决定着整个系统的稳定性、安全性和性能。今天,我们将拨开迷雾,深入探索Linux内存管理的核心概念,并结合熟悉的A…

ECMAScript (5)ES6前端开发核心:国际化与格式化、内存管理与性能

好的,我将根据【国际化与格式化】和【内存管理与性能】这两个主题,为你生成详细的课件内容,涵盖概念、应用和实例。 📗 前端开发核心:国际化与格式化、内存管理与性能 1. 国际化与格式化 (Internationalization & …

3D 可视化数字孪生运维管理平台:构建 “虚实协同” 的智慧运维新范式

3D 可视化数字孪生运维管理平台通过 “物理空间数字化建模 实时数据动态映射 智能分析决策”,将建筑、园区、工业设施等物理实体 1:1 复刻为虚拟孪生体,打破传统运维 “信息割裂、依赖经验、响应滞后” 的痛点,实现从 “被动抢修” 到 “主…

DP-观察者模式代码详解

观察者模式: 定义一系列对象之间的一对多关系;当一个对象改变状态,它的依赖都会被通知。 主要由主题(Subject)和观察者(Observer)组成。 代码实现 package com.designpatterns.observer;/*** 定…