17. 容器化升級對服務有哪些影響?

隨著各種云服務的發(fā)展,越來越多的服務運行在以 Docker 為代表的容器之內(nèi)

容器化技術(shù)簡介

容器技術(shù)是一種更加輕量級的操作系統(tǒng)隔離方案
可以將應用程序及其運行依賴環(huán)境打包到鏡像中
通過容器引擎進行調(diào)度,并且提供進程隔離和資源限制的運行環(huán)境

容器化技術(shù)

在容器技術(shù)中,最具代表性且應用最廣泛的是 Docker 技術(shù)
Docker 是一個開源的應用容器引擎
可以打包應用以及依賴包到一個可移植的容器中,然后發(fā)布到服務器上
Docker 容器基于鏡像運行,可部署在物理機或虛擬機上
通過容器引擎與容器編排調(diào)度平臺實現(xiàn)容器化應用的聲明周期管理

使用容器化技術(shù)有哪些好處?

Docker 只包含應用程序以及依賴庫
處于一個隔離的環(huán)境中
這使得 Docker 更加輕量高效

兩種虛擬化技術(shù)的對比

虛擬機是一個運行在宿主機之上的完整 操作系統(tǒng)
虛擬機運行自身操作系統(tǒng)會占用較多的 CPU,內(nèi)存,硬盤資源
虛擬化技術(shù)為用戶提供了一個完整的虛擬機,包括操作系統(tǒng)在內(nèi)
容器化技術(shù)為應用程序提供了隔離的運行空間,容器之間共享同一個上層操作系統(tǒng)內(nèi)核
虛擬化技術(shù)有更佳的隔離性和安全性,但更新和升級困難
容器化具有快速擴展,靈活性和易用性等優(yōu)勢,但隔離性較差,安全性相對較低
實際部署一般是把兩種技術(shù)結(jié)合起來,比如一個虛擬機中運行多個容器

容器化的原理

容器技術(shù)的核心是如何實現(xiàn)容器內(nèi)資源的限制,以及不同容器之間的隔離


20230806154904.jpg

Namespace

Namespace 的目的是
通過抽象方法使得 Namespace 中的進程看起來擁有它們自己的隔離的全局系統(tǒng)資源實例
Linux 內(nèi)核實現(xiàn)了六種 Namespace :

  • Mount namespace (隔離文件系統(tǒng))
  • UTS namespaces (定義 hostname 和 domainame)
  • IPC namespaces (特定的進程間通信資源)
  • PID namespaces (獨立進程ID結(jié)構(gòu))
  • Network namespaces (獨立網(wǎng)絡設備)
  • User namespaces (用戶和組ID空間)

Cgroups

CGroups (Control Groups) 的功能主要是限制,記錄,隔離進程所使用的物理資源
比如 CPU,Memory,IO,Network 等
CGroups 在接收到調(diào)用時,會給指定的進程掛上鉤子,這個鉤子會在資源被使用的時候觸發(fā)
觸發(fā)時會根據(jù)資源的類別,比如 CPU,Memory,IO 等,然后使用對應的方法進行限制

CGroups 中有一個術(shù)語叫做 Subsystem 子系統(tǒng),也就是一個資源調(diào)度控制器
CPU Subsystem 負責 CPU 的時間分配,Memory Subsystem 負責 Memory 的使用量等
Docker 啟動一個容器后,會在 /sys/fs/cgroups 目錄下生成帶有此容器的 ID 的文件夾

微服務如何適配容器化

微服務的設計思想是對系統(tǒng)功能進行解耦,拆分為單獨的服務,可以獨立運行
應用容器技術(shù)可以對服務進行快速水平擴展,從而到達彈性部署業(yè)務的能力
微服務結(jié)合 Docker 部署,更加方便微服務架構(gòu)運維部署落地

以 Java 服務為例,容器的資源限制通過 CGroup 來實現(xiàn)
而容器內(nèi)部進程如果不感知 CGroup 的限制,就進行內(nèi)存,CPU 分配,則可能會導致資源沖突的問題
Java8 之前的版本無法跟 Docker 很好的配合
JVM 通過容器獲取的可用內(nèi)存和 CPU 數(shù)量并不是Docker 允許使用的可用內(nèi)存和 CPU 數(shù)量

Runtime.getRuntime().availaleProcessors()

在 1.8 版本更早的實現(xiàn),在容器內(nèi)獲取的上層物理機或者虛擬機的 CPU 核心數(shù)

另一個影響體現(xiàn)在 GC 中,JVM 垃圾對象回收對 Java 程序執(zhí)行性能有一定的影響
默認的 JVM 使用公式來計算并行 GC 的線程數(shù)
ParallelGCThreads = (ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8)
ncpus 是 JVM 發(fā)現(xiàn)的系統(tǒng)的 CPU 個數(shù)

如果 JVM 應用了錯誤的 CPU 核心數(shù)
會導致 JVM 啟動過多的 GC 線程
導致 GC 性能下降, Java 服務的延時增加

總結(jié)

分享了容器技術(shù)的發(fā)展,以 Docker 為代表的容器化技術(shù)的實現(xiàn)原理
以及大規(guī)模容器之下,微服務如何適配等問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容