Download presentation
Presentation is loading. Please wait.
1
YeahMobi中基于容器技术的运维自动化实践
Infrastructure Department Manager Chieh Chu(朱杰)
2
Agenda 面对的问题 解决问题的思路 Yeah-PaaS平台实践
3
面对的问题 快速交付 服务自动化 资源多样性 快速交付:互联网公司往往是轻测试重交付,需要快速试错来改进与提高产品质量,如何做到快速的交付产品做到唯快不破就成为首要解决的问题。包括:环境一致性,持续交付集成,快速启动,无服务中断 服务自动化:灰度发布,回滚,服务依赖,服务发现(统一对外endpoint,readiness),高可用,服务可扩展,Multi-Regions等 资源多样:可消费资源,公共配置变更,数据库,不同项目资源的反亲和性,第三方服务等
4
快速交付 线上线下环境不一致 持续交付集成困难 快速启动 上线时服务可能中断
5
自动化部署 多种策略的灰度发布 出错回滚 服务依赖 服务发现 资源与应用不同级别的服务感知 服务高可用 服务需可扩展 跨Region部署
6
线上操作多样化 可消费资源分配问题 公共配置变更 数据库变更 不同业务间资源不共享 第三方服务
7
问题解决思路 容器化环境 Leveraging Docker technical 解决快速交付问题 封装 快速 轻量 版本化管理
8
问题解决思路 服务管理 Leveraging Kubernetes technical 解决容器化部署问题 线上容器化资源池
ReplicationController解决服务高可用 Service解决服务发现以及负载均衡 Instance lifecycle 管理 Readiness(用于保留现场), Liveness(目前无restart limit), PreStop, PostStart
9
问题解决思路 服务编排 Leveraging Openstack Heat technical 解决面向应用的部署以及多样化问题 依赖 灰度
回滚 可自定义服务类型 配置更改 数据库 第三方服务 驱动容器化部署(K8s)
10
整体构架简图 App A App B Service A K8s plugin Other plugins Openstack Heat
K8s python API 3rd Services Others Sub-System Kubernetes Docker AWS Region1 IaaS AWS Region2 RS Region1 SL Region1 Ali Region1
11
应用举例 Facebook广告发布系统 内部组件间需要服务发现 组件间存在生产与消费关系,服务启动,撤销存在组件依赖
某些比较heavy的组件(生产者)启动会较耗时,这时需要保证存在依赖的服务需等该服务ready后方可部署 组件下线时,已调度的作业需执行完操作后方可结束,同时该组件不应再接受新的作业 Facebook客户级别导致的广告发布限制,导致无法进行A|B灰度 相同环境线下测试时需要自动接入Facebook的Mock API service
12
Docker的配置 Version: 1.6.2 用于设置Labels,类似于set metadata
K8s依赖这一特性:preStop, postStart, readiness Flannel: 0.3.0 配置:同K8s共用etcd 部署相对简单 同属CoreOS 评测性能小幅下降:TCP bandwidth 约10% drop
13
高可用 Private Docker Hub
14
Kubernetes的配置 Version:Self complied 0.19.1(RC) + bug fix
One container per Pod Admin setting Resource quota Total amount for namespace: kmem, cpu, # of pod/rc Limits:The limit of all Pods within the specific namespace-wide App Setting Resource limits 针对pod的mem, cpu (配置文件来指定) bug fix: Readiness失败会引起container重启
15
Kubernetes的配置
16
Kubernetes的配置 需要考虑资源与业务间的服务发现级联问题 (leverage instance lifecycle)
preStop Usecase:Graceful delete, 保证正在执行的任务完成,并不会接受新的请求,或服务主动从服务发现中清除。 postStart Usecase:识别并接入Facebook API mock Readiness 服务状态监控 组件间依赖,用于配合Heat的dependence实现类似waitcondition的功能 Liveness 类似Readiness,不过false时会重启container
17
Kubernetes的配置 安全设置 API SSL enable, token 认证,统一出口由Heat控制
Unique namespace for one product 使用的调度策略 ServiceSpread:尝试避免同构的Pod被schedule在相同的minions Packing:尝试保证相同product的Pod被schedule在一起 Anti-affinity:保证不同的product不会被schedule在相同的minions LabelSpread(计划中):保证相同属性的Pod不会被schedule在一起,i.e.:CPU/Mem/IO intensive
18
Heat相关改动 Version:Juno release 重写K8s 全功能Python API 增加K8s resource types
GoogleInc::Kubernetes::ReplicationController GoogleInc::Kubernetes::Service (Others: Scripts, DB related etc) 为每一个resource type实现下列接口 handle_create, check_create_complete handle_update, check_update_complete handle_delete, check_delete_complete
19
Heat相关改动 GoogleInc::Kubernetes::ReplicationController
GoogleInc::Kubernetes::Service
20
监控相关事项 Kubernetes 自身的页面 现有Pod,RC的信息等 cAdvisor实时数据 Heapster基于cAdvisor
加入告警项 Host level – zabbix Container – cAdveriser数据导出从而被zabbix监控
21
监控相关事项 目前接入 Zabbix ,支持自动化告警的监控项主要有: Host 告警 Ping 、 CPU 、 Memory 、 Disk
进程监控 etcd kube-apiserver/kube-scheduler/kube-controller-manager/kubelet/kube-proxy flanneld/docker heat-engine/heat-api 服务端口监控 PaaS 服务: kubernetes/heat/etcd Docker Hub 服务: registry/registry-ui/registry-proxy/heapster/influxdb
22
监控相关事项
23
Troubleshooting pod状态长期处于pending状态
kube-scheduler调度延时;kubelet启动延时;etcd bug引起,升级etcd v > v2.0.9解决 inode被耗光,主要消耗在/var/lib/docker/aufs crontab定时清除以下内容: 需要清除docker registry 清除docker images 清除已死docker container # remove exited container. docker ps -a|grep Exit|cut -d' ' -f 1|xargs docker rm # remove images as possible that has no name/tag docker images -a|grep '^<none>'|tr -s ' '|cut -d' ' -f 3|xargs docker rmi
24
Troubleshooting 删除namespace的结果
namespace下的RC被删除,所有Pod会变成pending状态,docker container正常 将该namespace重新创建之后,Pod会变成running的正常态,但RC不再了 kube 指定memory limit创建Pod失败 可能是docker不支持swap memlimit导致,需要打开grub开关
25
About me 朱杰
Similar presentations