在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链接