深入理解Docker和K8S

深入理解Docker和K8S

Docker 是大型架構的必備技能,也是云原生核心。Docker 容器化作為一種輕量級的虛擬化技術,其核心思想:將應用程序及其所有依賴項打包在一起,形成一個可移植的單元。

容器的本質是進程:

容器是在 Linux 宿主機上運行的一個進程,

  • 容器的鏡像中定義了容器啟動時運行的程序。
  • 在啟動時,被設置了新的 NameSpace、IPC、Network、PID、Mount、UTS,所以容器所能看到的進程,網絡、磁盤掛載,都與宿主機不同。

通過 Linux 提供的三大核心機制實現:

在這里插入圖片描述
1.Namespace:實現資源隔離Namespace是Linux內核提供的資源隔離機制,為容器創建獨立的系統資源視圖,包括:PID Namespace:隔離進程ID,容器內進程只能看到本容器進程。Network Namespace:隔離網絡棧,容器擁有獨立的網絡接口和IP。Mount Namespace:隔離文件系統掛載點,容器有獨立文件系統視圖。User Namespace:隔離用戶和組ID,提升安全性。IPC、UTS等 Namespace:隔離進程間通信、主機名等資源。通過Namespace,Docker容器實現進程、網絡、文件系統等多維度的隔離,保證容器間互不干擾。

2.Cgroups:資源限制與配額Cgroups是Linux內核的資源管理機制,用于限制和監控容器的資源使用,包括CPU、內存、磁盤I/O和網絡帶寬。它保證容器不會超出分配資源,防止資源爭搶和系統過載。Cgroups支持資源優先級管理和統計監控,是Docker實現資源控制的基礎。

3.UnionFS:鏡像的分層文件系統UnionFS(聯合文件系統)允許將多個只讀鏡像層疊加,形成一個統一的文件系統視圖。每個鏡像層存儲相對于上一層的增量變化,支持鏡像層的共享和復用。容器啟動時,在鏡像層之上添加可寫層,實現寫時復制(Copy-on-Write),保證鏡像層只讀且容器的文件變更隔離。

NameSpace 限制了容器能看到的世界:

Linux NameSpace:默認情況下,子進程會復制父進程的 NameSpace。
在這里插入圖片描述

Cgroup 限制容器能夠使用的資源:

Cgroup 能夠對進程使用系統資源進行限制,以 CPU 資源、Memory 資源為例。

CPU資源:

1、限制容器的 CPU 資源使用:cpu.cfs_period_us調度周期(默認為 10000 us)、cpu.cfs_quota_us=-1不限制CPU使用份額、cpu_sharesCPU分配比例(多個容器競爭CPU資源時使用)。
在這里插入圖片描述
2、容器運行后,會創建對應的/sys/fs/cgroup/cpu/docker/<CONTAINER ID>目錄,用于 CPU 資源的控制組(cgroups)管理。以下是各個文件和目錄的作用解釋:
在這里插入圖片描述

  • cgroup.clone_children: 這個文件影響 clone() 系統調用,用于控制是否在創建新進程時復制父進程的 CPU 控制組設置。
  • cgroup.procs: 包含當前 cgroup 中的所有進程 ID (PID)。這個文件可讀可寫,寫入一個 PID 可以將該進程移動到這個 cgroup 中。
  • cpuacct.stat: 報告這個 cgroup 中所有進程的 CPU 使用情況,包括用戶態和內核態的使用時間。
  • cpuacct.usage: 報告這個 cgroup 中所有進程的總 CPU 使用時間,以納秒為單位。
  • cpuacct.usage_all: 顯示每個 CPU 的使用情況,包括用戶態和內核態的使用時間。
  • cpuacct.usage_percpu: 顯示每個 CPU 核心的使用時間。
  • cpuacct.usage_percpu_sys: 顯示每個 CPU 核心的內核態使用時間。
  • cpuacct.usage_percpu_user: 顯示每個 CPU 核心的用戶態使用時間。
  • cpuacct.usage_sys: 報告這個 cgroup 中所有進程在內核態下的 CPU 使用時間。
  • cpuacct.usage_user: 報告這個 cgroup 中所有進程在用戶態下的 CPU 使用時間。
  • cpu.cfs_period_us: 配合 cpu.cfs_quota_us 使用,定義 CPU 帶寬控制的時間周期,以微秒為單位。
  • cpu.cfs_quota_us: 定義 cgroup 在 cpu.cfs_period_us 周期內可以使用的 CPU 時間總量,以微秒為單位。通過設置這個值,可以限制 cgroup 的 CPU 使用帶寬。
  • cpu.shares: 定義 cgroup 的 CPU 分享數。值越高,cgroup 在競爭 CPU 資源時獲得的優先級越高。
  • cpu.stat: 提供一些 CPU 限制的統計信息,比如用戶態和系統態下的等待時間。
  • notify_on_release: 控制當 cgroup 的最后一個進程結束時,是否自動刪除該 cgroup。設置為 1 表示啟用通知,設置為 0 表示禁用。
  • tasks: 包含當前 cgroup 中的所有線程 ID (TID)。與 cgroup.procs 類似,但包含線程而不是進程。
