在https://segmentfault.com/a/11... 容器,隔離,雲的概述。這篇對其中用途普遍的docker,k8s作詳細介紹,並給出雲搭建的生態環境體系。mysql
容器發展,詳見上面提到的文章linux
chroot | 1979 |
Linux Vserver | 2001 |
process container | 2006 |
LXC | 2008 |
Docker | 2013 |
windows container | 2017 |
典型圖:VM與container對比,差別在於OSgit
VM | container | |
隔離 | OS | kernel namespace |
可配額,可度量 | 硬件頁映射 | cgroups |
移動性 | snapshot,image | AUFS |
安全 | gresc patch |
缺點github
隔離性相比KVM之類的虛擬化方案仍是有些欠缺,全部container公用一部分的運行庫 網絡管理相對簡單,主要是基於namespace隔離 cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(因此dotcloud主要是安內存收費) docker對disk的管理比較有限(disk quota) container隨着用戶進程的中止而銷燬,container中的log等用戶數據不便收集
優勢:sql
輕量級的特色,其啓動快,並且docker可以只加載每一個container變化的部分,這樣資源佔用小 docker不僅是容器,高級容器引擎,應用部署平臺,應用鏡像商店
libcontainer
Docker架構中一個使用Go語言設計實現的庫,設計初衷是但願該庫能夠不依靠任何依賴,直接訪問內核中與容器相關的API。
正是因爲libcontainer的存在,Docker能夠直接調用libcontainer,而最終操縱容器的namespace、cgroups、apparmor、網絡設備以及防火牆規則等。這一系列操做的完成都不須要依賴LXC或者其餘包。
libcontainer提供了一整套標準的接口來知足上層對容器管理的需求。docker
docker run過程 (1) Docker Client接受docker run命令,解析完請求以及收集完請求參數以後,發送一個HTTP請求給Docker Server,HTTP請求方法爲POST,請求URL爲/containers/create? +xxx; (2) Docker Server接受以上HTTP請求,並交給mux.Router,mux.Router經過URL以及請求方法來肯定執行該請求的具體handler; (3) mux.Router將請求路由分發至相應的handler,具體爲PostContainersCreate; (4) 在PostImageCreate這個handler之中,一個名爲"create"的job被建立,並開始讓該job運行; (5) 名爲"create"的job在運行過程當中,執行Container.Create操做,該操做須要獲取容器鏡像來爲Docker容器建立rootfs,即調用graphdriver; (6) graphdriver從Graph中獲取建立Docker容器rootfs所須要的全部的鏡像; (7) graphdriver將rootfs全部鏡像,加載安裝至Docker容器指定的文件目錄下; (8) 若以上操做所有正常執行,沒有返回錯誤或異常,則Docker Client收到Docker Server返回狀態以後,發起第二次HTTP請求。請求方法爲"POST",請求URL爲"/containers/"+container_ID+"/start"; (9) Docker Server接受以上HTTP請求,並交給mux.Router,mux.Router經過URL以及請求方法來肯定執行該請求的具體handler; (10) mux.Router將請求路由分發至相應的handler,具體爲PostContainersStart; (11) 在PostContainersStart這個handler之中,名爲"start"的job被建立,並開始執行; (12) 名爲"start"的job執行完初步的配置工做後,開始配置與建立網絡環境,調用networkdriver; (13) networkdriver須要爲指定的Docker容器建立網絡接口設備,併爲其分配IP,port,以及設置防火牆規則,相應的操做轉交至libcontainer中的netlink包來完成; (14) netlink完成Docker容器的網絡環境配置與建立; (15) 返回至名爲"start"的job,執行完一些輔助性操做後,job開始執行用戶指令,調用execdriver; (16) execdriver被調用,初始化Docker容器內部的運行環境,如命名空間,資源控制與隔離,以及用戶命令的執行,相應的操做轉交至libcontainer來完成; (17) libcontainer被調用,完成Docker容器內部的運行環境初始化,並最終執行用戶要求啓動的命令。
一、進程命名空間:每一個命名空間獨立維護本身的進程號,父子關係結構,子空間的進程對父空間是可見的,新fork出的進程 在父命名空間和子命名空間都會生成一個進程號
二、網絡命名空間:實現網絡隔離 徹底獨立的網絡協議視圖,包括網絡設備接口、IPV4 IPV6協議棧,路由表,防火牆規則,sockers等,採用虛擬網絡設備,將容器中的虛擬網卡綁定在本地主機的docker0的網橋上
三、ipc命名空間 進程間交互,信號量、消息隊列,和共享內存,同一個IPC空間的能夠交互,不一樣的不能夠
四、掛載命名空間 相似chroot, 將一個進程放到一個特定的目錄執行。容許不一樣命名空間的進程看到的文件結構不一樣,文件目錄被隔離 chroot(PATH)這個function必須具備 root的身份才能執行,執行後會將根目錄切換到PATH 所指定的地方。
五、 UTS命名空間 UNIX Time-sharing System 容許每一個容器擁有獨立的主機名和域名,默認主機名爲容器ID
六、用戶命名空間 每一個容器能夠有不一樣的用戶和組id,能夠在容器內使用特定的內部用戶執行程序。每一個容器都有root帳號數據庫
1.cpu,io,mem等等:cgroups
2.網卡
docker建立容器的過程:
一、建立一對虛擬接口 veth pair ,分別放在本地主機和新容器的命名空間中
二、本地主機一端的虛擬接口 鏈接到默認的docker0網橋上,或指定網橋,並具備一個veth開頭的惟一名字
三、容器一端的虛擬接口,放到新的容器中,修更名字爲eth0,只在容器中可見
四、從網橋可用地址中 分配一個空閒的給 eth0,(172.17.0.2/16) 並設置默認路由網卡爲 docker0的ip (172.17.42.1/16)
Veth pair 是一對虛擬網卡,從一張veth網卡發出的數據包能夠直接到達它的peer veth,二者之間存在着虛擬鏈路。不一樣網絡命名空間之間交互
Veth 網卡和常規的以太網區別僅在於xmit接口:將數據發送到其peer,觸發peer的Rx 過程。
3.disk/network quota
雖然cgroup提供IOPS之類的限制機制,可是從限制用戶能使用的磁盤大小和網絡帶寬上仍是很是有限的。
Disk/network的quota如今有兩種思路:
1).經過docker run -v命令將外部存儲mount到container的目錄下,quota從Host方向限制,在device mapper driver中更採用實際的device所以更好控制。
2).經過使用disk quota來限制AUFS的可操做文件大小。維護一個UID池,每次建立container都從中取一個user name, 在container裏和Host上用這個username建立用戶,在Host上用set quota限制該username的UID的disk. 網絡上因爲docker採用veth的方式,能夠採用tc來控制host上的veth的設備。segmentfault
REDHAT實現AFUS
的driver(RHEL DEVIDE MAPPER)windows
用戶每次向Git服務器的push提交都會通知給Jenkins(基於Java開發的一種持續集成工具),Jenkins觸發build。Maven(是一個採用Java編寫的開源項目管理工具,咱們最經常使用的就是該工具的構建功能)構建全部的相關代碼,包括Docker鏡像。
Maven會把完成的鏡像推送到私有的Registry保存
最後Jenkins會觸發Docker Registry pull下載鏡像到宿主機本地,並自動啓動應用容器。後端
k8s是一個容器集羣管理系統,其提供應用部署、維護、 擴展機制等功能,利用 Kubernetes 能方便地管理跨機器運行容器化的應用。其架構圖以下:
Minion Registry 負責跟蹤 Kubernetes 集羣中有多少 Minion(Host):能夠對 Minion Registry Create、Get、List、Delete
Pod Registry 負責跟蹤 Kubernetes 集羣中有多少 Pod 在運行,以及這些 Pod 跟 Minion 是如何的映射關係,對 Pod 進行 Create、Get、List、Update、Delete 操做。
……
Endpoints Registry 負責收集 Service 的 endpoint,好比 Name:"mysql",Endpoints: ["10.10.1.1:1909","10.10.2.2:8834"],Create、Get、List、Update、Delete 以及 watch
Binding Registry 綁定的 Pod 被綁定到一個 host
Scheduler 收集和分析當前 Kubernetes 集羣中全部 Minion 節點的資源 (內存、CPU) 負載狀況,而後依此分發新建的 Pod 到 Kubernetes 集羣中可用的節點
交互:
http://tiewei.github.io/cloud...
公司雲架構圖:
小的放ceph,大的物理機映射=>網絡抖動全換成本地磁盤(不管日誌仍是數據,數據須要單獨遷移,兩種方案均可以)
docker的虛擬網絡不少種實現,原生或者插件,通常原生的overlay用的較多
sdn overlay網絡 穩定性差(ip不受限制,所以漂移也不受限制) =》物理網絡(ip受限於tor[交換機]的網絡分配,ip只能tor切換,擴容後資源不均衡)
流量到LB後,若採起sdn,會到sdn中心節點,虛擬ip和物理ip的映射,找到物理ip的宿主機器,宿主機器經過overlay與docker通訊
若物理網絡,直接到docker,docker的ip就是分配的物理ip。漂移受tor的影響指的是在ip不變的狀況下漂移。ip變化會致使日誌等問題
2.跨主機overlay
Docerk overlay 網絡須要一個 key-value 數據庫用於保存網絡狀態信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 軟件,咱們這裏使用 Consul。
不一樣host:基於VxLAN。VxLAN 可將二層數據封裝到 UDP 進行傳輸,VxLAN 提供與 VLAN 相同的以太網二層服務,可是擁有更強的擴展性和靈活性。
外網:爲每一個建立了eth1能夠鏈接外網。其過程和bridge的docker0訪問外網同樣
host內部 br0仍是直接endpoint鏈接着,另外加了一個vxlan設備,與其餘host鏈接