使用kubernetes1.0构建CaaS
Posted 网易云基础服务
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用kubernetes1.0构建CaaS相关的知识,希望对你有一定的参考价值。
10月25日,网易资深开发工程师方应受邀参加DockOne社区举办的沙龙活动,并带去《使用kubernetes1.0构建CaaS》的技术分享,以下是PPT内容摘要。
使用kubernetes1.0构建CaaS
作者介绍:方应
网易杭州研究院资深开发工程师,有多年linux内核经验,对系统、网络、存储等有深刻了解。从LXC开始研究容器技术,对其有比较深入的了解,现致力于网易蜂巢的研发。
Master:
apiserver
controller
scheduler
Node:
kubelet(cadvisor)
proxy
Other:
heasper
influxdb
skyDNS
1Apiserver
职责
1.处理api请求
2.用户验证和授权
3.资源验证
4.创建各种资源
5.数据持久化,写etcd
Apiserver实践
安全
1.认证:密码、token、证书
2.授权:ABAC模式
生成证书推荐使用easyrsa工具:
https://github.com/kubernetes/kubernetes/blob/master/cluster/saltbase/salt/generate-cert/make-ca-cert.sh
原生支持通过配置文件配置token的方式来认证,以及配置授权文件,缺点是不能动态生效。
网易蜂巢系统中采用了iaas层的keystone。
资源
资源限制分为几个层次namespace:ResourceQuota,pod和container:limitRange。
serviceAccount通过服务端配置的私钥来生成的用于访问kubernetes服务的token,本质是一个secrets,secret安全性比直接存在文件系统中要好。
蜂巢在实际中也采用了secret特性。
2Controller
职责
1.管理endpoint
2.管理rc
3.管理node,维护健康状态
4.管理namespace
5.为pod调度volume
6.生成serviceAccount token
3Scheduler
职责
调度每一个新创建的pod
算法
针对每一个等待调度的pod,分为两个步骤来决定调度到那个node
方法:轮询每个node
1.可不可以调度
2.合不合适调度
集群部署实践
集群
Kubernetes目前只能叫做高可靠,通常的做法是部署多套(每一套apiserver、controller、scheduler位于同一台机器),通过一个HA来进行切换,同时只有一套是处于服务状态中,etcd推荐采用集群部署。
集群
如果集群使用https,而且希望通过证书来和客户端进行双向认证,apiserver前端可以使用haproxy进行透传。
官方的切换脚本有个小问题,在实际使用中,如果apiserver挂掉不能够正确的切换。
这种HA的方式在性能方面显得有些局促,apiserver和scheduler都不能进行水平扩展。
4Node/Kubelet
职责
1.管理pod生命周期
2.管理pod所需volume
3.汇报node健康状态
4.收集pod运行数据
5.资源回收(containers、images)
6.管理pod所需资源
5Node/kube-proxy
职责
通过apiserver监听endpoint变更,根据endpoint修改iptables、启动代理线程,将数据流量导入pod。
存储实践
除了高可靠,在实际使用docker中,存储、网络、日志、灰度发布、快速扩容等也受到广泛关注。
存储
Kubernetes在存储方面提供了多种选择,gce、aws、iscsi等,使用这些volume可以通过PersistentVolume(pv)、和PersistentVolumeClaim(pvc)来实现。
网易蜂巢在kubernetes中集成了网易NBS(云存储),容器则全部运行在SSD上,同时支持挂载基于SSD的云存储。
网络实践
Kube-proxy
Kube-proxy实际是一个代理,为每一个service创建一个线程,通过iptables将访问服务ip的流量导入这个线程,由其转发至pod。
如果多个pod在同一个node上,会采用简单的轮询。Kube-proxy在规模大的时候会有性能问题。可以考虑使用haproxy或者其他负载均衡产品。社区也在考虑全用iptables来实现流量转发。
其他实践
日志
Kubernetes支持flutend到处日志。每个container的日志,kubernetes存储在/var/log/containers下。
如果已经有日志系统,可以通过每个node上运行一个日志收集agent从本地磁盘导出日志。
Kubernetes1.1版本中,引入了新的特性damone,可以在每一个node上创建一个类似的守护进程(pod)。
灰度发布
Kubernetes rollingUpdate可以直接实现灰度发布,失败回滚。其本质是通过两个rc,一个控制旧版本,一个控制新版本,进行乒乓似的减少旧版本的实例,减少新版本的实例。
Kubernetes的label特性也很容易将故障pod下线然后进行故障诊断。同时也能让新旧版本共存进行新版本的检验。
服务发现
根据不同用户的习惯,可以采用不同的方法。Kubernetes本身提供skyDNS来替代老的环境变量让pod内部可以轻易访问到需要的服务。
一些老的系统可能基于有基于其他的一些服务发现机制。进行系统迁移是也可通过一定的策略避免较大的改动
蜂巢提供两种容器使用方式。为其中一种容器分配外网ip,提供ssh,可以进行镜像调优,并支持commit操作。容器故障退出后会自动恢复至上次commit时的环境,其所使用的云存储也会随容器自动迁移。
Kubernetes对于pod级别的快速扩容可以轻松实现,通过rc就可以快速地动态调整业务容器的数量。
但是对于node资源的扩容,需要依赖用户已有的根底。
蜂巢基于原有iaas,采用了多级资源池,能快速的响应用户突发的快速扩容。
Kubernetes目前的架构下,根据官方数据能够支撑100个node,3000个pod。现有系统有很多值得优化的地方。
1.Go语言层面的
2.调度器的轮询机制
3.Master组件的单主模式
4.资源定义数据结构庞大,网络通讯开销较大
蜂巢的实践
蜂巢基于网易IaaS平台,整合了部分后端服务,采用全SSD,万兆网络,灰度发布,提供负载均衡,高性能数据库服务。
(点击可看大图)
点击左下角“阅读原文”即可进入蜂巢官网,目前可以申请免费体验名额!
一些问题:
1.Rc label重复导致乒乓而死锁
2.直接delete 掉node节点,运行在其上的pod并没有在其他地方重新调度
3.Apiserver在etcd脑裂后不能正常切换
1.调度器在批量的时候会产生延时
2.Master单主
3.水平扩展
以上是方应《使用kubernetes1.0构建CaaS》的PPT内容,具体细节请听25日精彩分享,感谢您的关注。点击左下角“阅读原文”即可进入蜂巢官网,目前可以申请免费体验名额!
关注“网易云”了解动态
获取云计算技术干货
以上是关于使用kubernetes1.0构建CaaS的主要内容,如果未能解决你的问题,请参考以下文章