Memory資源:

1、限制容器的 Memory 資源使用:memory.limit_in_bytes限制容器可以使用的物理內存的上限、memory.oom_control容器超過內存上限的策略(默認為kill)
在這里插入圖片描述
2、容器運行后,會創建對應的/sys/fs/cgroup/memory/docker/<CONTAINER ID>目錄,用于 Memory 資源的控制組(cgroups)管理。以下是各個文件和目錄的作用解釋:
在這里插入圖片描述

  • cgroup.clone_children: 影響 clone() 系統調用,用于控制是否在創建新進程時復制父進程的內存控制組設置。
  • cgroup.event_control: 用于事件控制,當某些條件滿足時,可以觸發用戶空間的事件通知。
  • cgroup.procs: 包含當前 cgroup 中的所有進程 ID (PID)。這個文件可讀可寫,寫入一個 PID 可以將該進程移動到這個 cgroup 中。
  • memory.failcnt: 記錄內存資源分配失敗的次數。
  • memory.force_empty: 觸發內存 cgroup 的強制清空。
  • memory.kmem.failcnt: 記錄內核內存分配失敗的次數。
  • memory.kmem.limit_in_bytes: 設置內核內存的使用限制,以字節為單位。
  • memory.kmem.max_usage_in_bytes: 記錄內核內存的最大使用量,以字節為單位。
  • memory.kmem.slabinfo: 顯示內核 slab 分配器的內存使用信息。
  • memory.kmem.tcp.failcnt: 記錄 TCP 緩沖相關的內核內存分配失敗的次數。
  • memory.kmem.tcp.limit_in_bytes: 設置 TCP 緩沖相關的內核內存的使用限制,以字節為單位。
  • memory.kmem.tcp.max_usage_in_bytes: 記錄 TCP 緩沖相關的內核內存的最大使用量,以字節為單位。
  • memory.kmem.tcp.usage_in_bytes: 顯示當前 TCP 緩沖相關的內核內存使用量,以字節為單位。
  • memory.kmem.usage_in_bytes: 顯示當前內核內存使用量,以字節為單位。
  • memory.limit_in_bytes: 設置 cgroup 的內存使用限制,以字節為單位。
  • memory.max_usage_in_bytes: 記錄 cgroup 的最大內存使用量,以字節為單位。
  • memory.move_charge_at_immigrate: 控制當進程移動到其他 cgroup 時,是否移動其內存使用量。
  • memory.numa_stat: 顯示 NUMA 節點相關的內存使用統計信息。
  • memory.oom_control: 控制內存不足時的行為。
    一旦容器內的進程占用內存超過限制,則可通過設置該字段讓進程kill。
  • memory.pressure_level: 用于監控內存壓力水平,可以設置觸發事件通知的閾值。
  • memory.soft_limit_in_bytes: 設置內存的軟限制,以字節為單位。超過軟限制不會直接導致 OOM,但系統會嘗試回收內存。
  • memory.stat: 包含各種內存使用統計信息,如當前使用量、RSS、緩存等。
  • memory.swappiness: 控制 cgroup 的交換傾向程度,值范圍為 0-100。
  • memory.usage_in_bytes: 顯示當前內存使用量,以字節為單位。
  • memory.use_hierarchy: 控制是否在計算內存使用時考慮子 cgroup。
  • notify_on_release: 控制當 cgroup 的最后一個進程結束時,是否自動刪除該 cgroup。設置為 1 表示啟用通知,設置為 0 表示禁用。
  • tasks: 包含當前 cgroup 中的所有線程 ID (TID)。與 cgroup.procs 類似,但包含線程而不是進程。

