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
英文地址,請注明出處:http://en.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;/*** 定…