5-基于Kubernetes打造SAE容器云
目前SAE基于请求的架构
• 优点
- 进程内隔离,消耗资源最⼩
- ⽆感扩容&缩容,⽤户⽆成本
- Health&Redispatch,升级切换⽆成本
• 缺点
- ⽆法提供独⽴的namespace
- ⽆法Build&Ship&Run
⽤户的需求
• ⾯对代码 vs ⾯向容器
• 定义⼀切
• run anywhere
• ⽆感扩容/缩容
为什么选择Kubernetes
• Pod
• Replication
• Go
• Easy for CentOS6
为什么要改进Kubernetes
• 不⾜之处:
- ⽆感扩容
- 监控
• 不适合SAE之处:
- Kube-Proxy&VIP
- Etcd
改进Kubernetes
• ⽇志系统
• 接⼊SAE Load Balance
• LoadBalance抗CC攻击压⼒对⽐
• PaaS SDN和IaaS SDN的区别
• 网络隔离
- NAT
- Bridge(更主流)
• 我们选择NAT
- NAT提速
• Simple Docker Network
• 内外网流量分开
• Simple Docker Network
• L3 tag
• Simple Docker Network
• 植⼊Tenant ID
• Simple Docker Network
SAE容器云
• 功能:
- 镜像仓库
- BuildPkg
- ⽆感扩容
- 共享存储
• 正式发布!
6-腾讯GAIA平台DOCKER实践
GAIA平台
Gaia平台是腾讯数据平台部的底层资源管理和调度系统,其上层业务包括离线、实时以及在线service服务,最大单集群规模达8800台、并发资源池个数达2500个,服务于腾讯所有事业群。
2014年10月份正式上线对Docker类型作业的支持,通过Docker将Gaia云平台以更好用的方式呈现给各个业务。目前已经支持腾讯内部的游戏云、广点通、GPU深度学习等Docker业务。
GAIA架构
Gaia系统Master节点RM/NM/AM/Docker均无单点故障,可进行热升级。Gaia也为用户的App提供了本地重试和跨机迁移两种容灾方式。
机器资源CPU、内存、网络带宽、GPU、磁盘空间的隔离都是弹性管理的。
最大化的利用集群的所有资源,在保证用户最低资源使用量的同时,在集群有空闲资源时还能借集群的空闲资源使用。
自研调度SFair,解决了调度器效率和扩展性问题,每秒可调度4k个实例。
Docker热升级功能
DOCKER DAEMON单点问题
Docker daemon本身是个单点,并且在退出时会杀掉所有container,对于在线服务完全不可接受。
Docker坑太多,比如1.6.x版本
Docker stats crashed docker daemon https://github.com/docker/docker/pull/13906
Docker exec未同步导致docker crash https://github.com/docker/docker/pull/14899
Docker缓存container的stdout/stderr过大导致OOM问题https://github.com/docker/docker/issues/9139
DOCKER热升级功能设计
Docker daemon停止时主动杀掉所有container,主要受限于
用户进程是daemon的子进程
IO流经过daemon缓存
原来的两层进程父子关系变为三层,monitor由goroutine改为进程,由它等待container运行结束
Docker重启时,monitor孤儿进程托管给init进程,container不受任何影响
Docker重启后恢复所有Container状态
DOCKER CRASH不影响DOCKER WAIT
1、客户端向daemon发送wait请求POST/containers/1b9ba1/wait
2、daemon回复HTTP重定向code 305,并返回monitor进程监听地址Location:http://daemon_ip:port
3、客户端向monitor发送wait请求POST/containers/1b9ba1/wait
4、monitor进程等待container进程结束
5、container结束时返回,monitor进程返回wait请求的HTTP response
即使daemon挂掉,客户端wait请求不受影响,消除对Gaia等上层调度系统的影响
DOCKER热升级功能实现
Docker daemon增加-hot-restart参数,monitor代码接口化,支持goroutine和外部进程两种方式;
container启动和结束时,monitor先将启动和结束事件持久化到磁盘,再通知daemon更新container状态。daemon重启后从磁盘加载container状态迁移文件;
部分Daemon API接口,如attach/wait等,重定向给monitor进程处理;
网络状态,比如libnetwork CNM模型的network/endpoint/sandbox状态按网络模式类型在global和local KV store中分别存储,libkv提供统一接口,屏蔽global/local等KV存储的API差异;
我们为libnetwork引入了localstore功能,https://github.com/docker/libnetwork/pull/466,存储bridge网络模式状态或者sandbox等其他本地状态数据。
Docker网络模式扩展
DOCKER⽹络模式
⽤户对⽹络的需求
固定IP⽹络模式
SR-IOV技术
DOCKER OVERLAY ⽹络使⽤
Container数据存储问题
Container迁移后不需要保留的数据,使用host volume存储
Container迁移后需要保留的数据,使用Ceph RBD存储
使用Ceph volume plugin为每个container分配一个RBD存储目录