Overlay2文件系統:

overlay2 是一種堆疊文件系統,基于 Linux 內核的 OverlayFS 技術,依賴并建立在其他文件系統上,并不參與磁盤空間結構的劃分,僅是將底層文件系統中的不同目錄結構進行“合并”,然后向用戶呈現。

在這里插入圖片描述

  • 上層會覆蓋下層相同的內容,故用戶只能看到和操作 Merge 層,操作的變化會記錄在 Upper 層,Lower 層是只讀的
  • 用戶創建新文件,則upper層會直接創建;刪除文件,則在upper層創建一個“屏蔽”文件,屏蔽(whiteout)掉lower層的同名文件;修改文件內容,執行copy-on-write將lower層文件拷貝到upper層,保留原文件名只在upper層修改文件內容,并屏蔽(whiteout)掉lower層;修改文件名,執行copy-on-write將lower層文件拷貝到upper層,使用新文件名,并在upper層創建一個與原名相同的“屏蔽”文件用來屏蔽(whiteout)掉lower層。

Overlay2 是 Docker 默認使用的聯合文件系統 UFS(Union Filesystem),用于管理容器鏡像的分層存儲和容器運行時文件系統的合并。

在這里插入圖片描述

Overlay2 是 Docker 的分層存儲引擎,通過聯合掛載實現高效的文件管理。Docker 的 Overlay2 數據默認存儲在 /var/lib/docker/overlay2/(通過docker inspect <container-ID>中的GraphDriver字段,查看對應層數據的存儲位置)。當啟動容器時,

  • 鏡像層(Lower Dir):所有鏡像層按順序堆疊(如 base-image → apt-get install → copy files)。
  • init層:會將宿主機的一些host相關的文件/目錄拷貝到對應的docker層的文件/目錄下,之后這些文件會被掛載給容器。
  • 容器層(Upper Dir):鏡像層之上創建的一個可寫層,存儲容器運行時的修改。
  • 合并視圖(Merged):將只讀層和可寫層合并,形成容器的完整文件系統。

在這里插入圖片描述
注意:docker commit時,只會保存 upper 層,不會保存 init 層。
在這里插入圖片描述

Overlay2 的優點:

  • 高效分層存儲:多個容器共享相同的基礎鏡像層,節省空間。
  • 寫時復制(CoW):只有修改文件時才復制,減少磁盤 I/O。
  • 性能較好:相比 aufs 和 devicemapper,Overlay2 是 Docker 推薦的存儲驅動。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81879.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81879.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81879.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

list.forEach(s -> countService.refreshArticleStatisticInfo(s.getId())); 講解一下語法

這段代碼使用了Java中的forEach方法結合Lambda表達式來遍歷一個列表&#xff0c;并對列表中的每個元素執行特定操作。具體來說&#xff0c;它會遍歷列表中的每一個元素&#xff0c;并調用countService.refreshArticleStatisticInfo(s.getId())方法來刷新每個文章的統計信息。下…

AI開發者的算力革命:GpuGeek平臺全景實戰指南(大模型訓練/推理/微調全解析)

