docker网络原理及cgroup
docker網絡模式的特性?
?docker初始狀態下有三種默認的網絡模式 ,bridg(橋接),host(主機),none(無網絡設置)
網絡模式? ? ? ? ? ? ? ? ? ? ? ? ? ? ?配置? ? ? ? ? ? ? ? ? ? ? ? ?說明
host//主機模式?? ?–network host?? ?容器和宿主機共享網絡命名空間
container//容器模式?? ?–network container:容器的id或者名字?? ?容器與指定的容器共享網絡命名空間
none//無網絡模式?? ?–network none?? ?容器擁有獨自的網絡命名空間,但是沒有任何設置
bridge//橋接模式?? ?–network bridge?? ?容器擁有獨自的網絡命名空間,且擁有獨立的IP,端口,路由等,使用veth pair 連接docker0 網橋,并以docker0網橋為網關
host主機模式
相當于Vmware中的橋接模式,與宿主機在同一個網絡中,但沒有獨立IP地址。Docker使用了Linux的Namespaces技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離 文件系統,Network Namespace隔離網絡等。一個Network Namespace提供了一份獨立的網絡環境,包括網卡、路由、iptable規則等都與其他的Network Namespacel隔離。一個Docker容器一 般會分配一個獨立的Network. Namespace。
但如果啟動容器的時候使用host模式, 那么這個容器將不會獲得一 個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。 容器將不會虛擬出自己的網卡、配置自己的IP等,而是使用宿主機的IP和端口。
容器和宿主機共享網絡命名空間,但沒有獨立IP地址,使用宿主機的IP地址,和宿主機共享端口范圍,例如宿主機使用了80端口,那么容器不能使用80端口。這種模式比較方便,但不安全。?
?container模式
在理解了host模式后,這個模式也就好理解了。這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。 新創建的容器不會創建自己的網卡,配置自己的Ie,而是和一個指定的容器共享re、端口范圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。
?none模式
使用none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網絡配置。也就是說,這個locker容器沒有網卡、iP、路由等信息。這種網絡模式下容器只有lo回環網絡,沒有其他網卡、這種類型的網絡沒有辦法聯網,封閉的網絡能很好的保證容器的安全性。
?bridge 橋接模式
?bridge模式是docker的默認網絡模式,不用--net參數,就是bridge模式。
相當于Vmware中的 nat模式,容器使用獨立.network Namespace,并連接到docker)虛擬網卡。通過dockerO網橋以及iptables
nat表配置與宿主機通信,此模式會為每一個容器分配hetwork Mamespace、設置等,并將一個主機上的 Docker容器連接到一個虛擬網橋上。
?(1)當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的Dokcer容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。
(2)從docker0子網中分配一個IP給容器使用,并設置dockerO的I地址為容器的默認網關。在主機上創建一對虛擬網卡veth pair設備。veth設備總是成對出現的,它們組成了一個數據的通道,數據從一個設備進入,就會從另一個設備出來、因此,veth設備常用來連接兩個網絡設備。
(3 ) Docker將 veth pair 設備的一端放在新創建的容器中,并命名為eth0(容器的網卡),另一端放在主機中,以veth*這樣類似的名字命名,并將這個網絡設備加入到docker0網橋中。可以通過 brctl show命令查看。
(4) 使用docker run -p 時,docker實際是在iptables做了DNAT規則,實現端口轉發功能??梢允褂胕ptables -t nat -vnL查看。
Docker容器的資源控制
?Docker通過Cgroup 來控制容器使用的資源配額,包括CPU、內存、磁盤三大方面,基本覆蓋了常見的資源配額和使用量控制。Caroup 是ControlGroups的縮寫,是Linux 內核提供的一種可以限制、記錄、隔離進程組所使用的物理資源(如 cpu、內存、磁盤,io等等)的機制,被LXC、docker等很多項目用于實現進程資源控制。Cgroup本身是提供將進程進行分組化管理的功能和接口的基礎結構,I/O或內存的分配控制等具體的資源管理是通過該功能來實現的。
cgroups,是一個非常強大的 linux 內核工具,他不僅可以限制被 namespace 隔離起來的資源,還可以為資源設置權重、計算使用量、操控進程啟停等等。所以 cgroups(Control groups)實現了對資源的配額和度量。
cgroups 有四大功能
資源限制:可以對任務使用的資源總額進行限制
優先級分配:通過分配的 cpu 時間片數量以及磁盤 IO 帶寬大小,實際上相當于控制了任務運行優先級
資源統計:可以統計系統的資源使用量,如 cpu 時長,內存用量等
任務控制:cgroup 可以對任務執行掛起、恢復等操作
cpu的使用率上限?
?Linux通過CFS (Completely Fair Scheduler,完全公平調度器)來調度各個進程對ceu的使用。CFS默認的調度周期是100ms 。我們可以設置每個容器進程的調度周期,以及在這個周期內各個容器最多能使用多少CPU時間。
cgroups實現方式及工作原理
在對cgroups規則和自通有一定了解以后,下面簡單介紹操作系統內核級別上cgroups的工作原理,希望能有助于讀者理解cgroups如何對Docker容器中的進程產生作用。
cgroups的實現本質上是給任務掛上鉤子,當任務運行的過程中涉及某種資源時,就會觸發鉤子上所附帶的子系統進行檢測,根據資源列別不同,使用對應的技術進行資源限制和優先級分配。
cgroups如何判斷資源超限及超出限額后的措施
對于不同的系統資源,cgroups提供了統一的接口對資源進行控制和統計,但限制的具體方式則不盡相同。比如memorary子系統,會描述內存狀態的“mm_struct”結構體中記錄它所屬的cgroup,當進程需要申請更多內存時,就會觸發cgroup用量檢測,用量超過cgroup規定的限額,則拒絕用戶的內存申請,否則就給予相應內存并在cgroup的統計信息中記錄。實際實現要比上述描述復雜的多,不僅需要考慮內存的分配和回收,還需要考慮不同類型的內存如cache和swap等。
進程所需的內存超過它所屬的cgroup最大限額以后,如果設置了OOM Control(內存超限控制),那么進程就會收到OOM信號并結束;否則進程就會被掛起,進入睡眠狀態,進入睡眠狀態,直到cgroup中其他進程釋放了足夠的內存資源為止。Docker中默認是開啟OOM Control的。其他子系統的實現與此類似,cgroups提供了多種資源限制的策略供用戶選擇。
cgroup與任務之間的關聯關系
實現上,cgroup與任務之間是多對多關系,所以它們并不直接關聯,而是通過一個中間結構把雙向的關聯信息記錄起來。每個任務結構體tsak_struct中都包含了一個指針,可以查到對應的cgroup的情況,同時也可以查詢到各個子系統的狀態,這些子系統狀態中也包含了找到任務的指針,不同類型的子系統按需定義本身的控制信息結構體,最終在地定義的結構體中吧子系統狀態指針包含進去,然后內核通過container_of(這個宏可以通過一個結構體的成員找到結構體自身)等宏定義來獲取對應的結構體,關聯到任務,從此達到資源限制的目的。同時,為了讓cgroups便于用戶理解和使用,也為了用精簡的內核代買為cgroup提供熟悉的權限和命名空間管理,內核開發者們按照Linux虛擬文件轉化器(Virtual Filesystem Switch,VFS)接口實現了一套名為cgroup的文件系統,非常巧的用來表示cgroups的層級概念,把各個子系統的實現都瘋撞到文件系統的各項操作中。
Docker在使用cgroup時的注意事項
在實際使用過程中,Docker需要通過掛載cgroup文件系統新建一個層級結構,掛載時指定要綁定的子系統。把cgroup文件系統掛載上以后,就可以像操作文件一樣對cgroup的層級進行瀏覽和操作管理(包括權限管理、子文件管理等)。除了cgroup文件系統以外,內核沒有為cgroups的訪問和操作添加任何系統調用。
/sys/fs/cgroup/cpu/docker/下文件的作用
前面已經說過,以資源開頭的文件都是用來限制這個cgroup下任務的可用配置文件。
一個cgroup創建完成,不管綁定了何種子系統,其目錄下都會生成以下幾個文件,用來描述cgroup的相應信息。同樣,把相應信息寫入這些配置文件中就可以生效。
本文由淺入深的講解了cgroups,從cgroups是什么,到cgroups要怎么用,最后對大量的cgroup子系統進行了講解。可以看到內核對cgroups的支持已經較多,但是依舊有許多工作要完善。如網絡方面目前通過TC(Traffic Controller)來控制,未來需要統一整合;由縣級調度方面依舊有很大的改進空間。
? ? ? CPU資源的控制也有兩種策略,
一種是完全公平調度 (CFS:Completely Fair Scheduler)策略,提供了限額和按比例分配兩種方式進行資源控制;
另一種是實時調度(Real-Time Scheduler)策略,針對實時進程按周期分配固定的運行時間。配置時間都以微秒(μs)為單位,文件名中用us表示。
? ? ? CFS調度策略下的配置
設定CPU使用周期使用時間上限
cpu.cfs_period_us:設定周期時間,必須與cfs_quota_us配合使用。
cpu.cfs_quota_us :設定周期內最多可使用的時間。這里的配置指task對單個cpu的使用上限,若cfs_quota_us是cfs_period_us的兩倍,就表示在兩個核上完全使用。數值范圍為1000 - 1000,000(微秒)。
cpu.stat:統計信息,包含nr_periods(表示經歷了幾個cfs_period_us周期)、nr_throttled(表示task被限制的次數)及throttled_time(表示task被限制的總時長)。
按權重比例設定CPU的分配
cpu.shares:設定一個整數(必須大于等于2)表示相對權重,最后除以權重總和算出相對比例,按比例分配CPU時間。(如cgroup A設置100,cgroup B設置300,那么cgroup A中的task運行25%的CPU時間。對于一個4核CPU的系統來說,cgroup A 中的task可以100%占有某一個CPU,這個比例是相對整體的一個值。)
? ? ? ? RT調度策略下的配置 實時調度策略與公平調度策略中的按周期分配時間的方法類似,也是在周期內分配一個固定的運行時間。
cpu.rt_period_us :設定周期時間。
cpu.rt_runtime_us:設定周期中的運行時間。
cpuacct資源報告
? ? 這個子系統的配置是cpu子系統的補充,提供CPU資源用量的統計,時間單位都是納秒。
cpuacct.usage:統計cgroup中所有task的cpu使用時長
cpuacct.stat:統計cgroup中所有task的用戶態和內核態分別使用cpu的時長
cpuacct.usage_percpu:統計cgroup中所有task使用每個cpu的時長
cpuset
? ? ?為task分配獨立CPU資源的子系統,參數較多,這里只選講兩個必須配置的參數,同時Docker中目前也只用到這兩個。
cpuset.cpus:可使用的CPU編號,如0-2,16代表 0、1、2和16這4個CPU
cpuset.mems:與CPU類似,表示cgroup可使用的memory node,格式同上,NUMA系統使用
device ( 限制task對device的使用)
? ? ?設備黑/白名單過濾
devices.allow:允許名單,語法type device_types:node_numbers access type ;type有三種類型:b(塊設備)、c(字符設備)、a(全部設備);access也有三種方式:r(讀)、w(寫)、m(創建)
devices.deny:禁止名單,語法格式同上
? ? 統計報告
? devices.list:報???告???為???這???個??? cgroup 中???的?task設???定???訪???問???控???制???的???設???備
freezer - 暫停/恢復cgroup中的task
? ? ? 只有一個屬性,表示進程的狀態,把task放到freezer所在的cgroup,再把state改為FROZEN,就可以暫停進程。不允許在cgroup處于FROZEN狀態時加入進程。freezer.state 包括如下三種狀態:
- FROZEN 停止
- FREEZING 正在停止,這個是只讀狀態,不能寫入這個值。
- THAWED 恢復
memory (內存資源管理)
memory.limit_bytes:強制限制最大內存使用量,單位有k、m、g三種,填-1則代表無限制
memory.soft_limit_bytes:軟限制,只有比強制限制設置的值小時才有意義
memory.memsw.limit_bytes:設定最大內存與swap區內存之和的用量限制
memory.oom_control: 0表示開啟,當cgroup中的進程使用資源超過界限時立即殺死進程。默認包含memory子系統的cgroup都啟用。當oom_control不啟用時,實際使用內存超過界限時進程會被暫停直到有空閑的內存資源
? ? ?統計
memory.usage_bytes:報???告???該??? cgroup中???進???程???使???用???的???當???前???總???內???存???用???量(以字節為單位)
memory.max_usage_bytes:報???告???該??? cgroup 中???進???程???使???用???的???最???大???內???存???用???量
memory.failcnt:報???告???內???存???達???到???在??? memory.limit_in_bytes設???定???的???限???制???值???的???次???數???
memory.stat:包含大量的內存統計數據。
cache:頁???緩???存???,包???括??? tmpfs(shmem),單位為字節。
rss:匿???名???和??? swap 緩???存???,不???包???括??? tmpfs(shmem),單位為字節。
mapped_file:memory-mapped 映???射???的???文???件???大???小???,包???括??? tmpfs(shmem),單???位???為???字???節???
pgpgin:存???入???內???存???中???的???頁???數???
pgpgout:從???內???存???中???讀???出???的???頁???數
swap:swap 用???量???,單???位???為???字???節???
active_anon:在???活???躍???的???最???近???最???少???使???用???(least-recently-used,LRU)列???表???中???的???匿???名???和??? swap 緩???存???,包???括??? tmpfs(shmem),單???位???為???字???節???
inactive_anon:不???活???躍???的??? LRU 列???表???中???的???匿???名???和??? swap 緩???存???,包???括??? tmpfs(shmem),單???位???為???字???節
active_file:活???躍??? LRU 列???表???中???的??? file-backed 內???存???,以???字???節???為???單???位
inactive_file:不???活???躍??? LRU 列???表???中???的??? file-backed 內???存???,以???字???節???為???單???位
unevictable:無???法???再???生???的???內???存???,以???字???節???為???單???位???
hierarchical_memory_limit:包???含??? memory cgroup 的???層???級???的???內???存???限???制???,單???位???為???字???節???
hierarchical_memsw_limit:包???含??? memory cgroup 的???層???級???的???內???存???加??? swap 限???制???,單???位???為???字???節???
Docker: 限制容器可用的 CPU
? ? ? 通過 --cpus 選項指定容器可以使用的 CPU 個數,這個還是默認設置了cpu.cfs_period_us(100000)和cpu.cfs_quota_us(200000)
實驗:
docker run -itd --name c1 centos:7 /bin/bash
docker ps -a
cd /sys/fs/cgroup/cpu/docker/容器的ID號/
cat cpu.cfs_quota_us ? #默認情況是-1,表示不限額
cat cpu.cfs_period_us ? #默認情況是100000
?docker ps -a
docker exec -it c1 bash
vi /cpu.sh
#!/bin/bash
i=0
while true
do
let i++;
done
chmod +x /cpu.sh ./cpu.sh
?
————————————————
版權聲明:本文為CSDN博主「FYR@」的原創文章
原文鏈接:https://blog.csdn.net/FYR1018/article/details/125603891
本文為CSDN博主「張忠琳」的原創文章,遵循CC 4.0 BY-SA版權協議,
原文鏈接:https://blog.csdn.net/zhonglinzhang/article/details/64905759
本文為CSDN博主「站在這別動,我去給你買橘子」的原創文章
原文鏈接:https://blog.csdn.net/qq_62462797/article/details/127975686
總結
以上是生活随笔為你收集整理的docker网络原理及cgroup的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028全球及中国健康资讯交换
- 下一篇: 火箭双杀尼克斯 哈林组合和砍50分