目錄 背景一、AI工業化時代的算力困局與破局之道1.1 中小企業AI落地的三大障礙1.2 GpuGeek的破局創新1.3 核心價值 二、GpuGeek技術全景剖析2.1 核心架構設計 三、核心優勢詳解?3.1 優勢1&#xff1a;工業級顯卡艦隊???3.2 優勢2&#xff1a;開箱即用生態?3.2.1 預置鏡像庫…

05算法學習_59. 螺旋矩陣 II

05算法學習_59. 螺旋矩陣 II 05算法學習_59. 螺旋矩陣 II題目描述&#xff1a;個人代碼&#xff1a;學習思路&#xff1a;第一種寫法&#xff1a;題解關鍵點&#xff1a; 個人學習時疑惑點解答&#xff1a; 05算法學習_59. 螺旋矩陣 II 力扣題目鏈接: 59. 螺旋矩陣 II 題目描…

JDK7Hashmap的頭插法造成的環問題

單線程下的擴容 多線程下的擴容 next&#xff1d;e 然后e的next變成e

JAVA|后端編碼規范

目錄 零、引言 一、基礎 二、集合 三、并發 四、日志 五、安全 零、引言 規范等級&#xff1a; 【強制】&#xff1a;強制遵守&#xff0c;來源于線上歷史故障&#xff0c;將通過工具進行檢查。【推薦】&#xff1a;推薦遵守&#xff0c;來源于日常代碼審查、開發人員反饋…

2025-05-21 Python深度學習5——數據讀取

文章目錄 1 數據準備2 Dataset2.1 自定義 Dataset2.2 使用示例 3 TensorBoard3.1 安裝3.2 標量可視化&#xff08;Scalars&#xff09;3.3 圖像可視化&#xff08;Images&#xff09;3.4 其他常用功能 4 transform4.1 ToTensor()4.2 Normalize()4.3 Resize()4.4 Compose()4.5 C…

5月21日學習筆記

MYSQL三層結構 表1 數據庫DB1 表2 數據庫管理系統 客戶端命令終端&#xff08;Dos&#xff09; DBMS 數據庫DB2 表1 表2 數據庫………. Mysql數據庫-表的本質仍然是文件 表的一行稱之為一條記錄->在java程序中一行記錄往往使用對象表示 SQL語…

二十、面向對象底層邏輯-ServiceRegistry接口設計集成注冊中心

一、服務治理的基石接口 在微服務架構中&#xff0c;服務實例的動態注冊與發現是保證系統彈性的關鍵機制。Spring Cloud Commons模塊通過ServiceRegistry與Registration接口定義了服務注冊的標準化模型&#xff0c;為不同服務發現組件&#xff08;Eureka、Consul、Nacos等&…

DeepSeek:以開源之力,引領AI技術新風潮

在年春節&#xff0c;大語言模型DeepSeek如同一枚震撼彈&#xff0c;在全球范圍內引發了轟動&#xff0c;成功“破圈”&#xff0c;將中國的人工智能&#xff08;AI&#xff09;技術成果推向了世界舞臺。 開源策略&#xff1a;打破技術壁壘 在AI行業&#xff0c;OpenAI等巨頭…

完整改進RIME算法,基于修正多項式微分學習算子Rime-ice增長優化器,完整MATLAB代碼獲取

1 簡介 為了有效地利用霧狀冰生長的物理現象&#xff0c;最近開發了一種優化算法——霧狀優化算法&#xff08;RIME&#xff09;。它模擬硬霧狀和軟霧狀過程&#xff0c;構建硬霧狀穿刺和軟霧狀搜索機制。在本研究中&#xff0c;引入了一種增強版本&#xff0c;稱為修改的RIME…

PyTorch可視化工具——使用Visdom進行深度學習可視化

文章目錄 前置環境Visdom安裝并啟動VisdomVisdom圖形APIVisdom靜態更新API詳解通用參數說明使用示例Visdom動態更新API詳解1. 使用updateappend參數2. ~~使用vis.updateTrace方法~~3. 完整訓練監控示例 Visdom可視化操作散點圖plot.scatter()散點圖案例線性圖vis.line()vis.lin…

Java使用Collections集合工具類

1、Collections 集合工具類 Java 中的 Collections 是一個非常有用的工具類&#xff0c;它提供了許多靜態方法來操作或返回集合。這個類位于 java.util 包中&#xff0c;主要包含對集合進行操作的方法&#xff0c;比如排序、搜索、線程安全化等。 Java集合工具類的使用&#x…

Unity基礎學習(五)Mono中的重要內容(1)延時函數

目錄 一、Mono中的延時函數Invoke 1. Invoke作用&#xff1a;延遲指定時間后執行一次函數。API&#xff1a; 2. InvokeRepeating作用&#xff1a;延遲后開始重復執行函數。API&#xff1a; 3. CancelInvoke作用&#xff1a;停止所有延時函數&#xff0c;或停止指定函數的延時…

180KHz 60V 5A開關電流升壓/升降壓型DC-DC轉換器XL4019升降壓芯片

介紹 XL6019是一款專為升壓、升降壓設計的 單片集成電路&#xff08;升壓和降壓是由外圍電路拓撲確定的&#xff09;&#xff0c;可工作在DC5V到40V輸入電 壓范圍&#xff0c;低紋波&#xff0c;內置功率MOS。XL6019內 置固定頻率振蕩器與頻率補償電路&#xff0c;簡化了電 路…

如何暢通需求收集渠道,獲取用戶反饋?

要暢通需求收集渠道、有效獲取用戶反饋&#xff0c;核心在于多樣化反饋入口、閉環反饋機制、用戶分層管理、反饋數據結構化分析等四個方面。其中&#xff0c;多樣化反饋入口至關重要&#xff0c;不同用戶有不同的溝通偏好&#xff0c;只有覆蓋多個反饋路徑&#xff0c;才能捕捉…

Python結合ollama和stramlit開發聊天機器人

Python結合ollama和stramlit開發聊天機器人 一、環境準備1、streamlit安裝2、langchain安裝3、ollama的安裝 二、Ollama平臺聊天機器人實現1、需求2、模型調用3、前端實現頁面呈現代碼實現 三、詳細代碼地址四、參考資源 一、環境準備 1、streamlit安裝 # 通過 pip 安裝 pip …

java jdbc執行Oracle sql文件

執行代碼 import java.io.FileInputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.DriverManager;import org.apache.ibatis.jdbc.ScriptRunner;public class ExecSqlFileController {pu…

[Java實戰]Spring Boot整合MinIO:分布式文件存儲與管理實戰(三十)

[Java實戰]Spring Boot整合MinIO&#xff1a;分布式文件存儲與管理實戰&#xff08;三十&#xff09; 一、MinIO簡介與核心原理 MinIO 是一款高性能、開源的分布式對象存儲系統&#xff0c;兼容 Amazon S3 API&#xff0c;適用于存儲圖片、視頻、日志等非結構化數據。其核心特…

開發指南115-CSS中選擇器關系

1、選擇后代 可以用選擇器1 選擇器2&#xff08;中間用空格分隔&#xff09;來表達&#xff0c;也可以在大括號里通過包含關系來表達 舉例 .a .b 舉例.a { .b{} } 注意css本身并不支持嵌套的寫法&#xff0c;是scss等提供的擴展能力。 2、選擇直系后代 選擇器1 > 選擇器2&a…

創建型:抽象工廠模式

目錄 1、核心思想 2、實現方式 2.1 模式結構 2.2 實現案例 3、優缺點分析 4、適用場景 1、核心思想 目的&#xff1a;統一管理相關對象的創建&#xff0c;確保產品兼容性。優先用于需要強約束產品兼容性的場景&#xff08;如UI主題、跨平臺適配&#xff09; 概念&#…